從matlab的bwmorph函數的’majority’參數中擴展的一種二值影像邊緣光滑的實時演算法。
- 2022 年 7 月 28 日
- 筆記
- [03] 影像演算法優化, 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的速度的五倍)
仔細想一想,這個和我們以前研究過的中值模糊不就是同一個演算法嗎,那裡也有半徑和百分比一說,但是因為其特殊性,這裡的不用使用傳統的中值模糊來實現演算法,速度得到了極大的提升。
這個演算法呢,我覺得一個比較有用的場合就是,對於一些初步處理後的二值圖,一般都有一些邊緣毛刺或者不平滑的位置,對於後續的識別可能有著較多的干擾,如果使用高斯模糊或者其他的抗鋸齒演算法呢,都會改變影像為二值的圖的屬性,就變為了灰度圖,這是不可以的,但是使用這個演算法呢,就完全不會改變二值圖的本質,同時又能平滑邊緣。
當然,有一點需要注意,當半徑較大時,這個演算法會改變原有二值圖的一些面積屬性,比如白色整體變少等等,這個呢,恰好我們有一個百分比參數,可同通過同時控制半徑和百分比來協調結果這個問題,比如對於上面的原始影像,其相關統計資訊如下:
總像素個數為:293828
白色的像素個數為:34191
連續塊:60個
影像的歐拉數為:59
當我們取半徑為4,百分比為50時,其效果如下所示:
半徑4,百分比50 半徑4,百分比45
相關統計資訊如下:
總像素個數為:293828
白色的像素個數為:32671
找到符合條件的連續塊:58個
影像的歐拉數為:58
可見白色像素的數量有所下降,如果把百分比修改為45,則統計資訊如下:
總像素個數為:293828
白色的像素個數為:34653
找到符合條件的連續塊:59個
影像的歐拉數為:59
和原始影像的資訊基本差不多了,但是很明顯結果比原始影像更有利於後續的分析。
本文Demo下載地址: //files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar,位於Binary->Processing->Majority。裡面的所有演算法都是基於SSE實現的。
如果想時刻關注本人的最新文章,也可關注公眾號: