[1] python实现膨胀与腐蚀
[3] OpenCV 图像处理之膨胀与腐蚀【推荐】
-
膨胀
cv2.dilate(img, kernel, 1)
-
腐蚀
cv2.erode(img, kernel, iterations=1)
-
开运算
开运算:先腐蚀,再膨胀
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)
-
闭运算
闭运算:先膨胀,再腐蚀
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
-
梯度计算:
膨胀的图像 - 腐蚀的图像
用大一圈的图像减去小一圈的图像正好就是边缘的信息。
cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
1. 基本概念
图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大;腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。
1.1 膨胀(或)
通过卷积运算,对于膨胀而言,结果是 0 的还是 0,结果大于 0 的就赋值为 1(针对二值图)
相当于 或 操作,只有 0 才为 0,其他都为 1(针对二值图)
更通俗的说法:这里我们指定范围为3*3的矩阵,kernel(卷积核核)指定为全为1的3*3矩阵,卷积计算后,该像素点的值等于以该像素点为中心的3*3范围内的最大值。如果是二值图像,只要包含周围白的部分,就变为白的。
1.2 腐蚀(与)
通过卷积运算,对于腐蚀而言,结果是 最大值 的才是 1,其他就赋值为 0(针对二值图)
相当于 与 操作,只有 最大值 才为 1,其他均赋值为 0(针对二值图)
举例:如果是 十字形,则需要卷积值为 5 才会赋值为 1,其他均赋值为 0(针对二值图)
更通俗的说法:腐蚀操作和膨胀操作相反,也就是将毛刺消除,判断方法为:在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。如果是二值图像,就是取0(黑色)。 总结: 只要原图片3 * 3范围内有黑的,该像素点就是黑的。
2. 实现过程
2.1 膨胀实现
img = cv2.imread('Pic/corrode.png') def cv_show(img): cv2.imshow('', img) cv2.waitKey(0) cv2.destroyAllWindows() cv_show(img) kernel = np.ones((3, 3), dtype=np.uint8) dilate = cv2.dilate(img, kernel, 1) # 1:迭代次数,也就是执行几次膨胀操作 cv_show(dilate) # 更改卷积核大小 kernel_2 = np.ones((4, 4), dtype=np.uint8) # 卷积核变为4*4 dilate = cv2.dilate(img, kernel_2, 1) cv_show(dilate) # 更改迭代次数 kernel = np.ones((3, 3), dtype=np.uint8) dilate = cv2.dilate(img, kernel, 2) # 更改迭代次数为2 ss = np.hstack((img, dilate)) cv_show(ss)
2.2 腐蚀实现
kernel = np.ones((3, 3), dtype=np.uint8) erosion = cv2.erode(img, kernel, iterations=1) ss = np.hstack((img, erosion)) cv_show(ss) # 更改卷积核大小 kernel_2 = np.ones((4, 4), dtype=np.uint8) erosion = cv2.erode(img, kernel_2, iterations=1) ss = np.hstack((img, erosion)) cv_show(ss) # 更改迭代次数 kernel = np.ones((3, 3), dtype=np.uint8) erosion = cv2.erode(img, kernel, iterations=2) ss = np.hstack((img, erosion)) cv_show(ss)
2.3 开运算与闭运算
# 开运算 opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1) ss = np.hstack((img, opening)) cv_show(ss) # 闭运算 closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) ## 有缺陷,填补缺陷 ss = np.hstack((img, closing)) cv_show(ss)
开运算可以用来去噪声
img = cv2.imread('seg.png') kernel = np.ones((5, 5), dtype=np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1) ss = np.hstack((img, opening)) show(ss) cv2.imwrite('seg_smooth.png', opening)
2.4 梯度运算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) cv_show(gradient)
具体实现
img = cv2.imread('seg.png') kernel = np.ones((3, 3), dtype=np.uint8) gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) ss = np.hstack((img, gradient)) show(ss)