【快速閱讀一】帶蒙版的均值模糊快速實現以及其在填充無效區域時的應用。

  最近遇到一個需求,從相機獲取的數據局部區域存在空值,即那些地方沒有有效數據,如果直接賦值爲0,則很有可能得到錯誤的結果,如果不填充值,很多算法又無法進行,因此,需要一種填充算法把這些空白區域設置成合適的值。 我想了一下,有幾個算法可  能可以解決這個問題:

  1、inpainting(修復)算法,Inpainting本身就是一種修復算法,可以從周邊領域的信息填充未知區域的值,這個開源的在Opencv裏有2種。

      但是這個算法的步驟實際上都是迭代算法,一步一步由空值邊緣向空值內部慢慢填充,直到填充完成或者達到指定的迭代步數。

       2、PS裏的智能填充算法或者類似效果,當然PS沒開源,不過一個類似的結果就是PatchMatch算法,這個在百度上可以搜到很多。 

       3、還有一個就是模糊算法,但是如果是直接模糊,很明顯一個會破壞那些正常的值,二是空值區域模糊後的值明顯偏低很多,因爲那個取樣可能很多去取到的都是空值。

  所以要適當修改模糊算法,一個可行的方法就是當領域的像素是空值時,這個像素不參與模糊。這樣,只有那些有用的信息才參與計算。另外,爲了不影響正常的值或者說有效區域的數據,只有那些是空值的地方纔需要模糊。

  通過這樣的修改,只要取適當的模糊半徑, 就可以利用空值周邊有用的信息來填充空值區域了,而且空值處的填充值也是和領域有關的,不是隨機值,體現了領域相關性。

  帶來的問題時,原先高效的均值模糊算法,因爲有了空值區域判斷,無法在直接使用了,需要考慮適當的修改來解決這個問題。

  這個問題的解決方案還是得靠積分圖技術:

    我們首先可以從原始數據中根據空值的分佈得到一副只有0和1元素的蒙版圖(假定1表示有效值區域,0表示空值區域),接着我們計算兩幅積分圖像:

    一是 原始數據的積分圖,但是注意在做積分圖累加時,如果遇到空值,則不進行累加或者說累加值爲0.

         二是 蒙版圖的累加,同樣是遇到空值,不累加,遇到有效值累加1。

    有了這個基礎,下面的求均值的部分和普通的用積分圖來求均值的方案是一樣的了,這是在求均值時還要加上目標區域是否是空值的判斷 。 

    如下圖所示,左圖中那些純黑色的部分(像素值爲0)即爲空值區域,右圖是模糊半徑爲20的時候的修復效果,無效區域均有了有效值(右圖有些邊界很明顯,這個其實可以通過適當的放款無效點的範圍來改進)。

    在處理效率上,對於浮點的數據,一份大概1000*1000的單通道數據,任意半徑的處理耗時是在8ms左右,還是相當的快的。

         

  感覺這個算法也可以用到小範圍的人臉祛痘算法上。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章