Criminisi 和 Telea 图像修复算法记录
Criminisi 算法
2003 年的老论文:Region Filling and Object Removal by Exemplar-Based Image Inpainting
填充方法
其实就是 patch-based 方法,这种在 NLM 去噪、纹理合成、图像配准等等都类似,看下图就马上明白了,就是找相似块:
块中的内容是直接全体复制过去的,这样加快点速度,不然要一个像素一个像素做,实在太慢。
填充顺序
填充的顺序对于图像修复的算法也很关键,Criminisi 算法是按照自己定义的优先级去找点的:
其中 \(n_p\) 表示当前边界的垂直方向,\(\nabla I_p\) 表示梯度转 90 度,如下图所示:
回看这个公式,对于 \(C(p)\) 很好理解,这个类似权重项,每个已知或者已经补充过的点,都是一个权重值。但其实这里的 \(D(p)\) 我没有很理解这样做的意图,原文的话如下,只能说不用过分纠结细节吧:
The data term \(D(p)\) is a function of the strength of isophotes hitting the front \(\Omega\) at each iteration. This term boosts the priority of a patch that an isophote "flows" into. This factor is of fundamental importance in our algorithm because it encourages linear structures to be synthesized first, and therefore propagated securely into the target region. Broken lines tend to connect, thus realizing the "Connectivity Principle" of vision psychology.
数据项 \(D(p)\) 是每次迭代中撞击前沿区域 \(\Omega\) 的等照度线强度的函数。该术语会提升被等照度线"流入"的补丁块的优先级。这一因素在我们的算法中至关重要,因为它促使线性结构被优先合成,从而能够安全地传播到目标区域。断开的线条倾向于相互连接,这实现了视觉心理学的"连通性原则"。
当补充完之后,会当前块中原来未知像素的 \(C(x)\) 值,文章就简单地赋值为当前块的中心点(即 p 点)的 \(C(p)\) 值。
Telea 算法
2004 年的老论文:An Image Inpainting Technique Based on the Fast Marching Method
填充方法
Telea 算法的补充和 Criminisi 完全不同,用的是叫做 FMM 的方法:
如上图所示,假如我们打算利用 \(q\) 点来补充 \(p\) 点,那么补充方法如下:
那么,对于一个要补充的像素点而言,就根据周围已知的点进行补充,最后求个加权平均:
其中 \(w\) 表示权重,它的计算方式也挺复杂的... 所以其实这也是作者强行设计的一个方式,不需要过分纠结:
各个条目如下:
方向因子 \(dir(p,q)\) 保证了越靠近法线方向 N=∇T 的像素点对 p 点的贡献最大。前面第一项表示 p 连接 q 的单位向量。
几何距离因子 \(dst(p,q)\) 保证了离 p 点越近的像素点对 p 点贡献越大。\(d_0\) 是自己定义的值,一般取值为 1。
水平集距离因子 \(lev(p,q)\) 保证了离经过点 p 的待修复区域的轮廓线越近的已知像素点对点 p 的贡献越大。\(T_0\) 是自己定义的值,一般取值为 1。\(T(p)\) 表示 p 点到边界的距离。
填充顺序
Telea 算法的填充顺序就是从外到内一层一层开始。这个就叫做快速行进算法,Fast Marching Method(FMM),很扯,专有名词总是唬人。