PatchMatch核心算法(一)

最近patchmatch算法,这是一个很神奇的算法,利用概率的思想进行快匹配。
有些文章也讲过Patchmatch算法,写的不错,我这里就用最好理解的语言记录下自己的理解吧。

patchmatch 算法可以分为3步。下面用图的方式展示出来;
第一步:初始化
PatchMatch核心算法(一)_第1张图片

翻译为:初始化,将A图中每一个像素,随机的赋予一个偏移量(offset),在B图中找到一个像素与之对应。
图中为选取了全图的3个像素作为展示。

第二步:传播
PatchMatch核心算法(一)_第2张图片

这个过程我理解了一会儿,首先翻译为:每个像素检查来自相邻块的偏移是否提供了更好的匹配, 如果是,则采用邻居的补丁偏移量。(不好理解吧)
下面是我的理解:看图,就是首先以A中蓝色的块和B中对应的偏移的块做一个相似度比较,记录为simliar1,然后将蓝色块又和B中绿色和红色的块做相似度比较,记录为simliar2(绿色),simliar3(红色),比较simliar1,simliar2,sinliar3,B哪一个块和A中蓝色块最相似,就将A中对应块的的偏移量赋值给蓝色块(就是这里不好理解,我举个例子,如果simliar1最大,这A中蓝色块的偏移量不变,还是对应B中蓝色块,如果simliar2最大,则将A中绿色块的偏移量赋值给蓝色块。这样蓝色快对应的就是B中绿色块了,如果simliar3最大,则同理,将A中红色块的偏移量赋值给蓝色块。这样蓝色快对应的就是B中红色块了)。这样懂了吧,

很显然,这个过程是找不到最匹配的块的,所以就有第三步:搜索

PatchMatch核心算法(一)_第3张图片

翻译:每一个像素点在以现在的偏移量为中心的同心圆内部,找到一个更加匹配的偏移量,代替当前偏移量 。
搜索的半径开始为图片的尺寸,然后以1/2的收敛速度减少半径,直到radius=1,结束。(我觉得这个收敛速度不一定是1/2,越大,收敛的越慢,但是越准确。)

好了,现在有了这3步,就可以开始迭代了,也就是重复第2和第3步,直到每个像素点都找到最合适最准确的偏移量,也就是A中每个像素都找到B中与之最匹配的像素。一般5次迭代就够了。

大家看了,然后结合一下相关代码,应该就可以理解这个算法啦。

在图像重构中的应用:
步骤:
1.给定A,B两幅图(A清晰,B模糊),在A中寻找清晰的块重构B,取代模糊的B
2.初始化一个offset矩阵,B中每个模糊的Patch的中心点坐标加上offset矩阵中的偏移量,就对应A中内容相同的清晰的块.
这个对应肯定是错的,所以要更新offset矩阵中的偏移值.
3.开始迭代(迭代的目的就是更新offset矩阵的偏移值,让对应关系变得更加准确),
每次迭代包括传播和随机搜索两个过程.
3.1.传播:
计算模糊B中patch和A中对应清晰的3个patch的均方差值,这3个patch就是当前offset对应的patch+往左边偏移一个pixel的patch+往上边偏移一个pixel的patch,取最小的一个patch的偏移量的坐标跟新当前的offset,也可能不更新.
3.2.随机搜索
在清晰块A中,以当前patch的中心点为中心,初始半径区域为全图,在这个区域内部随机寻找清晰块和模糊Bpatch做均方差,如果差值更小就跟新offset,根据新的offset从新更新A中搜索区域中心点,接着上一次的收缩速度收缩半径缩小,直到缩小的半径为1,停止本次迭代.
4.根据多次迭代后的offset表,在清晰图A中找块来重构B.

你可能感兴趣的:(图像处理,openCV)