• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

计算机图形学poisson Image Editing泊松图像融合算法

武飞扬头像
Baily24
帮助2

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 qNp的像素对;
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\} Ω={pS: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在边界处的约束条件累加而成)。
学新通

求解这个线性方程的步骤如下。

  1. 根据不同需求,定义不同的 v \mathbf{v} v的计算公式。计算源图像 g g g的梯度场 v \mathbf{v} v
  2. 计算目标图像的梯度场;
  3. 计算融合图像的梯度场;
  4. 对步骤3的梯度场进行求偏导,得到融合图像的散度 b b b
  5. 通过非边界点与拉普拉斯卷积核进行卷积,和边界点的约束条件来构建稀疏矩阵 A A A
  6. 求解线性方程 f = A − 1 ∗ b f = A^{-1} * b f=A1b, 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} α∣∇favg,β=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)
学新通

学新通
关于如何制作mask

自己写的核心代码
学新通
学新通

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
系列文章
更多 icon
同类精品
更多 icon
继续加载