计算机图形学poisson Image Editing泊松图像融合算法
poissonImageEditing
1. 概述
为了解决将源图像的一部分区域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值。融合图像内容平滑,边界处无明显痕迹,实现图像边界过渡自然的效果,如下图右边所示。
2. 问题描述
如果想把源图像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,
公式3在狄利克雷边界约束下的泊松方程为
与公式1和2相比,仅仅是改变了等式右边由 v \mathbf{v} v计算的散度值。由梯度场 v \mathbf{v} v引导泊松方程使融合图像保留源图像纹理,并过渡自然,但如何快速求解泊松方程?
3. 离散泊松求解
对于定义在任意边界上的狄利克雷边界条件问题,通过有限差分离散化将公式3的变分问题转化为离散二次最优问题进行求解,如公式6所示。(用拉普拉斯算子邻边矩阵构建下式)
符号解释:
p p p或者 q q q:表示一个像素点;
N p N_p Np:表示与像素点p相邻的四个像素的集合(上下左右);
< p , q > <p,q> <p,q>:表示满足 q ∈ N p q \in N_p q∈Np的像素对;
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的计算公式。计算源图像 g g g的梯度场 v \mathbf{v} v;
- 计算目标图像的梯度场;
- 计算融合图像的梯度场;
- 对步骤3的梯度场进行求偏导,得到融合图像的散度 b b b;
- 通过非边界点与拉普拉斯卷积核进行卷积,和边界点的约束条件来构建稀疏矩阵 A A A;
- 求解线性方程 f = A − 1 ∗ b f = A^{-1} * b f=A−1∗b, f f f为融合图像的每个点的RGB值。
4. 算法应用
4.1 图像融合
4.1.1 Seamless cloning
无缝融合是本论文比较重要的应用,它是把源图像中的梯度场作为引导场 v \mathbf{v} v,即 v = ∇ g \mathbf{v}=\nabla g v=∇g, g g g是源图像。
带入公式4得,
,通过带入公式7求解线性方程,得到融合图像每个像素点的颜色值。
效果如下图所示。
左边为源图像和目标图像,中间cloning是把源图像直接复制到目标图像中,右边为算法的无缝融合。
无缝融合能保留源图像的全部内容(包括纹理,源图像里的背景),但有时只想保留源图像中的主要纹理信息,而源图像的背景要与目标图像融合,不显突兀,这就需要改变引导场 v \mathbf{v} v。
4.1.2 Mixing gradients
Mixing gradients是保留源图像和目标图像中各自的高频细节,则相应的引导场取两者之间较大的部分。
具体做法是先判断两者绝对值梯度的大小,然后取较大值作为融合图像的引导场,并求偏导得融合图像的散度,最后带入泊松方程求解,得到每个点的RGB值。混合梯度效果如下图d所示。
4.2 选区编辑Selection editing
图像融合的引导场部分或全部依赖于源图像,而选区编辑是在单一图像上取一块区域,对这个区域进行处理,使用完全依赖于原始图像的引导场来对其进行变换。
4.2.1 Texture flattening
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)为边缘检测器时,引导场可以表示为以下离散形式。当边缘检测器选择性越强(选择的边缘越少),边缘映射就越系数,扁平化效果就越明显。
用算法对人脸进行扁平化处理,效果如下图所示。
4.2.2 Local illumination changes
Fattal提出一种平滑地修改普通图片的动态范围(亮度从最低到最高的范围)的方法。将此方法用于校正选中区域亮度,并用恰当的狄利克雷边界条件用于选区的边界,则引导场在对数域(x≥0)上定义为
其中 α ∗ ∣ ∇ f ∗ ∣ a v g \alpha*|\nabla f^*|_{avg} α∗∣∇f∗∣avg,β=0.2
在逆光下人脸会显得很暗,看不清细节,可以用算法调高人脸亮度;或者算法也可以降低物体的亮度,效果如下图所示。
5. 实验结果
直接调用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)
自己写的核心代码
6. 后续算法优化
[Jiaya Jia et al. Drag and-drop pasting]于2006年提出了最优的融合边界用于改进泊松图像编辑的效果,[Zeev Farbman et al. coordinates for instant image cloning]在SIGGRAPH 2009中提出了使用Mean-Value coordinates用于计算基于梯度域的图像编辑,该方法实现简单且运行速度快,从而避免了求解复杂的泊松方程。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiagckh
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22