【642】Python 实现膨胀、腐蚀、提取边线
[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)

浙公网安备 33010602011771号