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


 

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

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

 

结构化元素


 

  构建核的形状和大小方法:cv2.getStructuringElement()

    cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))    : 构建矩形核
    array([[1, 1, 1, 1, 1],
         [1, 1, 1, 1, 1],
         [1, 1, 1, 1, 1],
         [1, 1, 1, 1, 1],
         [1, 1, 1, 1, 1]], dtype=uint8)

    cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))  :构建椭圆核
      array([[0, 0, 1, 0, 0],
           [1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1],
           [0, 0, 1, 0, 0]], dtype=uint8)

    cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))  :构建十字核
      array([[0, 0, 1, 0, 0],
           [0, 0, 1, 0, 0],
           [1, 1, 1, 1, 1],
           [0, 0, 1, 0, 0],
           [0, 0, 1, 0, 0]], dtype=uint8)


腐蚀


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

实现原理卷积核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)

结果:

  礼貌:                           黑帽:

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM