重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。
【Opencv入门到项目实战】(三):图像腐蚀与膨胀操作
膨胀与腐蚀操作是图像处理中常用的一种形态学操作。
通常,腐蚀操作用于去除图像中的噪声、分割连通区域、减小目标物体的尺寸等。
简单记忆:铁块被硫酸腐蚀之后,外层的铁锈消失,且铁块变小。
腐蚀操作的原理是,在给定的结构元素(kernel滤波器)下,遍历图像的每个像素,并将其值替换为该像素周围邻域内像素的最小值。结构元素控制了腐蚀的邻域范围和形状。邻域内的任何一个像素为黑色(0),则中心像素也将被置为黑色(0)。
cv2.erode()
cv2.erode(src, kernel, iterations)
参数解释
src
:输入的二值图像,通常为单通道灰度图像。kernel
:腐蚀操作的结构元素,用于定义腐蚀的邻域大小和形状。可以使用 cv2.getStructuringElement()
函数创建不同形状的结构元素。iterations
:腐蚀操作的迭代次数,表示应用腐蚀的重复次数。查看原图
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()
从上述实验对比可知,腐蚀操作会减少图像信息,可以达到去噪的效果。具体表现为:字母周围的斜线变得很浅,字母大小变细,经过多次腐蚀之后,字母四周的斜线消失。
在腐蚀操作中,消除噪声的同时,有价值的信息也减少了。因此我们希望将这些有价值的信息增大,可以通过膨胀操作,则膨胀是腐蚀的逆操作。
cv2.dilate()
cv2.erode(src, kernel, iterations)
参数解释
src
:输入的二值图像,通常为单通道灰度图像。kernel
:膨胀操作的结构元素,用于定义膨胀的邻域大小和形状。可以使用 cv2.getStructuringElement()
函数创建不同形状的结构元素。常见的结构元素形状包括矩形、椭圆和十字形
。iterations
:膨胀操作的迭代次数,表示应用膨胀的重复次数。查看原图
# 原始图像
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)。
简单记忆:分开去噪,闭合填充。分离连通的对象,去除图像噪声,即为开运算;闭合连通的对象,填充图像空洞,即为闭运算。
开运算是先进行腐蚀操作,再进行膨胀操作。它主要用于去除图像中的噪点、小的干扰物或者分离连通的对象。
在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()
从上图可知,开运算可以先去除边缘细线,然后再增加信息恢复到原始结果。
闭运算是先进行膨胀操作,再进行腐蚀操作。它主要用于填充图像中的小洞孔或者连接分离的对象。
在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()
在闭运算中,由于一开始我们加粗了边缘细线,导致后续我们即使做了腐蚀操作也不能完全去除。