patchmatch算法

1 核心思想

random sampling and data coherence

2 算法目的

quickly finding approximate nearest neighbor matches between image patches

3 问题描述

给定两张图像A B, 对图像A中的每个patch,找到图像B中与之匹配度最高的patch.

3.1 一些定义

  • NNF(nearest-neighbor field)
    定义NNF为$f: A \rightarrow R^2$,假如图像A中的patch a与图像B中的patch b对应, $f(a) = b - a$, patch的坐标使用patch中心的坐标代替,同时需要定义距离函数$D$。

4 算法步骤

问题简化为:为图像A中的每个patch a计算f(a)的值

4.1 initialization 初始化

为图像A中的每一个patch a赋值随机的f(a)
(在图像B中进行独立的均与采样(independent uniform sampling))

  • 或者使用prior information
  • 迭代
    接下来的需要对每个像素迭代进行propagation和random search来改进f(a)的值, 遍历像素的顺序为从左到右,从上到下,且不是所有像素都完成propagation后进行random search,而是对每一个像素进行完propagation后立刻进行random search。

4.2 propagation 传播

利用$f(x-1, y)$和$f(x, y-1)$的值来改进$f(x, y)$
$f(x, y)$的新值是$min(D(f(x,y)), D(f(x-1, y)), D(x, y-1))$对应的$(x,y)$

  • $D$为距离函数
  • 在偶数次迭代可以使用从右往左,从下往上的顺序迭代

4.3 random search 随机搜索

$u_i = v_0 +wa^iR_i$
$v_0 = f(x, y)$,$R_i$为$[-1,1]\times[-1,1]$,$w$为搜索窗口大小,$a_i$为每次搜索窗口衰减的比例
即以f(x, y)为中心的window进行搜索

  • 停止条件即搜索半径小于等于1个像素:$wa^i < 1$

5 一幅图说明


约定: 下文称f(a)为a的offset

需要搜索A图像中蓝色patch的offset, 红色patch是蓝色的left patch, 绿色patch是蓝色patch的up patch。

在( a )initialization中可以看到A图中3个颜色的patch被赋予了B图中随机的offset。

在( b )proagation中检查红色patch和绿色patch在B图中的offset是否比蓝色patch的offset更加match,可以看到红色的ofset更加match,于是更新蓝色patch的offset。

在( c ) random search中,以( b )中更新的offset为中心的window进行随机搜索。

重复( b )( c )步骤直到收敛。

6 GPU实现

思路: propagation和random search阶段并行。

矛盾: propagation之前的CPU version是以scanline的形式进行,这意味着propagation是有先后顺序。

解决方案: jump flood scheme

7 分析

假设图像A B都是M像素,考虑所有像素都被初始化到错误的offset的概率为$(1-1/M)^M$, 则至少有一个像素被初始化到正确的offset的概率为$1 - (1-1/M)^M$
M很大的时候近似为$1 - 1/e$。

由于在random search阶段的时候,在小的邻域范围内的搜索是很密集的,可以认为只要在正确的offset一定领域内的offset都可以认为是正确的。

基于以上的考虑,propagation和random search可以大大加速算法的搜索速度。

8 参考

PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing