前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。

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

作者头像
用户1138785
发布2022-09-19 17:23:00
1.1K0
发布2022-09-19 17:23:00
举报

在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

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

       本文Demo下载地址:  https://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar,位于Binary->Processing->Majority。里面的所有算法都是基于SSE实现的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档