最近patchmatch算法,这是一个很神奇的算法,利用概率的思想进行快匹配。
有些文章也讲过Patchmatch算法,写的不错,我这里就用最好理解的语言记录下自己的理解吧。
patchmatch 算法可以分为3步。下面用图的方式展示出来;
第一步:初始化
翻译为:初始化,讲A图中每一个像素,随机的赋予一个便宜量,在B图中找到一个像素与之对应。
图中为选取了全图的3个像素作为展示。
第二步:传播
这个过程我理解了一会儿,首先翻译为:每个像素检查来自相邻块的偏移是否提供了更好的匹配, 如果是,则采用邻居的补丁偏移量。(不好理解吧)
下面是我的理解:看图,就是首先以A中蓝色的块和B中对应的偏移的块做一个相似度比较,记录为simliar1,然后讲蓝色块又和B中绿色和红色的块做相似度比较,记录为simliar2(绿色),simliar(红色),比较simliar1,simliar2,sinliar3,B哪一个块和A中蓝色块最相似,就将A中对应块的的偏移量赋值给蓝色块(就是这里不好理解,我举个例子,如果simliar1最大,这A中蓝色块的偏移量不变,还是对应B中蓝色块,如果simliar2最大,则将A中绿色块的偏移量赋值给蓝色块。这样蓝色快对应的就是B中绿色块了,如果simliar3最大,则同理,将A中红色块的偏移量赋值给蓝色块。这样蓝色快对应的就是B中红色块了)。这样懂了吧,
很显然,这个过程是找不到最匹配的块的,所以就有第三步:搜索
翻译:每一个像素点在以现在的偏移量为中心的同心圆内部,找到一个更加匹配的偏移量,代替当前偏移量 。
搜索的半径开始为图片的尺寸,然后以1/2的收敛速度减少半径,直到radius=1,结束。(我觉得这个收敛速度不一定是1/2,越大,收敛的越慢,但是越准确。)
好了,现在有了这3步,就可以开始迭代了,也就是重复第2和第3步,直到每个像素点都找到最合适最准确的偏移量,也就是A中每个像素都找到B中与之最匹配的像素。一般5次迭代就够了。
大家看了,然后结合一下相关代码,应该就可以理解这个算法啦。