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)

结果:

  礼貌:                           黑帽:

  

 

转载于:https://www.cnblogs.com/bingma/p/11219591.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值