Poisson Matting论文,主要目标是从用户给定的Trimap,也就是指定的背景,前景和未知区域抠出前景。主要采用的Poisson 方程的方法。
这篇文章的抠图效果非常精细,但是实现出来的效果却不太尽如人意,但是由于本文只实现了Global Phase部分,所以可能并没有完全发挥这篇论文的全部实力。
项目github链接
给定一张图片 I ( x , y ) I(x,y) I(x,y),我们希望还原出一个遮罩(matte) α \alpha α和前景图片,背景图片,使得
I = α F + ( 1 − α ) B (1) I=\alpha F + (1-\alpha)B \tag{1} I=αF+(1−α)B(1)
(这个方程省略了 ( x , y ) (x,y) (x,y),下述的所有方程都是如此,而不是矩阵的意思)
当然有一些确定为Foreground和Background的区域,我们称这两个区域为 Ω F , Ω B \Omega_F,\Omega_B ΩF,ΩB,我们真正希望计算的是位置区域 Ω \Omega Ω的 α \alpha α
我们定义外边界为 ∂ Ω = { p ∈ Ω F ∪ Ω B ∣ N ( p ) ∩ Ω ≠ ∅ } \partial \Omega = \{p\in \Omega_F\cup \Omega_B|N(p)\cap \Omega \neq \empty\} ∂Ω={p∈ΩF∪ΩB∣N(p)∩Ω=∅}
其中 N ( p ) N(p) N(p)为p的四邻域。
我们先对方程(1)求导
∇ I = α ∇ F + ∇ α F + − ∇ α B + ( 1 − α ) ∇ B ∇ I = ∇ α ( F − B ) + α ∇ F + ( 1 − α ) ∇ B (2) \nabla I=\alpha \nabla F + \nabla \alpha F + -\nabla \alpha B + (1-\alpha)\nabla B \\ \nabla I=\nabla \alpha(F-B)+\alpha \nabla F+(1-\alpha)\nabla B \tag{2} ∇I=α∇F+∇αF+−∇αB+(1−α)∇B∇I=∇α(F−B)+α∇F+(1−α)∇B(2)
接下来有一个很重要的近似,我们假设自然图片是平滑的,所以 α ∇ F + ( 1 − α ) ∇ B \alpha \nabla F+(1-\alpha)\nabla B α∇F+(1−α)∇B是相对较小的,所以在global过程中就假设他们是0,因此得到
∇ α = ∇ I F − B (3) \nabla \alpha=\frac{\nabla I}{F-B}\tag{3} ∇α=F−B∇I(3)
因此最终,我们得到了最终的优化目标
α ∗ = arg min α ∬ p ∈ Ω ∣ ∣ ∇ α p − ∇ I p F p − B p ∣ ∣ 2 d p (4) \alpha^*=\argmin_\alpha \iint_{p\in\Omega}|| \nabla \alpha_p-\frac{\nabla I_p}{F_p-B_p}||^2dp \tag{4} α∗=αargmin∬p∈Ω∣∣∇αp−Fp−Bp∇Ip∣∣2dp(4)
在已知 F , B F,B F,B的情况下。
当然我们有迪利克雷边界
α ^ p ∣ ∂ Ω = { 1 p ∈ Ω F 0 p ∈ Ω B (5) \hat \alpha_p|_{\partial \Omega} = \begin{cases} 1 & p\in\Omega_F \\ 0 & p\in\Omega_B \end{cases} \tag{5} α^p∣∂Ω={10p∈ΩFp∈ΩB(5)
形式化了问题之后,我们可以相关的泊松方程,得到如下的公式
Δ α = d i v ( ∇ I F − B ) = Δ I ( F − B ) − ∇ I ⋅ ( ∇ F − ∇ B ) ( F − B ) 2 (6) \Delta\alpha=div(\frac{\nabla I}{F-B}) \\ =\frac{\Delta I(F-B)-\nabla I \cdot (\nabla F-\nabla B)}{(F-B)^2}\tag{6} Δα=div(F−B∇I)=(F−B)2ΔI(F−B)−∇I⋅(∇F−∇B)(6)
我们现在就是希望解这个泊松方程。
一个问题的雏形已经出现,但是还有很多细节需要讨论
可以直接通过Eigen库解离散形式的泊松方程。
但是注意到事实上这个方程式有限制条件的 0 ≤ α ≤ 1 0\leq \alpha\leq 1 0≤α≤1
采取高斯迭代更为平滑
备注:第三步骤的约等于是通过设置阈值来实现的,只有灰度差不超过阈值的图像才可以被添加。迭代终止条件是没有新的点加入F和B
使用ANN库,把所有边界点插入kd-tree来寻找最近点估计F,B
α \alpha α的计算分为Eigen库解方程计算和Gauss迭代计算两种方法
原图:
暴力解方程: