前面介绍了基于边界优先级的图像填充和基于投票加权的填充方式,再实现了另外一个基于graph-cut的算法,应该算是实现的最后一个图像填充传统算法了。貌似目前用传统算法的已经不多了,看到Github上传统算法star基本个位数,star比较高的基本都是deep learning的项目,感觉时代大潮席卷而过,deep learning毕竟可以通过训练学习的方式修复原本不存在于图片中的信息,仅仅这一点,是传统算法无论如何都逾越不了的。之后的工作中深度学习的应用也会更广泛,
Contribution
这篇papaer是hekaiming14年发的PAMI, 其主要贡献点是patch offset的稀疏性。
自然图像中存在自相似的冗余性,其patch块之间的偏移量也存在稀疏的特性,基本集中在几个点上。这篇paper首先计算出k个主要的offset,然后对图片进行offset然后堆叠起来,后续的操作就和photomontage是一样的了,通过设计data term和smooth term,对图像进行Graph-Cut后,最后利用Gradient-domain fusion的操作融合,减少边界缝隙的影响。
dominate offsets
图像patch的offset可以通过PatchMatch,CSH等算法快速计算出图像中每一个patch对应最近邻的偏移量直方图。 对于直方图进行简单的滤波和非极大值抑制,即可得到图像中最大的k个dominate offsets.
一个简单的样例如下。
原图 | offsets histogram |
---|---|
![]() |
![]() |
Graph-based inpainting
不同offset的图像可以看作一个stack堆叠起来,作为待填充区域的候选值,也就形成了一个graph。 每个需要填充的点对应于图的节点,该节点对应的offset值则作为需要获得的标签,inpainting问题转化为一个多标签的问题,找到每个像素点对应的offset也就完成了图像的填充。
通过data term和smooth term 计算图的最小割,这里我是用的GCO-v3.0开源软件实现的。
E ( L ) = ∑ x ∈ Ω E ( L ( x ) ) + ∑ ( x , x ′ ) ∣ x ∈ Ω , x ′ ∈ Ω E s ( L ( x ) , L ( x ′ ) ) E(L) = \sum_{x \in \Omega}E(L(x)) + \sum_{(x,x')|x \in \Omega, x' \in \Omega}E_s(L(x),L(x')) E(L)=