腐蚀与膨胀算法

(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代码的一张图,网上很多案例,这里就不做展示了

腐蚀与膨胀算法

Original: https://blog.csdn.net/whiteBearClimb/article/details/123711281
Author: 凉拌海蜇丝
Title: 腐蚀与膨胀算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/636888/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球