【642】Python 实现膨胀、腐蚀、提取边线

[1] python实现膨胀与腐蚀

[2] 图像腐蚀与图像膨胀(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)

原文地址:https://www.cnblogs.com/alex-bn-lee/p/15131938.html