文章目录
前言
最近工作中有图像修复的应用场景,第一时间想到是生成对抗网络,可惜首次接触生成对抗网络,感觉不是特别良好,很多GAN没有整明白,后续想从传统的方法入手,然后发现这个09年发表的PatchMatch算法,另外在读研期间,同行们在研究Copy-Move的时候,也提到过这个算法。将PatchMatch放在今天来讲,感觉有点落后了,但无所谓,主要是学习里面的思想。PatchMatch算法论文可以在参考[1]的论文中获得,代码可以在参考[2]中获得,或者在github上搜索PatchMatch,找高星的看即可。
PatchMatch
PatchMatch算法,以下简称PM,巧妙地利用图像的局部相关性实现快速块匹配。这种寻找最近邻匹配是一项非常重要的任务,适合很多的应用场景,比如立体匹配、纹理合成、图像修复等。因此这里标题用“图像修复”感觉有点不合适。PM算法关键是通过随机抽样找到一些好的Patch进行匹配,然后将这些匹配快速传播到周围的区域( The key insights driving the algorithm are that some good patch matches can be found via random sampling, and that natural coherence in the imagery allows us to propagate such matches quickly to surrounding areas.)。我的理解是抱大腿,在某一片区域补上后,其他相邻区域抱这块区域的大腿,继续扩散。这样做可以避免全局暴力搜索,提升算法效率。
PM算法不能保证每个patch都能找到最优匹配,但是可以达到整体上的近似最优,因此作者在文中的用词是近似最近邻搜索。在下图中A是参考图,B是目标图。对于A中每个Patch,都要在B中寻找某种规则下与之最匹配的patch,都要在B中寻找在某种规则下最匹配的patch,这样就构成了A中的一个patch到B中的一个patch的映射。而最近邻场(Nearest-Neighbor Field(NNF))用于记录所有从A到B的映射集合,考察A中在坐标a处有一个patch,与之对应的B中最近邻的patch的位置b,那么定义
f
(
a
)
=
b
−
a
f(a)=b-a
f(a)=b−a,也就是说这种映射记录的是目标块相对于参考块的坐标偏移量(offset)。