最近遇到一個需求,從相機獲取的數據局部區域存在空值,即那些地方沒有有效數據,如果直接賦值爲0,則很有可能得到錯誤的結果,如果不填充值,很多算法又無法進行,因此,需要一種填充算法把這些空白區域設置成合適的值。 我想了一下,有幾個算法可 能可以解決這個問題:
1、inpainting(修復)算法,Inpainting本身就是一種修復算法,可以從周邊領域的信息填充未知區域的值,這個開源的在Opencv裏有2種。
但是這個算法的步驟實際上都是迭代算法,一步一步由空值邊緣向空值內部慢慢填充,直到填充完成或者達到指定的迭代步數。
2、PS裏的智能填充算法或者類似效果,當然PS沒開源,不過一個類似的結果就是PatchMatch算法,這個在百度上可以搜到很多。
3、還有一個就是模糊算法,但是如果是直接模糊,很明顯一個會破壞那些正常的值,二是空值區域模糊後的值明顯偏低很多,因爲那個取樣可能很多去取到的都是空值。
所以要適當修改模糊算法,一個可行的方法就是當領域的像素是空值時,這個像素不參與模糊。這樣,只有那些有用的信息才參與計算。另外,爲了不影響正常的值或者說有效區域的數據,只有那些是空值的地方纔需要模糊。
通過這樣的修改,只要取適當的模糊半徑, 就可以利用空值周邊有用的信息來填充空值區域了,而且空值處的填充值也是和領域有關的,不是隨機值,體現了領域相關性。
帶來的問題時,原先高效的均值模糊算法,因爲有了空值區域判斷,無法在直接使用了,需要考慮適當的修改來解決這個問題。
這個問題的解決方案還是得靠積分圖技術:
我們首先可以從原始數據中根據空值的分佈得到一副只有0和1元素的蒙版圖(假定1表示有效值區域,0表示空值區域),接着我們計算兩幅積分圖像:
一是 原始數據的積分圖,但是注意在做積分圖累加時,如果遇到空值,則不進行累加或者說累加值爲0.
二是 蒙版圖的累加,同樣是遇到空值,不累加,遇到有效值累加1。
有了這個基礎,下面的求均值的部分和普通的用積分圖來求均值的方案是一樣的了,這是在求均值時還要加上目標區域是否是空值的判斷 。
如下圖所示,左圖中那些純黑色的部分(像素值爲0)即爲空值區域,右圖是模糊半徑爲20的時候的修復效果,無效區域均有了有效值(右圖有些邊界很明顯,這個其實可以通過適當的放款無效點的範圍來改進)。
在處理效率上,對於浮點的數據,一份大概1000*1000的單通道數據,任意半徑的處理耗時是在8ms左右,還是相當的快的。
感覺這個算法也可以用到小範圍的人臉祛痘算法上。
翻譯
搜索
複製