传统图像处理之膨胀腐蚀

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。

一、参考资料

【Opencv入门到项目实战】(三):图像腐蚀与膨胀操作

二、膨胀与腐蚀

膨胀与腐蚀操作是图像处理中常用的一种形态学操作。

1. 腐蚀

1.1 腐蚀的概念

通常,腐蚀操作用于去除图像中的噪声、分割连通区域、减小目标物体的尺寸等。

简单记忆:铁块被硫酸腐蚀之后,外层的铁锈消失,且铁块变小

1.2 腐蚀的原理

腐蚀操作的原理是,在给定的结构元素(kernel滤波器)下,遍历图像的每个像素,并将其值替换为该像素周围邻域内像素的最小值。结构元素控制了腐蚀的邻域范围和形状。邻域内的任何一个像素为黑色(0),则中心像素也将被置为黑色(0)。

1.3 cv2.erode()

cv2.erode(src, kernel, iterations)

参数解释

  • src:输入的二值图像,通常为单通道灰度图像
  • kernel:腐蚀操作的结构元素,用于定义腐蚀的邻域大小和形状。可以使用 cv2.getStructuringElement() 函数创建不同形状的结构元素。
  • iterations:腐蚀操作的迭代次数,表示应用腐蚀的重复次数。

1.4 代码示例

查看原图

img = cv2.imread('JOJO.png')

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

单次腐蚀操作

# 创建结构元素 (3x3 方框形)
kernel = np.ones((3, 3), dtype=np.uint8)

# 执行腐蚀操作
eroded = cv2.erode(img, kernel, iterations=1)

# 显示结果
cv2.imshow('Eroded Image', eroded)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

多次腐蚀操作

更改iterations的值,来增加迭代次数,迭代次数越多,腐蚀效果越明显。

erosion_1 = cv2.erode(img,kernel,iterations = 1)#1次迭代
erosion_2 = cv2.erode(img,kernel,iterations = 2)#2次迭代
erosion_3 = cv2.erode(img,kernel,iterations = 3)#3次迭代
res = np.hstack((erosion_1,erosion_2,erosion_3))#水平堆砌
# 显示结果
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

1.5 总结

从上述实验对比可知,腐蚀操作会减少图像信息,可以达到去噪的效果。具体表现为:字母周围的斜线变得很浅,字母大小变细,经过多次腐蚀之后,字母四周的斜线消失。

2. 膨胀

2.1 问题引入

在腐蚀操作中,消除噪声的同时,有价值的信息也减少了。因此我们希望将这些有价值的信息增大,可以通过膨胀操作,则膨胀是腐蚀的逆操作。

2.2 cv2.dilate()

cv2.erode(src, kernel, iterations)

参数解释

  • src:输入的二值图像,通常为单通道灰度图像
  • kernel:膨胀操作的结构元素,用于定义膨胀的邻域大小和形状。可以使用 cv2.getStructuringElement() 函数创建不同形状的结构元素。常见的结构元素形状包括矩形、椭圆和十字形
  • iterations:膨胀操作的迭代次数,表示应用膨胀的重复次数。

2.3 代码示例

查看原图

# 原始图像
img = cv2.imread('JOJO.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

使用腐蚀操作消除细线

# 腐蚀操作
kernel = np.ones((5,5),np.uint8) 
dige_erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

经过腐蚀操作之后,字母的粗细变小了。

膨胀操作

# 膨胀操作
kernel = np.ones((3,3),np.uint8) 
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)

cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

从上图可知,膨胀操作,可以恢复其原始信息。

膨胀操作的效果取决于结构元素的形状和大小,以及迭代次数。增加迭代次数会使目标物体区域更大,边界更粗糙。通常情况下,一个或两个迭代次数就足够了。

三、开运算与闭运算

膨胀和腐蚀组合,可以实现开运算(Opening)和闭运算(Closing)

简单记忆:分开去噪,闭合填充。分离连通的对象,去除图像噪声,即为开运算;闭合连通的对象,填充图像空洞,即为闭运算

1. 开运算

1.1 开运算的概念

开运算是先进行腐蚀操作,再进行膨胀操作。它主要用于去除图像中的噪点、小的干扰物或者分离连通的对象。

1.2 代码示例

opencv中,通过调用cv2.morphologyEx()函数,并指定操作类型为cv2.MORPH_OPEN,实现开运算:

# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')

kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

从上图可知,开运算可以先去除边缘细线,然后再增加信息恢复到原始结果。

2. 闭运算

2.1 闭运算的概念

闭运算是先进行膨胀操作,再进行腐蚀操作。它主要用于填充图像中的小洞孔或者连接分离的对象。

2.2 代码示例

opencv中,通过调用cv2.morphologyEx()函数,并指定操作类型为cv2.MORPH_CLOSE,实现闭运算:

# 闭:先膨胀,再腐蚀
img = cv2.imread('JOJO.png')

kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

在闭运算中,由于一开始我们加粗了边缘细线,导致后续我们即使做了腐蚀操作也不能完全去除。

猜你喜欢

转载自blog.csdn.net/m0_37605642/article/details/132352643