腐蚀与膨胀算法

(1)概念

腐蚀与膨胀算法,是一种入门级基础的形态学处理算法,常见用于图形处理方面
腐蚀操作可以消除噪点,同时消除部分边界值,导致目标图像整体缩小。
膨胀操作可以使目标特征值增大,导致目标图像整体放大。
他两组合起来使用,可以达到更好分割独立的图形元素的目的。

核:腐蚀和膨胀算法的灵魂,也是最需要花心思设计的东西,根据目标图像的特征不同,要设置不同的核才能产生很好的效果
更专业的叫法叫做“结构元素”,其中核心,也就是结构元素的中心点,叫做“锚点”,一般采用结构元素的影响区域的最小像素值去替换掉“锚点”的像素值

说人话:你就想像有一板墙画(目标图像),历经岁月,墙上很多岁月的斑驳痕迹,很多色彩掉了,或者有些地方发霉了(噪点),很丑,而你手提着一把油漆刷(核/结构元素),要把这板墙画修复一下,采用什么办法刷呢?就是一行行用油漆刷拉过去,如下图:

在这里插入图片描述
这一操作,就是“腐蚀”与“膨胀”
怎么修复的呢?下面看由浅入深的几个小案例

(2)案例

让我们先回忆一下高中数学的交集(符号是∩)和并集(符号是∪)操作

1:假设有两个不同的数组: A={1,2,3} ; B = {1,6,9} ;

则 A ∩ B = {1} A ∪ B = {1,2,3,6,9}
道理大家都懂,那么接下来,

2:假设该数组为一个简单的2*2矩阵

在这里插入图片描述
根据交集∩的操作,必须是AB矩阵相同的部分保留,不同部分排除(设为0),则得:
在这里插入图片描述
据并集∪的操作,AB两个矩阵全部部分都保留,不做排除,则得:
在这里插入图片描述
而这就是腐蚀与膨胀的基本操作,既然看到这里都是非常简单易懂的,下面就开始进入掉支笔捡起来就看不懂环节,实战案例分析~

3:假设识别了一张9*9像素的目标图片,得到一组9*9的RGB三原色通道二维数组,假设只有黑(0,0,0)和白(255,255,255)两种颜色,如下图所示:

在这里插入图片描述
我们人眼跟着W(white)的点走,虽然左上角,左下角和右下角有一些噪点,但还是很容易就辨认出来是个2,怎么让2看起来更加显眼呢?
这个时候就是我们的腐蚀与膨胀算法开始干活了
我们定义一个“核”,你可以简单把它理解为“刷子”“模版”,像刷油漆一样,一下下往目标图中刷

腐蚀:

腐蚀的规则就是:1的区域如果有W(白色),则把核的中心那个点标注为W,如果1的区域没有W,则不用处理,这里相当于“&&”且运算
在这里插入图片描述
刷油漆开始:
在这里插入图片描述
第一次,可以看到十字型区域没有W白点,所以核心点不需要更改颜色。
在这里插入图片描述
第二次,发现十字形区域有W白点,则核心点颜色要改成白色,这里我用W+表示,涂漆后就会出现
在这里插入图片描述
继续往下刷,如果颜色本来就是W的就不需要改每一行都要刷过去,刷完后的结果:
在这里插入图片描述
可以发现黑色底色被腐蚀缩小,白色目标区域被放大,但是图像一塌糊涂,根本不是我们想要的
这个时候,我们就该考虑更换核,也就是换把“刷子”
在这里插入图片描述
第一步:
在这里插入图片描述

第二步:
在这里插入图片描述
开始不停递归,涂漆完成后:
在这里插入图片描述
可以看到,三角形核的腐蚀效果更好,起码比十字形的好,当然这里也是简单例子做个展示,总结一下主要有两点:
(1)不同图像使用不同核的腐蚀效果不同
(2)腐蚀通过平移和&判断,增大目标图像的特征,缩小黑色背景色的影响

膨胀:

膨胀其实非常类似,只不过它关注的是核形状区域有没有黑色B,如果有,就把锚点涂成黑色
假设膨胀的核也是小三角,用同样的核去针对上面腐蚀后的图像做膨胀,我们看看会发生什么:
第一步:发现本来就是B,不需要修改
在这里插入图片描述
第二步:发现有B,则把该W+的锚点改成黑色
在这里插入图片描述
继续刷下去,然后得出膨胀后的结果:
在这里插入图片描述
发现原来胖胖的2,变得非常瘦了,甚至下面那一横都被当成是噪点消没了,当然实际情况中,目标图像的像素值不可能只有可怜巴巴的一行N列,所以肯定不会被完全消除的,最多就是被瘦身,而一些较小的噪点,则会被消除。
原来黑色底区域,膨胀大了
这就是腐蚀与膨胀的底层实现逻辑,当然我如果使用不同的核,膨胀结果也会不同,具体还是要多试几种,根据实际情况决定

(4)开闭运算

设目标图像为X,腐蚀为E,膨胀为D

开运算

像上面例子,先腐蚀,后膨胀,称之为:开运算(OPEN(X) = D(E(X))
通过开运算,能够去除孤立的小噪点,图形中的毛刺,两区域间小桥,而整体图形大体上不变
在这里插入图片描述

闭运算

先膨胀,后腐蚀,称之为:闭运算(CLOSE(X) = E(D(X)))
通过闭运算,可以修复主体图形中的坑坑洼洼,填补小裂缝,使其目标特征更加完备
在这里插入图片描述
(上面两张图出自百度随手搜索,网上太多了,借来用一下)

(5)问题:

核需要怎么设计?
例子中只是简单说明,实际中已经封装好的CV库中的膨胀与腐蚀其实不要我们专门设计,它会在“刷子”和目标图像做卷积处理“涂漆”的时候,默认把锚点涂成最深/最浅的一种颜色值,而核的形状一般为正方形或者圆盘形

为什么边缘的噪点不建议擦除?
边缘的噪点不能擦,因为在当前图块中可能是噪点,但是假如是一张大图切分开的小图,边缘那些点点很有可能就是其它几张图片的关键特征值,是拼接的关键信息

核一定是3*3吗?核心一定是一个点吗?
不一定,核也可以是4*4,5*5,9*9,核心也可以是各种形状,不一定就是一个点

(6) 最后

附上CV代码的一张图,网上很多案例,这里就不做展示了
在这里插入图片描述

  • 42
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
OpenCV是一个广泛用于计算机视觉和图像处理的开源库。腐蚀膨胀OpenCV中常用的图像处理操作之一,用于改变图像的形状和结构。 腐蚀(Erosion)是指通过对图像进行局部最小值操作来减小或磨损图像中的前景物体。它可以用于去除噪声或者分离连通的物体。 膨胀(Dilation)与腐蚀相反,通过对图像进行局部最大值操作来增加或扩大图像中的前景物体。它可以用于填充图像中的空洞或者连接连通的物体。 在OpenCV中,可以使用函数`cv2.erode()`进行腐蚀操作,使用函数`cv2.dilate()`进行膨胀操作。这两个函数需要传入待处理的图像和一个结构元素作为参数。结构元素定义了操作的形状和大小。 下面是一段示例代码,展示如何在OpenCV中使用腐蚀膨胀操作: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg', 0) # 定义结构元素 kernel = np.ones((5,5), np.uint8) # 腐蚀操作 erosion = cv2.erode(img, kernel, iterations=1) # 膨胀操作 dilation = cv2.dilate(img, kernel, iterations=1) # 显示结果 cv2.imshow('Erosion', erosion) cv2.imshow('Dilation', dilation) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这段代码中,我们首先读取了一张图像,然后定义了一个5x5的矩形结构元素。接下来,对图像进行了腐蚀膨胀操作,并使用`cv2.imshow()`函数显示了结果。 注意,腐蚀膨胀操作可以通过调整结构元素的大小和迭代次数来控制处理效果。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值