为了解决将源图像的一部分区域ROI(Region of Interest)直接复制到目标图像时,边界过渡不自然的问题,如下图中间所示。本论文提出seamless cloning无缝融合算法,其主要实现思想是,首先把ROI的梯度场覆盖到目标图像的梯度场上,得到融合图像的梯度场,对其求偏导,得到散度 b b b,然后通过非边界点与拉普拉斯卷积核进行卷积,并且通过边界点的约束条件,得到稀疏矩阵 A A A,最后通过求解 A f = b Af = b Af=b方程, f f f就是融合图像的每个像素点的R,G,B值。融合图像内容平滑,边界处无明显痕迹,实现图像边界过渡自然的效果,如下图右边所示。
如果想把源图像ROI区域 g g g复制到目标图像S,直接复制会导致内容不平滑而且边界过渡不自然。为了解决这个问题,需要保持融合图像中源图像ROI所覆盖的目标区域Ω的纹理,并使目标区域和目标图像的边界 ∂ Ω \partial \Omega ∂Ω的像素值与目标图像的像素值相同。
即需要最小化公式1的泊松函数,公式前部分使Ω区域梯度尽可能小,满足ROI内容平滑;公式后部分, f f f表示融合图像在Ω内的像素值表示函数(待求解), f ∗ f^* f∗表示在Ω外的像素值表示函数,满足边界过渡平滑则需要两者相等。
公式1的解满足欧拉-拉格朗日方程,即公式2所示,
Δ f \Delta f Δf表示 f f f二阶微分(直角坐标系下的散度div),即拉普拉斯算子,也就是二阶梯度 ∇ 2 \nabla ^2 ∇2。
因为当一阶微分取极值时,二阶微分为0,所以在梯度最小时,散度为0,即公式2。
已知区域Ω内的散度都是0,以及边界上已知的像素值,即可求出Ω内部所有像素值。这样融合图像ROI区域内容平滑,但不能保持其纹理,显得图像很模糊。
融合图像效果不好,是因为没有引导算法在ROI区域填充什么内容,所以现在我们需要用到引导向量场Guidance vector field(梯度场),如上图左边的 v \mathbf{v} v所示。
梯度可以用来反映图像中亮度改变最明显的区域,也就是说可以用梯度来捕捉图像上的亮度变化,梯度的方向在图像灰度的最大变化率上,它恰好可以反映出图像边缘的灰度变化。所以在上图中右下角比较亮,左上角比较暗。
融合图像维持源图像的纹理信息,并边界处无明显痕迹,则需要满足公式3,
与公式1和2相比,仅仅是改变了等式右边由 v \mathbf{v} v计算的散度值。由梯度场 v \mathbf{v} v引导泊松方程使融合图像保留源图像纹理,并过渡自然,但如何快速求解泊松方程?
对于定义在任意边界上的狄利克雷边界条件问题,通过有限差分离散化将公式3的变分问题转化为离散二次最优问题进行求解,如公式6所示。(用拉普拉斯算子邻边矩阵构建下式)
符号解释:
p p p或者 q q q:表示一个像素点;
N p N_p Np:表示与像素点p相邻的四个像素的集合(上下左右);
< p , q >
f p f_p fp:表示 f f f在 p p p处的值;
v p q v_{p q} vpq:表示 v ( p + q 2 ) \mathbf{v}\left(\frac{p+q}{2}\right) v(2p+q)在方向边缘 [ p , q ] [p,q] [p,q]上的投影;
∂ Ω = { p ∈ S \ Ω : N p ∩ Ω ≠ ∅ } \partial \Omega=\left\{p \in S \backslash \Omega: N_{p} \cap \Omega \neq \emptyset\right\} ∂Ω={p∈S\Ω:Np∩Ω=∅}:表示边界不属于融合图像Ω,但边界点的四连通领域至少有一个点在融合图像Ω上:
f ∣ Ω = { f p , p ∈ Ω } \left.f\right|_{\Omega}=\left\{f_{p}, p \in \Omega\right\} f∣Ω={fp,p∈Ω}:表示融合图像Ω的像素值,也是公式7要求解的内容。
公式6要求融合图像Ω内待求像素值梯度要和源图像一致;并且在边界区域 ∂ Ω \partial \Omega ∂Ω待求像素值要和目标图像一致。
公式6的解满足公式7的线性方程(此方程由所有在Ω上的点 p p p与拉普拉斯卷积核进行卷积,并且计算 p p p的相邻点 q q q在边界处的约束条件累加而成)。
求解这个线性方程的步骤如下。
无缝融合是本论文比较重要的应用,它是把源图像中的梯度场作为引导场 v \mathbf{v} v,即 v = ∇ g \mathbf{v}=\nabla g v=∇g, g g g是源图像。
带入公式4得,
,通过带入公式7求解线性方程,得到融合图像每个像素点的颜色值。
效果如下图所示。
左边为源图像和目标图像,中间cloning是把源图像直接复制到目标图像中,右边为算法的无缝融合。
无缝融合能保留源图像的全部内容(包括纹理,源图像里的背景),但有时只想保留源图像中的主要纹理信息,而源图像的背景要与目标图像融合,不显突兀,这就需要改变引导场 v \mathbf{v} v。
Mixing gradients是保留源图像和目标图像中各自的高频细节,则相应的引导场取两者之间较大的部分。
具体做法是先判断两者绝对值梯度的大小,然后取较大值作为融合图像的引导场,并求偏导得融合图像的散度,最后带入泊松方程求解,得到每个点的RGB值。混合梯度效果如下图d所示。
图像融合的引导场部分或全部依赖于源图像,而选区编辑是在单一图像上取一块区域,对这个区域进行处理,使用完全依赖于原始图像的引导场来对其进行变换。
Texture flattening纹理扁平化是利用稀疏筛(sparse sieve)对图像梯度 ∇ f ∗ \nabla f^* ∇f∗进行处理,只保留最突出的特征。
对于属于ROI区域的像素点 x \mathbf{x} x而言,它的引导场可以表示为
,其中 M ( x ) M(\mathbf{x}) M(x) 为二进制蒙版,即保留大于 M ( x ) M(\mathbf{x}) M(x)阈值的特征,扁平化小于 M ( x M(\mathbf{x} M(x阈值的特征。
当M(x)为边缘检测器时,引导场可以表示为以下离散形式。当边缘检测器选择性越强(选择的边缘越少),边缘映射就越系数,扁平化效果就越明显。
Fattal提出一种平滑地修改普通图片的动态范围(亮度从最低到最高的范围)的方法。将此方法用于校正选中区域亮度,并用恰当的狄利克雷边界条件用于选区的边界,则引导场在对数域(x≥0)上定义为
其中 α ∗ ∣ ∇ f ∗ ∣ a v g \alpha*|\nabla f^*|_{avg} α∗∣∇f∗∣avg,β=0.2
在逆光下人脸会显得很暗,看不清细节,可以用算法调高人脸亮度;或者算法也可以降低物体的亮度,效果如下图所示。
直接调用opencv里面的seamlessClone函数,进行图像无缝融合和混合梯度融合。
# Standard imports
import cv2
import numpy as np
# Read images
src = cv2.imread("./img/source3.jpg")
dst = cv2.imread("./img/target3.jpg")
src_mask = cv2.imread("./output2/mask.jpg")
# Create a rough mask around the airplane.
# src_mask = np.zeros(src.shape, src.dtype)
# poly = np.array([[181,178],[124,178],[120,185],[110,185],[96,208],[93,237],[82,209],[73,247],[90,202],[80,287],[100,285],[132,315],[208,320],[251,299],[263,270],[268,218],[238,188],[209,176]], np.int32)
# mask = cv2.fillPoly(src_mask, [poly], (255, 255, 255))
# cv2.imwrite("./output2/mask.jpg", mask)
# This is where the CENTER of the airplane will be placed
center = (120,536)
# Clone seamlessly.
# Normal Cloning
output1 = cv2.seamlessClone(src, dst, src_mask, center, cv2.NORMAL_CLONE)
# Mixed Cloning
output2 = cv2.seamlessClone(src, dst, src_mask, center, cv2.MIXED_CLONE)
output3 = cv2.seamlessClone(src, dst, src_mask, center, cv2.MONOCHROME_TRANSFER)
# Save result
cv2.imwrite("./output2/opencv-seamless-cloning-example.jpg", output1)
cv2.imwrite("./output2/opencv-seamless-cloning-example2.jpg", output2)
cv2.imwrite("./output2/opencv-seamless-cloning-example3.jpg", output3)
[Jiaya Jia et al. Drag and-drop pasting]于2006年提出了最优的融合边界用于改进泊松图像编辑的效果,[Zeev Farbman et al. coordinates for instant image cloning]在SIGGRAPH 2009中提出了使用Mean-Value coordinates用于计算基于梯度域的图像编辑,该方法实现简单且运行速度快,从而避免了求解复杂的泊松方程。