图像填充方法概述
总说
这里主要讲解Inpainting的主要发展历程。从2001年到2014年的图像填充方法概述。
1. ImageInpainting(00年)
2. Simultaneous Structure and Texture Image Inpainting
3. Object Removal by Exemplar-Based Inpainting
4. Shift-Map Image Editing
5. PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing
6. The Generalized PatchMatch Correspondence Algorithm
7. Image Completion Approaches Using the Statistics of Similar Patches
8. Image Inpainting (14年总结性的inpainting文章)
TODO
暂时不写第八篇了,有点累。以后再写吧。。
Image Inpainting(00年)
简单来说,该文章提出Inpainting的方法就是从已知区域往未知区域,逐步向内填充。
填充的公式如下:
而
慢慢缕缕:未知区域定义为
如何定义N→(i,j)
如何定义呢?一个简单的想法是,定义成垂直于边界
对于每个点(在
这样的设定
定义:
实际操作
Inpainting方式
先计算
再算
再弄
再算
理论上这样基本的东西就算完了,但是论文中说为了增加数值稳定性,多计算了一个系数
具体含义就不说了。
扩散过程
为了保证方向场的正确的演变,在填充过程中,需要加入扩散过程。一般是执行几次填充,再执行几次扩散。采用各向异性的扩散,从而防止边界被抹平。
论文中说加入扩散过程是为了防止弯弯曲曲的线交错。
其中,
实际操作
取
论文中采用每15次Inpainting操作,2次扩散操作,
Simultaneous Structure and Texture Image Inpainting
这篇论文的主要思想是,将图像进行分解,分解成结构和纹理。其中结构部分用扩散方式的Inpainting,而纹理部分采用采样的方式生成。
图像分解
图像分解方法采用 Modeling textures with total variation minimization and oscillating patterns in image processing 方法。
认为图像
纹理生成
对于
图像填充
这个填充的方式与上篇文章的几乎是一样的。就是
这个没啥好说的了,其实就是拉普拉斯算子(图像的一个光滑函数)的梯度沿着等照度线方向的投影。跟上面是一样的。显然当达到稳态时,
值得注意的是,进行这种基于diffusion的Inpainting,每进行几次Inpainting,就要进行一次各向异性的diffusion。
Object removal by examplar-based inpainting
以前都是慢慢往里面填充,比如diffusion的方式,或是前面一篇,都是一个点一个点往里面填,速度慢。这篇论文开始一块一块直接往里面填入。
直接看图:
大体流程
我们要往里面填入,那么有没有填的快一点的,不要一个点一个点了,直接一块一块往里塞。那直接找边缘
另外一点是,这个
具体方法
每个点: 具体值,以及 confidence value。这个confidence value一旦被填充了,则值固定不变。
同时对于
前一项是confidence term,后面是data term。
那么
所以就是
其中
也就是说,块的优先级一方面决定于其内部的点的优先级(含high confidence的像素越多,优先级越高
另一方面,
而另一方面,该论文还考虑了,往内部填充我们还是要遵循不要破坏等照度线(主要体现在图像边缘上),即保持边缘不被破坏。那么自然就会想到
最后附加文中说的一段话:
There is a delicate balance between the confidence and data terms. The data term tends to push isophotes rapidly inward, while the confidence term tends to suppress precisely this sort of incursion into the target region. As presented in the results section, this balance is handled gracefully via the mechanism of a single priority computation for all patches on the fill front.
填充伪代码:
忘说了,就是当用
Shift-Map Image Editing
总说
其实这个可以用来做多个东西,Inpainting只是其中一个方面。他的一个应用方面就是,retargeting,翻译是图像重定向。就是说有时候拍的图片长宽比例让你不爽,于是你直接rescale,你就会发现里面的人不是拉长了就是压短了。你会觉得很无奈。不过retargeting就是可以解决这个问题。
先给一张图:
其实核心方法就是,它会删除原图的某些不重要的像素。比如最后一幅图白色线抹去了,诡异的是,你发现路的开头还是有的,但是后面的线直接断了。其实人观察一幅图会更加关注前面的鸟,所以附带线就有了~~而如何知道人观察一幅图关注图的哪些部分呢?这是另一个分支,研究图的哪些部分人的关注程度,称之为saliency map.
不论是 retargeting, inpainting还是object rearrangement, 这些操作都可以用一个shift-map来表示:输出图的每个像素,其相对于输入图的像素的偏移。 比如,输出图的某个点
Graph labeling
把图看成一个graph labeling问题。graph labeling简单就是说,对于每个像素看个图的一个结点,给每个结点赋予一个label,从而使得某个能量函数最优。
输入图是
即输出图的
最优的shift-map定义成graph labeling问题,其中每个输出像素都被赋予一个label,即shift值
前面是数据项,后面是平滑项。论文中使用multi-label graph cuts来解决这个问题。
数据项
对于不同的任务,数据项的定义是不一样的。
比如 removal的话,我们可以让输入图的特定点在输出图消失。如果用saliency map的话,
点对的平滑项
直接看公式:
说明不仅考虑pixel value还考虑了相应的梯度。其中
Graph labeling的层级解决方案
这个其实没啥好说的,就是现在的多分辨率方案。先在低分辨的图上进行graph labeling,得到相应的shift-map,然后上采样, 上采样后的图像的初始shift-map就用相应的shift-map进行最近邻插值就行(防止出现非整数)。那么现在不用全局优化函数了,只需要在插值后的shift-map的“邻域”找就行。论文中就是直接在每个点的八邻域中寻找。
论文中建立了五层,最开始是
如何进行Inpainting
其实只要将不想要的区域的saliency map的数据项标记成为无穷大就行。
PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing
PS从CS5开始有了填充功能,他们称之为Content-Aware-Fill,其实PS的填充就是PatchMatch与“Space-time video completion”的结合。PatchMatch是2009年出的,所以也就是为什么2010年CS5发行采用填充这个功能。
算法
这篇论文的主要工作就是快速查找最近邻图像块,称为NNF(nearest-neighbor field)。NNF是一个函数
算法主要分为两个个步骤:
1. 初始化(随机即可)
2. 迭代:Propagation以及Random Search,交替进行。
初始化
初始化没啥好说的,用均匀分布初始化就行。一般来说,算法是先初始化,再迭代。再上采样,再迭代….都是遵循coarse-to-fine的方式。那么上采样时,初始化更高分辨率的NNF时,这里有点特殊。论文中是将两种进行结合:
1. 直接上采样(nearesetUpSample)初始化
2. 随机初始化
然后再将两个初始化结合,对每个点,从两种NNF中选择最好的(直接比两个图像对的距离,选择距离小的那个NNF)从而形成这个分辨率的NNF初始化。
Propagation
核心思想是这样的,如何改进
既然是这样,那么对于
公式化点的方式就是,我们想改善最近邻偏移
举个具体例子解释:
假设有
显然如果
最后一点是,奇数次迭代时,Propagation顺序是从左到右,从上到下;偶数次反过来的顺序。
Random Search
虽然Propagation收敛特别快,但是特别容易陷入局部最小。Random Search通过将每个点检查其周围的点的匹配,从而更新该点的匹配,从而消除这个问题。
对于某个点(x,y),其在
其中
Editing Tools
这个挺有意思的,就是可以交互性的填充。 简单来说就是自己限定缺失区域的点的label与外部区域的点的label。第二幅图,用红色来将右边的白色花移动到左边。
The Generalized PatchMatch Correspondence Algorithm
总说
这篇是PatchMatch的改进,改进主要有以下三点:
1. 查找k个最近邻(以前是查找与一个,即每个点只有一个NNF)
2. 跨尺度以及旋转角度的搜索
3. 可以用任意的算子和距离计算,而不仅仅是平方误差和。
第一点就是,比如对于object detection,我们希望对于每个查询的patch,能找到多个匹配。
第二点就是,对于超分辨,输入可以是不同的尺度的,而object detection也是希望不同旋转角度的物体都能检测。
第三点就是,对于物体识别,图像块对于外观和几何形状改变来说,不够鲁棒。
k neaerest neighbors
这个没啥好说的,就是以前NNF只有一个值,现在对于每个点有多个就行。propagation和random search检查的点,都相当与乘以k。
Enrichment
原先的propagation只是将good matches沿着矩形网格进行传播,而这里是将good matches沿着graph进行传播。图中的每个点就是它的KNN。
前向 enrichment
那么这个升级版的NNF就是:
反向 enrichment
显然
Rotations and scale
定义NNF:
就是对于
假设矩阵记为
同理,在Random Search阶段,直接所有参数都是按照指数递减的就行。
Image Completion Approaches Using the Statistics of Similar Patches
总说
这篇的Introduction写的挺全面的。
这篇论文的核心思想就是,一幅图像内部,相似的图像块之间的offset的统计结果是稀疏的。
比如这幅图,最相近小块之间的offset基本就是几个特定的值。
以前的填充,直接是从外部找最近的小块,一般不考虑这些offset的值是否太大还是太小。这篇论文在匹配时引进了offset的统计信息(用直方图),只在特定的几个offset中找到最匹配的块!不再是全局查找了。
统计patch offset的信息
这个
然后计算直方图
等式成立,
论文中,取了K=60个主要的offsets。
利用主要的offsets进行填充
因为基于样本的又可以分为基于graph labeling以及matching patches的。比如Shift-map就是前者,PatchMatch就是后者。前者就是定义一个能量函数,数据项和平滑项,然后用graph cut通用算法来解。后者采用直接找最近块匹配。这篇论文的相似块偏移量的统计信息可以用于两种方法。
Graph-based
给定
这样设计数据项,可以保证填入的都是用
平滑项的定义:
值得注意的是:
看图,如果
Matching-based
这个真的没啥好说的,
其中只能是从