據說Adobe ps cs5 中的基於圖像的填充是使用的PatchMatch 和 Space-Time Completion, 最近特意看了一下這兩篇paper,然後動手擼代碼,感覺還挺有意思的。
PatchMatch
PatchMatch 算法就是一個找近似最近鄰(Approximate Nearest neigbhor)的方法,是一片09年的paper,相較於之前的找ANN的算法速度上快了10+倍。PatchMatch 的思想是利用圖像的連續性(consistence), 一個圖像patch塊A附近的Patch快的最近鄰最有可能出現在Patch快A的最近鄰附近,利用這種圖像的連續性減少搜索的範圍,通過迭代尋找達到收斂。
對於圖A,在圖B中尋找每個patch塊的最近鄰PatchMatch算法步驟如下:
- 先隨機給圖A中的每個patch設定一個隨機的圖B中的patch作爲其初始的最近鄰patch。其中自然有一些匹配得還可以,一些匹配得不行的。
- 對於圖A中的每個patch塊,尋找其周圍其他patch塊的最近鄰所對應位置的patch塊作爲其候選最近鄰(傳遞附近patch快的最近鄰信息),如果距離比當前最近鄰小,則進行更新。
- 爲了避免陷入局部極值,再額外再隨機生成幾個patch位置作爲候選最近鄰,弱小於當前最近鄰,則更新。
- 多次迭代,奇數次向右向下傳遞,偶數次向左向上傳遞。
這是一種利用圖像連續性的方法,每當找到自己的最近鄰的時候,還能將該對應信息傳遞給周圍的patch塊,從而達到加速收斂的目的。如下途中,紅色Patch找到自己最近鄰的情況下,將相應附近的點patch也傳遞給自己附近的patch塊。
Space-Time Completion
這篇paper的目的在於利用一個全局性的目標函數求全局最優來完成圖像的填充。發現這篇paper和nonlocal mean denoise有一些異曲同工之妙,都有一種利用點周圍patch進行投票的思想,迭代過程都比較優美。
下面簡單翻譯一下原文吧,感覺說得也不是特別清晰。
按照paper中所說,最完美的填充情況下,圖像中需要達到最大的一致性。對於一個視頻序列和序列,如果其中每一個時間空間點都能在序列中找到,則認爲他們又全局的視角一致性。也就是說用中的窗口來填充中的數據。從中找到的patch塊用來表示。則是中的一個需要填充的孔洞區域。我們希望能用一些新的填充丟失區H,得到一個新的和數據D有最高的全局視覺一致性的視頻序列。
目前沒有較好的辦法能直接對這個目標函數求解,但是可以知道在最優解的位置,必然滿足以下兩個條件
- 包含p點的所有的patch塊,都是來自原始的數據
- 這些patch快在p點的投票值都是一樣的,
迭代過程
令$ p \in H$ 屬於我們需要提升的某個點,令是所有包含點p的空間時間patch快。令表示與
最相似的patch塊。他們越相似,可靠性就越高。
我們需要在點p處選擇一個顏色值使得所有包含他的窗口的一致性值提升。所以最有可能的值應該最小化根據所對應值的方差。也就是最小化,也就有
其他的一些細節
相似度引入梯度
這篇paper中講了一下只用rgb可能不夠,額外加了兩維的梯度的數據構成5D數據來評估patch快之間的相似度,我實驗對於圖像inpainting直接用RGB效果也還可以,可能對於視頻的填充更爲重要。
權重計算
其中, 是一個和點到mask邊界距離有關的固定的係數值,首先計算Mask圖像的距離變換,然後取 作爲patch塊的固定係數,表明該patch塊的權重,離已知圖像越近,其權重越高。 . 權重取得是包含p點的所有窗口的距離d的75分位數,作者說這樣可以加快收斂。
MeanShift
從上面的遞歸方式是一種計算各個patch快的加權均值的方式,如果其中有一個點偏離實際值比較遠,會導致最終數據出現比較大的偏移,算法收斂速度變慢。
所有作者推薦使用Meanshift來計算最終p點處的color值。
多尺度
通過先在粗尺度上進行處理,再不斷進行傳播到細尺度上,可以節省大量時間,但是作者沒提到的是多尺度有利於算法找到一個較好的初始值,得到更快的收斂效果。
和之前的基於順序的對比效果
即使對於一些比較複雜的週期性圖案,該算法可以較好的處理好
- 基於邊緣優先級的填充算法: 效果非常差,迭代次數很多。爲了壓縮gif大小,填充50次保留1幀。
- space -time completion:效果可以接受。可以看到圖像隨着尺度變化,填充的細節也越來越清晰。
|
缺陷
對於初始化比較敏感,容易陷入局部極值。代碼稍後再上傳到github吧。