OpenCV-形态学转换-腐蚀、膨胀、开运算、闭运算、形态学梯度

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。

膨胀:减少亮区; 腐蚀:扩大亮区

腐蚀


这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。

实现原理卷积核B沿着图像A滑动,并将B所对应的最小值赋值给A像素中心点。

    对于二值图像,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。 

代码:

 1 import numpy as np
 2 import cv2
 3 from matplotlib import pyplot as plt
 4 
 5 # 灰度模式读取图像
 6 img = cv2.imread("../image/girl.jpg", cv2.IMREAD_GRAYSCALE)
 7 
 8 # 生成深度为8的卷积核
 9 kernel = np.ones((5, 5), np.uint8)
10 
11 # iterations表示迭代的次数
12 erosion = cv2.erode(img, kernel, iterations=1)
13 
14 plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
15 plt.subplot(122), plt.imshow(erosion, cmap="gray"), plt.title("Erosion")
16 plt.show()

结果:

  一般灰度图                                    转成二值图像:

 

膨胀


实现原理卷积核B沿着图像A滑动,并将B所对应的最大值赋值给A像素中心点。

    对于二值图像,如果与卷积核对应的原图像只要有一个像素值是 1,那么中心元素就为1。 

代码:

1 dilation = cv2.dilate(img, kernel, iterations=1)

结果:

     一般灰度图:                                  转换成二值图像:

 

 开运算


对图像进行先腐蚀再膨胀,主要用来出去图像中的白噪声,也可以将图像中两个粘在一起的物体分开。

函数是 cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

 

代码:

 1 import numpy as np
 2 import cv2
 3 from matplotlib import pyplot as plt
 4 
 5 # 灰度模式读取图像
 6 img = cv2.imread("../image/erosion.jpg", cv2.IMREAD_GRAYSCALE)
 7 # ret, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
 8 
 9 # 生成深度为8的卷积核
10 kernel = np.ones((5, 5), np.uint8)
11 
12 # cv2.MORPH_OPEN表示开运算
13 opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
14 
15 plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
16 plt.subplot(122), plt.imshow(opening, cmap="gray"), plt.title("Opening")
17 plt.show()

结果:

闭运算


先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。

代码:

# cv2.MORPH_CLOSE表示闭运算
close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

结果:

形态学梯度


它是膨胀与腐蚀的差,该操作能描述图像亮度变化的剧烈程度。当我们想突出高亮区域的外围时,通常可以使用形态学梯度,因为从原区域的膨胀中减去了原区域的收缩,所以留下了图像的外围边缘

代码:

# cv2.MORPH_GRADIENT 表示形态学梯度
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

结果:

礼貌、黑帽


  礼貌操作时原始图像与进行开运算后的图像的差

  黑帽操作是进行闭运算得到的图像与原始图像的差

  开运算带来的结果是放大裂缝或局部低亮度区域,因此A - Open(A)可以突出比A周围的区域更明亮的区域,并跟核的大小相关;相反,黑帽操作则能突出比A的周围区域黑暗的区域

代码:

# cv2.MORPH_TOPHAT 表示礼貌操作
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

# cv2.MORPH_BLACKHAT 表示黑帽
# gradient = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

结果:

  礼貌:                           黑帽:

  

猜你喜欢

转载自www.cnblogs.com/bingma/p/11219591.html