据说Adobe ps cs5 中的基于图像的填充是使用的PatchMatch 和 Space-Time Completion, 最近特意看了一下这两篇paper,然后按照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中所说,最完美的填充情况下,图像中需要达到最大的一致性。对于一个视频序列 S S S和序列 D D D,如果其中每一个时间空间点都能在序列 D D D中找到,则认为他们又全局的视角一致性。也就是说用 D D D中的窗口来填充 S S S中的数据。从 D D D中找到的patch块用 V V V来表示。 H H H则是 S S S中的一个需要填充的孔洞区域。我们希望能用一些新的 H ∗ H^* H∗填充丢失区H,得到一个新的和数据D有最高的全局视觉一致性的视频序列 S ∗ S^* S∗。
C o h e r e n c e ( S ∗ ∣ D ) = ∏ p ∈ S ∗ m a x q ∈ D s i m ( W p , V q ) Coherence(S^*|D) = \prod_{p \in S^*} \mathop{max}_{q \in D} sim(W_p,V_q) Coherence(S∗∣D)=p∈