形态学基础算法之边界提取,空洞填充,连通分量提取,凸壳,细化和粗化

边界提取

孔洞填充

X0是一副全黑的图像,但在孔洞的地方有一个白点。

å¨è¿éæå¥å¾çæè¿°

我们要对A图进行孔洞填充,首先求出A的补集作为备用,然后所用到的element B如上图。首先我们构建X0一幅全黑图像加上孔洞中的一点白作为初始图像,然后用B对X0进行膨胀,结果膨胀的结果超过了孔洞的大小,于是用之前构造的Ac对其求交集将其结果限制在孔洞内(由于我们的element是一个四连通元素,每一次膨胀其边界不会超出一个像素点,而由于Ac 的四周都是一个像素宽的沟壑,所以求交集刚好能限制膨胀过界的像素)。然后迭代,直到xk−1 与xk相同。最后得到孔洞的填充图像,最后与原图像求并集刚好就把孔洞填充了。

如果选择Element为八连通,将无法成功限制膨胀的溢出和越界。

连通分量提取

与空洞填充类似,迭代至Xk-1 与 Xk相同为止。连通分量提取常用语自动检测,检测外来物。

凸壳

凸壳是为了找到一个凹陷的物体最小外壳,以不完美命中(腐蚀)为主要操作,通过调整结构元,加上原图,得到相关结果。公式如下:

该方法反复对A进行击中或击不中变换操作,当不再发生变化时,执行并集操作。

 为了确保在上述生长过程中凸壳不会大幅度超过凸性所需的最小尺寸,可以限制其生长以便凸壳不会超出初始时包含物体A的最小矩形。

细化

图像细化的目的是提取骨架,根据击中和击不中变换来定义

以结构元的序列为基础定义细化:

其中B的定义为:

Bi 是 Bi-1旋转后的结果。A被B1细化一次,得到的结果被B2细化一次.....循环,直到不再发生变化。每次单独细化,使用第一个公式。

粗化

粗化是形态学的对偶,定义如下

B是适合于粗化处理的结构元,与细化一样。粗化处理也可以定义为一个系列操作:

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以在前面的代码基础上稍作修改来实现提取边界的功能。以下是代码示例: ```python import cv2 # 读取图像 img = cv2.imread('image/coins.png') # 灰度化处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 100, 200) # 膨胀操作 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) dilated = cv2.dilate(edges, kernel) # 腐蚀操作 eroded = cv2.erode(edges, kernel) # 形态学梯度 gradient = cv2.morphologyEx(edges, cv2.MORPH_GRADIENT, kernel) # 提取边界 inner_contours, _ = cv2.findContours(eroded, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) inner_boundary = cv2.drawContours(img, inner_contours, -1, (0, 0, 255), 2) # 提取边界 outer_contours, _ = cv2.findContours(dilated, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) outer_boundary = cv2.drawContours(img, outer_contours, -1, (0, 255, 0), 2) # 提取形态学梯度边界 gradient_contours, _ = cv2.findContours(gradient, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) gradient_boundary = cv2.drawContours(img, gradient_contours, -1, (255, 0, 0), 2) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('Inner Boundary', inner_boundary) cv2.imshow('Outer Boundary', outer_boundary) cv2.imshow('Gradient Boundary', gradient_boundary) cv2.waitKey(0) cv2.destroyAllWindows() ``` 运行以上代码,我们可以得到三个边界提取结果:内边界、外边界形态学梯度边界。其中,内边界可以通过先膨胀再腐蚀的操作得到;外边界可以通过先腐蚀再膨胀的操作得到;形态学梯度边界可以通过使用`cv2.drawContours()`函数和`cv2.findContours()`函数来实现。在`cv2.drawContours()`函数中,我们需要指定要绘制轮廓的图像,找到的轮廓,轮廓的索引(-1表示绘制所有轮廓),线条颜色和线条宽度等参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清韵逐梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值