opencv形态学-腐蚀、膨胀讲解实例代码

一、形态学

图像形态学中的几个基本操作:腐蚀、膨胀、开操作、闭操作。

1.1腐蚀

结构A被结构B腐蚀的定义为。可以理解为,移动结构B,如果结构B与结构A的交集完全属于结构A的区域内,则保存该位置点,所有满足条件的点构成结构A被结构B腐蚀的结果。
A⨀B={z|(B)z⊆A}A⨀B={z|(B)z⊆A}

腐蚀原理:模板系数均为1,进行最小值滤波,就是将模板对应的最小值设置为中心点的值。
腐蚀是一种在结构元素约束下消除目标图形的部分边界点,使其边界向内部收缩的的算法,具有收缩目标区域的作用。
在这里插入图片描述

#创建kernel为3x3全为1的矩阵
kernel = np.ones((3,3),np.uint8) 
#传入原图像,矩阵,迭代次数
erosion = cv2.erode(img,kernel,iterations = 1)

#图片拼接
res=np.hstack((img,erosion))
cv_show("all",res)

在这里插入图片描述

1.2膨胀

膨胀是腐蚀运算的对偶运算,其作用是在结构元素的约束下将与目标区域相接触的背景合并到该目标物中,使目标边界向外部扩张,物体的面积增大了相应数量的点。
结构A被结构B膨胀的定义为,

A⨁B={z|(B^)z⋂A≠∅}A⨁B={z|(B^)z⋂A≠∅}

可以理解为,将结构B在结构A上进行卷积操作,如果移动结构B的过程中,与结构A存在重叠区域,则记录该位置,所有移动结构B与结构A存在交集的位置的集合为结构A在结构B作用下的膨胀结果。
  图示中红色框内的区域表示结构A在结构B的作用下膨胀的结果。
  在这里插入图片描述

kernel = np.ones((3,3),np.uint8) 
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 2)

cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
下面是原图通过腐蚀再膨胀的过程
在这里插入图片描述

1.3开操作

先腐蚀后膨胀的操作称之为开操作。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。 采用上图的结构B对原件进行开操作.
作用:用来消除图像中细小对象,在纤细点处分离物体和平滑较大物体的边界而有不明显改变其面积和形状。
在这里插入图片描述

# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')
#卷积核
kernel = np.ones((5,5),np.uint8) 
#传入原图像,开运算,卷积核
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

1.4闭操作

先膨胀后腐蚀的操作称之为闭操作。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。 采用上图的结构对原件进行闭操作
在这里插入图片描述

# 闭:先膨胀,再腐蚀
img = cv2.imread('dige.png')

kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

1.5梯度

形态学梯度操作能描述图像亮度变化的剧烈程度;当我们想要突出高亮区域的外围时,则可以选用形态学梯度来突出边缘,可以保留物体的边缘轮廓。
常见的几种梯度:
在这里插入图片描述

# 梯度=膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8) 
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)
res = np.hstack((pie,dilate,erosion))

下面是原图像、膨胀、腐蚀
在这里插入图片描述

gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

梯度运算之后的结果,膨胀-腐蚀
在这里插入图片描述

1.6礼/顶帽(Top hat)

礼帽 = 原始输入-开运算结果

顶帽是原图与原图的开运算的差值图像。开运算放大了裂缝或者局部低亮度的区域,所以,从原图中减去开运算后的图,得到的结果突出了比原图轮廓周围的区域更明亮的区域,这个操作与选择的核的大小有关。TopHat运算一般用来分离比邻近点亮一些的斑块,可以使用这个运算提取背景。

#礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

礼帽操作就是用原图-开运算之后的
在这里插入图片描述

1.8黑帽(Black hat)

黑帽 = 闭运算-原始输入

黑帽是闭运算结果与原图的差值图像。黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。

#黑帽
img = cv2.imread('dige.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tc.小浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值