从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。

网友投稿 512 2022-09-28

从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。

从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。

很多二值化后的图像,其二值边缘一般都有一些毛刺或凸出部分,影响后续的识别等过程,本文从matlab的bwmorph函数中受到启发,通过扩展改造了一个majority主成分的函数,可以不改变二值属性的情况下让二值图变的更为光滑和规则,从而在某种程度上提高后续的处理精度。

在matlab的图像处理工具箱中,有一系列关于Binary Images的处理函数,都是以字母bw开头的,其中以bwmorph函数选项最为丰富,一共有'bothat'、'branchpoints'、'bridge'、'clean'、'close'等十几个方法,其中像骨骼化、细化等常见的功能也集成在这个函数里,同常规的写法一样,这些算法都是需要迭代的,因此,这个函数也有个迭代次数的参数。那么另外一些算子,比如clean、diag、remove等等其实都是基于3*3或者5*5领域的,而其中的'erode'、'open'也只是基于3*3的,因此和真正的常用的腐蚀和膨胀还有所不同,那个需要使用imopen或者imclose实现。实际上,这些基于3*3或者5*5的小算子,他们对于二值图基本上就是用一次结果接没有变换,几迭代次数多了也没有啥用。那几个图测试下其中几个算子的效果:

原图                                           Remove模式

Fill模式                                         Clean模式

这些效果都比较平淡,其中Remove的效果和bwperim非常类似,就是提取二值图的边缘。Fill的作用就是填充图像中面积为1的黑色封闭区域,Clean是填充面积为1的白色封闭区域,他们不管你循环迭代多少次,结果和循环1次都是一样的,因此,感觉作用有限。

另外,还有一个比较有意思的参数,即'majority’参数,matlab的帮助文档对其解释是:

Sets a pixel to 1 if five or more pixels in its 3-by-3 neighborhood are 1s; otherwise, it sets the pixel to 0.

即在3*3领域内,如果白色的像素多一点,即当前像素修改为白色,如果黑色的多一点,则修改为黑色。

这个参数呢,循环迭代次数还有点作用了,下面是迭代一次和迭代十次后的效果比较:

迭代1次                                        迭代10次

可以看到,迭代十次后的结果图像的边缘更为光滑,毛刺比较少。

对于这个选项,我觉得有点可扩展的空间。因为其他像Fill等选项,是个固定的Mask,而这个是有一定的自由度的,我们不一定非要限制他在3*3领域啊,任何领域应该都是可以的,只要取领域内统计像素多一点的作为结果,就可以了啊。甚至作为扩展,我们还不一定就正好取多一点的,我们取某个百分比的也是可以的嘛,这样就可以有2个参数了,比如说取样半径和百分比。

不过,如果扩展到任意半径,那么算法的优化就很有必要了,不然原始的RAW实现,速度会慢的吓人的。

这个优化其实也不是没有弄过,但是二值图有其特殊性,其数据只有2个情况,0和1或者说0和255,我们要统计其领域的Majority元素,没有必要排序,也没有必要统计0和1的独立数据个数,想一想,我们是不是只要把领域的所有数据都加起来,然后也同样的可以知道谁更多呢。比如说,半径为5,那么领域一共有25个数据,如果加起来总和大于12,那不就意味着1多一些,如果小于等于12,那就意味着0多一些。

如何快速的实现领域的像素相加呢,这不就是Boxblur要干的事情吗,Boxblur如何优化:积分图、懒惰算法等等一大堆资料可以利用的。

参考 : ​​SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)​​

​​13行代码实现最快速最高效的积分图像算法。​​

仔细想一想,这个和我们以前研究过的中值模糊不就是同一个算法吗,那里也有半径和百分比一说,但是因为其特殊性,这里的不用使用传统的中值模糊来实现算法,速度得到了极大的提升。

这个算法呢,我觉得一个比较有用的场合就是,对于一些初步处理后的二值图,一般都有一些边缘毛刺或者不平滑的位置,对于后续的识别可能有着较多的干扰,如果使用高斯模糊或者其他的抗锯齿算法呢,都会改变图像为二值的图的属性,就变为了灰度图,这是不可以的,但是使用这个算法呢,就完全不会改变二值图的本质,同时又能平滑边缘。

当然,有一点需要注意,当半径较大时,这个算法会改变原有二值图的一些面积属性,比如白色整体变少等等,这个呢,恰好我们有一个百分比参数,可同通过同时控制半径和百分比来协调结果这个问题,比如对于上面的原始图像,其相关统计信息如下:

总像素个数为:293828

白色的像素个数为:34191

连续块:60个

图像的欧拉数为:59

当我们取半径为4,百分比为50时,其效果如下所示:

半径4,百分比50                                    半径4,百分比45

相关统计信息如下:

总像素个数为:293828

白色的像素个数为:32671

找到符合条件的连续块:58个

图像的欧拉数为:58

可见白色像素的数量有所下降,如果把百分比修改为45,则统计信息如下:

总像素个数为:293828

白色的像素个数为:34653

找到符合条件的连续块:59个

图像的欧拉数为:59

和原始图像的信息基本差不多了,但是很明显结果比原始图像更有利于后续的分析。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用@ApiModel遇到的问题及解决
下一篇:从局部信息推测基恩士的Removing BackGround Information算法的实现。
相关文章

 发表评论

暂时没有评论,来抢沙发吧~