文献阅读 - Poisson Image Editing

1 泊松图像编辑(Poisson Image Editing )

泊松图像编辑(Poisson Image Editing)的核心观点是图像融合时,用色彩梯度代替色彩强度可以产生更真实的效果。

在这里插入图片描述

经无缝融合(seamless cloning)后,融合图像的蒙板区域内色彩强度与源图像的蒙板区域色彩强度不一致;但融合图像的蒙板区域内色彩梯度与源图像的蒙板区域色彩梯度基本相同。此外,融合图像的在蒙板区域边界处色彩强度与目标图像的色彩强度相同

参考文献:Rez P, Gangnet M, Blake A. Poisson image editing.[J]. Acm Transactions on Graphics, 2003, 22(3):313-318.

1.1 引言(Introduction)

该方法的数学思想是给定狄利克雷边界条件的泊松偏微分方程。

(1)图像中,拉普拉斯算子提取的二阶变化量在感知上最明显;

(2)唯一解:有界域上的标量函数可由其边界值和域内拉普拉斯算子唯一确定(即, φ ( x , y ) \varphi(x, y) φ(x,y) f ( x , y ) f(x, y) f(x,y) g ( x , y ) g(x, y) g(x,y)唯一确定,见1.2.0 泊松方程)。

泊松方程的求解过程也可理解为最小化问题:给定边界条件,在 L 2 L_2 L2范数意义下,计算梯度最接近引导向量场(guidance vector field)的函数。

1.2 导向插值求解泊松方程(Poisson solution to guided interpolation)

1.2.0 泊松方程(Poisson’s Equation)

  • 泊松方程

− Δ φ = f - \Delta \varphi = f Δφ=f

  • 狄利克雷边界条件(Dirichlet boundary condition)

微分方程的“第一类边界条件”,给定微分方程的解在边界处的值。

  • 给定狄利克雷边界条件的泊松偏微分方程

{ − Δ φ ( x , y ) = f ( x , y ) x , y ∈ Ω φ ( x , y ) = g ( x , y ) x , y ∈ ∂ Ω \begin{cases} -\Delta \varphi(x, y) = f(x, y) & x, y \in \Omega \\ \varphi(x, y) = g(x, y)& x, y \in \partial \Omega \end{cases} {Δφ(x,y)=f(x,y)φ(x,y)=g(x,y)x,yΩx,yΩ

其中 Ω ⊂ R n \Omega \subset R^n ΩRn为有界开集, Δ = ∂ 2 ∂ x 2 + ∂ 2 ∂ y 2 \Delta = \frac{\partial^2}{\partial x^2} + \frac{\partial^2}{\partial y^2} Δ=x22+y22为拉普拉斯算子(Laplacian operator)。

1.2.1 引导插值(Guided Interpolation)

  • 引导插值:利用引导向量场(guidance vector field)进行图像插值。

S S S R 2 R^2 R2的闭子集,表示图像的定义域;

Ω \Omega Ω S S S的闭子集,其边界为 ∂ Ω \partial \Omega Ω

f ∗ f^{\ast} f:定义在 Ω \Omega Ω域边界及外部( S − Ω + ∂ Ω S- \Omega + \partial \Omega SΩ+Ω)上的已知标量函数(scalar function);

f f f:定义在 Ω \Omega Ω域内部( Ω − ∂ Ω \Omega - \partial \Omega ΩΩ)上的未知标量函数(scalar function);

v \mathbf{v} v:定义在 Ω \Omega Ω域上的矢量场(vector field)

在这里插入图片描述

  • 最小化问题:

min ⁡ f ∬ Ω ∣ ∇ f − v ∣ 2 with  f ∣ ∂ Ω = f ∗ ∣ ∂ Ω \min_f \iint_{\Omega} \left| \nabla f - \mathbf{v} \right|^2 \quad \text{with} \ \left. f \right|_{\partial \Omega} = \left. f^{\ast} \right|_{\partial \Omega} fminΩfv2with fΩ=fΩ

(3)

其中, ∇ = [ ∂ ∂ x , ∂ ∂ x ] \nabla = \left[ \frac{\partial }{\partial x}, \frac{\partial }{\partial x} \right] =[x,x]为梯度算子(gradient operator),矢量场 v \mathbf{v} v引导场(guidance field)。该问题的解为给定狄利克雷边界条件的泊松偏微分方程的唯一解:

Δ f = ∇ ⋅ v  over  Ω with  f ∣ ∂ Ω = f ∗ ∣ ∂ Ω \Delta f = \nabla \cdot \mathbf{v} \ \text{over} \ \Omega \quad \text{with} \ \left. f \right|_{\partial \Omega} = \left. f^{\ast} \right|_{\partial \Omega} Δf=v over Ωwith fΩ=fΩ

(4)

其中, ∇ ⋅ v = ∂ u ∂ x + ∂ v ∂ y \nabla \cdot \mathbf{v} = \frac{\partial u}{\partial x} + \frac{\partial v}{\partial y} v=xu+yv表示 v = ( u , v ) \mathbf{v} = \left( u, v\right) v=(u,v)的散度(divergence)。

对于三通道彩色图像来说,泊松方程需要在三个通道上分别独立求解。

v \mathbf{v} v为保守场(conservative)即 v = ∇ g \mathbf{v} = \nabla g v=g时,可在 Ω \Omega Ω域上定义校正函数 f ~ \tilde{f} f~,使得 f = g + f ~ f = g + \tilde{f} f=g+f~。些时,泊松偏微分方程可转换成拉普拉斯方程:

Δ f ~ = 0  over  Ω with  f ~ ∣ ∂ Ω = ( f ∗ − g ) ∣ ∂ Ω \Delta \tilde{f} = 0 \ \text{over} \ \Omega \quad \text{with} \ \left. \tilde{f} \right|_{\partial \Omega} = \left. \left( f^{\ast} - g \right) \right|_{\partial \Omega} Δf~=0 over Ωwith f~Ω=(fg)Ω

因此,在 Ω \Omega Ω域内,附加校正 f ~ \tilde{f} f~就是源图像与目标图像之间沿边界 ∂ Ω {\partial \Omega} Ω的失配 ( f ∗ − g ) \left( f^{\ast} - g \right) (fg)的膜插值(membrane interpolant)。

1.2.2 离散泊松解算器(Discrete Poisson solver)

S S S:表示图像的一部分区域;

p p p:表示一个像素点;

N p N_p Np:表示与像素 p p p相邻的四个像素的集合;

< p , q > \left< p, q \right> p,q:表示满足 q ∈ N p q \in N_p qNp的像素对;

Ω \Omega Ω的边界表示为: ∂ Ω = { p ∈ S \ Ω : N p ⋂ Ω ̸ = ∅ } \partial \Omega = \left\{ p \in S \backslash \Omega: N_p \bigcap \Omega \not= \emptyset \right\} Ω={pS\Ω:NpΩ̸=}

f p f_p fp表示 f f f p p p处的值;

v p q v_{pq} vpq v ( p + q 2 ) \mathbf{v} \left( \frac{p + q}{2} \right) v(2p+q)在方向边缘(oriented edge) [ p , q ] \left[ p, q \right] [p,q]上的投影:

v p q = v ( p + q 2 ) ⋅ p q ⃗ v_{pq} = \mathbf{v} \left( \frac{p + q}{2} \right) \cdot \vec{pq} vpq=v(2p+q)pq

该任务为计算灰度强度的集合 f ∣ Ω = { f p , p ∈ Ω } \left. f \right|_{\Omega} = \left\{ f_p, p \in \Omega \right\} fΩ={fp,pΩ}

对于定义在任意边界上的狄利克雷边界条件问题,最好通过有限差分离散化(finite difference discretization)j将变分问题(variational problem)(3)转化为离散二次最优问题(discrete quadratic optimization problem)直接求解:

min ⁡ f ∣ Ω ∑ < p , q > ⋂ Ω ̸ = ∅ ( f p − f q − v p q ) 2 , with  f p = f p ∗ ,   ∀ p ∈ ∂ Ω \min_{\left. f \right|_{\Omega}} \sum_{\left<p, q\right> \bigcap \Omega \not= \emptyset} \left( f_p - f_q - v_{pq} \right)^2 , \quad \text{with} \ f_p = f_p^{\ast}, \ \forall p \in \partial \Omega fΩminp,qΩ̸=(fpfqvpq)2,with fp=fp, pΩ

(6)

【公式推导】

方程(6)的推导需要注意 N p N_p Np的定义, p q ⃗ \vec{pq} pq 至多只有 0 0 0 π 2 \frac{\pi}{2} 2π π \pi π 3 π 2 \frac{3 \pi}{2} 23π四个方向, ∣ N p ∣ ≤ 4 \left| N_p \right| \leq 4 Np4

其解满足联立线性方程组(simultaneous linear equations):

∣ N p ∣ f p − ∑ q ∈ N p ⋂ Ω f q = ∑ q ∈ N p ⋂ ∂ Ω f q ∗ + ∑ q ∈ N p v p q ,   ∀ p ∈ Ω \left| N_p \right| f_p - \sum_{q \in N_p \bigcap \Omega} f_q = \sum_{q \in N_p \bigcap \partial \Omega} f^{\ast}_q + \sum_{q \in N_p} v_{pq}, \ \forall p \in \Omega NpfpqNpΩfq=qNpΩfq+qNpvpq, pΩ

(7)

p ∈ ∂ Ω p \in \partial \Omega pΩ时, ∣ N p ∣ &lt; 4 \left| N_p \right| \lt 4 Np<4;当 p p p Ω \Omega Ω内部点( N p ⊂ Ω N_p \subset \Omega NpΩ)时,方程(7)不包含边界项:

∣ N p ∣ f p − ∑ q ∈ N p ⋂ Ω f q = ∑ q ∈ N p v p q \left| N_p \right| f_p - \sum_{q \in N_p \bigcap \Omega} f_q = \sum_{q \in N_p} v_{pq} NpfpqNpΩfq=qNpvpq

(8)

在这里插入图片描述

方程(7)是带状稀疏(banded sparse)、对称(symmetric)、正定矩阵(positive-definite),可用高斯-塞德尔迭代法求解。

1.3 无缝融合(seamless cloning)

1.3.1 导入梯度(Importing gradients)

源图像中的梯度场可以作为最基本的引导场 v \mathbf{v} v

v = ∇ g \mathbf{v} = \nabla g v=g

其中, g g g表示源图像。代入方程(4)可得:

Δ f = Δ g  over  Ω with  f ∣ ∂ Ω = f ∗ ∣ ∂ Ω \Delta f = \Delta g \ \text{over} \ \Omega \quad \text{with} \ \left. f \right|_{\partial \Omega} = \left. f^{\ast} \right|_{\partial \Omega} Δf=Δg over Ωwith fΩ=fΩ

(10)

v p q = g p − g q ,   ∀ &lt; p , q &gt; v_{pq} = g_p - g_q, \ \forall \left&lt; p, q \right&gt; vpq=gpgq, p,q

导入梯度在 Ω \Omega Ω域内完全不考虑目标图像。

在这里插入图片描述

在这里插入图片描述

1.3.2 混合梯度(Mixing gradients)

混合梯度会将 f ∗ f^{\ast} f g g g的特性组合起来。

泊松方法(Poisson methodology)可以使用非保守(non-conservative)引导场,来生成更好的效果。在 Ω \Omega Ω域中任意一点上,选择 f ∗ f^{\ast} f g g g二者之中梯度大的作为引导向量 v \mathbf{v} v的值:

v = { ∇ f ∗ ( x ) if  ∣ ∇ f ∗ ( x ) ∣ &gt; ∣ ∇ g ( x ) ∣ ∇ g ( x ) otherwise , ∀ x ∈ Ω \mathbf{v} = \begin{cases} \nabla f^{\ast} \left( \mathbf{x} \right) \quad &amp; \text{if} \ \left| \nabla f^{\ast} \left( \mathbf{x} \right) \right| \gt \left| \nabla g \left( \mathbf{x} \right) \right| \\ \nabla g \left( \mathbf{x} \right) \quad &amp; \text{otherwise} \end{cases}, \quad \forall \mathbf{x} \in \Omega v={f(x)g(x)if f(x)>g(x)otherwise,xΩ

(12)

引导向量 v \mathbf{v} v的离散化表示为:

v p q = { f p ∗ − f q ∗ if  ∣ f p ∗ − f q ∗ ∣ &gt; ∣ g p − g q ∣ g p − g q otherwise , ∀ &lt; p , q &gt; v_{pq} = \begin{cases} f_p^{\ast} - f_q^{\ast} \quad &amp; \text{if} \ \left| f_p^{\ast} - f_q^{\ast} \right| \gt \left| g_p - g_q \right| \\ g_p - g_q \quad &amp; \text{otherwise} \end{cases}, \quad \forall \left&lt; p, q \right&gt; vpq={fpfqgpgqif fpfq>gpgqotherwise,p,q

在这里插入图片描述

在这里插入图片描述

1.3.3 单色迁移(Monochrome transfer)

当无缝融合仅需要源图像纹理(梯度)信息而不需要色彩信息时,可预先将源图像转换成单色图(灰度图)。

在这里插入图片描述

1.4 选区编辑(Selection editing)

  • 无缝融合处理的问题是将源图像中的区域融合到目标图像中,引导场部分或完全取决于源图像 g g g的梯度。

  • 选区编辑处理的问题是在单一图像上取出一块区域,对这个区域进行处理,使用完全依赖于原始图像的引导场来定义选区图像的变换。主要形式包括:纹理扁平化(Texture flattening)、局部明亮变化(Local illumination changes)、局部色彩变化(Local color changes)以及无缝拼接(seamless tiling)。

  • 纹理扁平化和局部明亮变化是通过对原始梯度场 ∇ f ∗ \nabla f^{\ast} f进行非线性修改实现;背景或前景色修改和无缝拼接是通过就地(in-place)无缝融合实现,原始图片经域内(提供新的源图像)或域外(提供新的边界值)修改后作为源。

1.4.1 纹理扁平化(Texture flattening)

利用稀疏筛(sparse sieve)对图像梯度 ∇ f ∗ \nabla f^{\ast} f进行处理,只保留最突出的特征:

v ( x ) = M ( x ) ∇ f ∗ ( x ) , ∀ x ∈ Ω \mathbf{v \left( x \right)} = \mathbf{M \left( x \right)} \nabla f^{\ast} \mathbf{\left( x \right)}, \quad \forall \mathbf{x} \in \Omega v(x)=M(x)f(x),xΩ

(14)

其中, M ( x ) \mathbf{M \left( x \right)} M(x)为二进制蒙板,用于开启稀疏筛区域。当 M ( x ) \mathbf{M \left( x \right)} M(x)为边缘检测器时:

v p q = { f p ∗ − f q ∗ if an edge lies between  p  and  q 0 otherwise , ∀ &lt; p , q &gt; v_{pq} = \begin{cases} f_p^{\ast} - f_q^{\ast} \quad &amp; \text{if an edge lies between } p \text{ and } q \\ 0 \quad &amp; \text{otherwise} \end{cases}, \quad \forall \left&lt; p, q \right&gt; vpq={fpfq0if an edge lies between p and qotherwise,p,q

在这里插入图片描述

边缘检测器选取的边缘越少(选择性越强),边缘映射就越稀疏,扁平化效果就越明显。

1.4.2 局部明亮变化(Local illumination changes)

Fattal et al. 2002,给出一种平滑修改原始图像动态范围的方法:

(1)对图像对数的梯度场进行变换,用于减小大的梯度值、增加小的梯度

(2)在整个图像域上,给定诺伊曼边界条件(Neumann boundary conditions)下,通过求解泊松方程 Δ f = ∇ ⋅ v \Delta f = \nabla \cdot \mathbf{v} Δf=v,用变换后的向量场 v \mathbf{v} v重构图像的对数 f f f

通过使用合适的狄利克雷边界条件,上述方法应用于校正选区内图像。使用简化版Fattal et al变换,引导场在对数域(log-domain)上定义为

V = α β ∣ ∇ f ∗ ∣ − β ∇ f ∗ \mathbf{V} = \alpha^{\beta} \left| \nabla f^{\ast} \right|^{- \beta} \nabla f^{\ast} V=αβfβf

其中, α = 0.2 ∣ ∇ f ∗ ∣ a v g \alpha = 0.2 \left| \nabla f^{\ast} \right|_{\mathrm{avg}} α=0.2favg(在 Ω \Omega Ω域上, f ∗ f^{\ast} f的平均梯度范数的0.2倍), β = 0.2 \beta = 0.2 β=0.2

在这里插入图片描述

1.4.3 局部色彩变化(Local color changes)

给定原始图像和选区( Ω \Omega Ω域),利用无缝融合修改原始图像的前景色和背景色:

(1)修改背景色:给定 Ω \Omega Ω域外目标函数 f ∗ f^{\ast} f,例下图中间:通过将选区外图像进行去色处理,得到的图像作为 f ∗ f^{\ast} f

(2)修改前景色:给定 Ω \Omega Ω域内源函数 g g g,例下图右侧:将选区内图像各通道灰度值分别乘以1.5、0.5、0.5,得到的图像作为 g g g

在这里插入图片描述

1.4.4 无缝拼接(seamless tiling)

选区( Ω \Omega Ω域)为矩形:

原始图像选区内图像作为源图像 g g g,边界条件由g的边界值导出:
f n o r t h ∗ = f s o u t h ∗ = g n o r t h + g s o u t h 2 f w e s t ∗ = f e a s t ∗ = g w e s t + g e a s t 2 \begin{aligned} f^{\ast}_{\mathrm{north}} = f^{\ast}_{\mathrm{south}} = &amp; \frac{g_{\mathrm{north}} + g_{\mathrm{south}}}{2} \\ f^{\ast}_{\mathrm{west}} = f^{\ast}_{\mathrm{east}} = &amp; \frac{g_{\mathrm{west}} + g_{\mathrm{east}}}{2} \\ \end{aligned} fnorth=fsouth=fwest=feast=2gnorth+gsouth2gwest+geast

在这里插入图片描述

2 OpenCV实现

2.1 函数原型

  • seamlessClone(src, dst, mask, center, flags)

    • 常规融合(Normal Cloning)

    源图像的纹理(梯度)保留在融合区域

    • 混合融合(Mixed Cloning)

    融合区域的纹理(梯度)由源图像和目标图像共同决定。混合融合会选择源图像和目标图像之中的主要纹理(梯度),因此不会产生平滑区域

    • 单色迁移(Monochrome Transfer)

    保留源图像的纹理(梯度),丢弃其色彩信息,使得融合区域色彩与目标图像一致,可以用来进行皮肤质地填充。

  • colorChange(src, mask, result, red_mul, green_mul, blue_mul)

    • 局部颜色改变(Local Color Change)

    同一幅图像的颜色融合,后面三个参数是rgb三个通道的乘数因子,在0.5-2.5之间。值越大起到锐化的作用。

  • illuminationChange(src, mask, result, alpha=0.2f, beta=0.4f)

    • 局部亮度改变(Local Illumination Change)

    对区域内illuminaton 变换明显的地方做修改,beta越大,图片平滑越多,alpha越大,越接近原图细节。alpha和beta都是0-2之间。对于加亮曝光不足的区域比较有效果。

  • textureFlattening(src, mask, result, low_thresh, high_thresh, kernel_size)

    • 纹理平整(Texture Flattening)

    仅仅保留边缘处的梯度,选中区域的质地没有保留。

2.2 Seamless Cloning Examples (Learn OpenCV)

%matplotlib inline
import matplotlib.pyplot as plt
import math

def plotImgs(idxFig, lstImgs, figsize=(12, 24)):

    fig = plt.figure(idxFig, figsize=figsize)
    fig.clf()

    intNumImgs = len(lstImgs)
    intNumCols = int(math.sqrt(intNumImgs))
    intNumRows = int(math.ceil(intNumImgs / intNumCols))
    
    idxImg = 0
    for idxRow in range(intNumRows):
        for idxCol in range(intNumCols):

            ax = fig.add_subplot(intNumRows, intNumCols, idxImg + 1, frameon=False)
            if lstImgs[idxImg].dtype == "uint8":
                ax.imshow(cv2.cvtColor(lstImgs[idxImg], cv2.COLOR_BGR2RGB))
            else:
                ax.imshow(lstImgs[idxImg])
            ax.get_yaxis().set_visible(False)
            ax.get_xaxis().set_visible(False)
            idxImg += 1
            if idxImg >= intNumImgs:
                break

    plt.show()
# Standard imports
import cv2
import numpy as np 
 
# Read images
src = cv2.imread("./img/airplane.jpg")
dst = cv2.imread("./img/sky.jpg")
 

# Create a rough mask around the airplane.
src_mask = np.zeros(src.shape, src.dtype)
poly = np.array([[4,80], [30,54], [151,63], [254,37], [298,90], [272,134], [43,122]], np.int32)
cv2.fillPoly(src_mask, [poly], (255, 255, 255))
 
# This is where the CENTER of the airplane will be placed
center = (800,100)
 
# 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("./output/opencv-seamless-cloning-example.jpg", output)
idxFig = 1
plotImgs(1, [src, src_mask, dst, output1, output2, output3], figsize=(12, 8))

在这里插入图片描述

# Read images : src image will be cloned into dst
im = cv2.imread("./img/wood-texture.jpg")
obj = cv2.imread("./img/iloveyouticket.jpg")
 
# Create an all white mask
mask = 255 * np.ones(obj.shape, obj.dtype)
 
# The location of the center of the src in the dst
width, height, channels = im.shape
center = (height // 2, width // 2)
 
# Seamlessly clone src into dst and put the results in output
normal_clone = cv2.seamlessClone(obj, im, mask, center, cv2.NORMAL_CLONE)
mixed_clone = cv2.seamlessClone(obj, im, mask, center, cv2.MIXED_CLONE)
mono_clone = cv2.seamlessClone(obj, im, mask, center, cv2.MONOCHROME_TRANSFER)
 
# Write results
#cv2.imwrite("images/opencv-normal-clone-example.jpg", normal_clone)
#cv2.imwrite("images/opencv-mixed-clone-example.jpg", mixed_clone)
idxFig += 1
plotImgs(1, [obj, im, normal_clone, mixed_clone, mono_clone], figsize=(12, 8))

在这里插入图片描述

  • 13
    点赞
  • 44
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

K5niper

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值