《A Closed-Form Solution to Natural Image Matting》【1】是作者:Anat Levin, Dani Lischinski, and Yair Weiss等人在2008年2月的一篇文章,它所用抠图的方法是文章《Semantic Soft Segmentation》(2018,来自MIT CSAIL的YAĞIZ AKSOY等人)的基础。
在文中,image matting(抠图)问题被归结为求解compositing equation:
I i = α i F i + ( 1 − α i ) B i ( 1 ) I_i=\alpha_i F_i + (1-\alpha_i)B_i \qquad(1) Ii=αiFi+(1−αi)Bi(1)
(1)式中 I i I_i Ii 是像素点,是已知的,未知数有: α i , F i , B i \alpha_i,F_i,B_i αi,Fi,Bi,其中 $ \alpha_i \in [0,1]$ 表示透明度, F i , B i F_i,B_i Fi,Bi 分别为前景颜色和背景颜色。
(1)是一个严重的欠约束的方程组:假如图像有N个像素点,则可以列出N个方程,但有3N个未知数。
为求解抠图所用模板—— α \mathbf \alpha α ,它是矢量,每一个像素对应它的一个元素 α i \alpha_i αi,如图1和图2:
图1、 原图
图2 、 α \alpha α 模板
为求 α \alpha α 模板,需要给公式(1)添加一些约束:
1、用户给出trimap(三区标注图,图中标签有三种:Foreground、Background、Unknown),或手动粗略(Scribbles)地指出前景与背景,Trimap实例如下图所示:
图3、 白色为前景区域、黑色为背景区域、灰色为未知区域
图4、Scribbles图,白色为前景,黑色为背景,中间部分为未知区域
2、假设:在一个小的窗口(window,用w表示)中,前景(FG)与背景(BG)是一个常数,分别为F和B,于是(1)式可以转换成为:
I i ≈ α i F + ( 1 − α i ) B ∀ i ∈ w ≈ α i ( F − B ) + B ⇒ α i ≈ 1 F − B I i − B F − B L e t a = 1 F − B , b = − B F − B s o α i ≈ a I i + b ( 2 ) I_i \approx \alpha_i F + (1-\alpha_i)B \quad \forall i \in w \\ \approx \alpha_i(F-B) + B \\ \Rightarrow \alpha_i \approx \frac {1}{F-B} I_i - \frac {B}{F-B} \\ Let \quad a=\frac {1}{F-B},b=-\frac {B}{F-B} \\ so \quad \alpha_i \approx a I_i+b \qquad(2) Ii≈αiF+(1−αi)B∀i∈w≈αi(F−B)+B⇒αi≈F−B1Ii−F−BBLeta=F−B1,b=−F−BBsoαi≈aIi+b(2)
此处的约等于“ ≈ \approx ≈”是因为假设了F和B是常数,由此引入的。
针对公式(2),该文章中有一段话是这样的:
为什么(2)式就 suggests 最小化这个代价函数(3)呢?
这是整篇文章的关键,是后续推导的基础,我的理解是这样的:
####一、对于一幅特定的图,前景区域和后景区域是确定的,对于同一个窗体,前景颜色是一个确定的值,整个窗体取同一个值,背景颜色也是如此。
假设一个window是3*3矩阵,有四种情况:
CASE 1: 该w都在Trimap的前景或背景中,则F和B以及 α i \alpha_i αi 都是已知的,这些像素可被认为是“约束点(Constraint Points)”,在前景中, α i = 1 , F = I i \alpha_i =1,F = I_i αi=1,F=Ii;若在背景中, α i = 0 , B = I i \alpha_i =0,B = I_i αi=0,B=Ii 。
CASE 2: 在w中,既有B约束点,又有F约束点,则F和B已知,由(2)构成的方程组与未知的 α i \alpha_i αi的个数相同,可有唯一解。
CASE 3: 在w中,只有F约束点(或B约束点)和U点(Unknown Pixel),则未知变量数量比方程式数量多1,有无限多解。
CASE 4: 在w中,只有U点,则未知数数量比方程式数量多2,没有唯一解。
若我们的滑动窗从CASE _1和CASE_2开始移动,会出现CASE_3,然后出现CASE_4。
如果在CASE_3中,我们为window中任一个U点(像素i),设定 α i \alpha_i αi值,则CASE_3方程组有唯一解。当窗口从CASE_3进入CASE_4时,若前面CASE_3的点都已经确定,则此时CASE_4的window的F和B也已经确定(来自上一次滑动窗口),因而也可求出所有的点的 α i , F , B \alpha_i,F,B αi,F,B。如此F和B信息可以通过新的窗口传递下去,最后可计算出所有的点的透明度 α \alpha α 值。
#####观察上述迭代过程,矢量 α m \alpha^m αm会在迭代过程中发生变化。这是因为我们在计算一个窗体 w i w_i wi(以像素i为中心的window)的 ( α , F i , B i ) (\alpha , F_i, B_i) (α,Fi,Bi) 时,认为 F i F_i Fi和 B i B_i Bi是常数,由上一个滑动窗继承过来,然而若滑动的路径不同,即使是同一点上算出的 ( α i , F i , B i ) (\alpha_i , F_i, B_i) (αi,Fi,Bi)也可能不同。随机游动,产生了随机序列 α m \alpha^m αm。
这是一个马尔可夫过程,滑动窗口随机游走,每滑动一次,计算一次 α \alpha α,用 α m \alpha^m αm表示。如果输入图片有唯一最优抠图(人能够将所要前景抠图出来),则存在收敛值,随机游动得到的 α m \alpha^m αm最后可以稳定下来。因为 α \alpha α所处空间是完备空间,因而存在柯西序列性质,则:
lim m → ∞ α m = α ∗ ⇒ lim m → ∞ ∣ α m + 1 − α m ∣ = 0 ( 4 ) \lim_{m \to \infty} \alpha^m = \alpha^* \Rightarrow \lim_{m \to \infty} \vert \alpha^{m+1} - \alpha^m \vert = 0 \qquad(4) m→∞limαm=α∗⇒m→∞lim∣αm+1−αm∣=0(4)
可根据公式(4)设计随机游走方案(关键在于把
α m \alpha^m αm 看作是柯西序列
),只要迭代步数足够多,前后两次迭代所得的矢量距离就会趋向0,此时所得矢量 α m \alpha^m αm 便是最优 α ∗ \alpha^* α∗。这样的算法前人已经提出,也可取得较好的抠图效果,但不足之处是速度太慢,这是所有MonteCarlo方法都具有的。
透明度收敛,即前景与背景是确定的,反之亦然。
####二、问题归结为求 α \alpha α 二次型的凸优化
【1】文最突出的贡献是给出最优 α ∗ \alpha^* α∗ 解析解,不需要经多次迭代就可得到。思想是这样的:
既然矢量 α m \alpha^m αm 存在最优,令像素 i i i上的透明度最优值为 α i \alpha_i αi,根据公式(2)得到它的一个估计值: a j I i + b j = α i ^ a_j I_i + b_j = \hat{\alpha_i} ajIi+bj=αi^,两者之间的距离定义为: ( α i − α i ^ ) 2 = ( α i − a j I i − b j ) 2 (\alpha_i- \hat{\alpha_i})^2 = (\alpha_i - a_j I_i - b_j)^2 (αi−αi^)2=(αi−ajIi−bj)2。其中,j表示窗体j,i是窗体j中的像素。
若滑动窗体的size为 N × N N\times N N×N(例如:N=3),一个窗体有 N × N N\times N N×N个像素,亦即可计算 N × N N\times N N×N个估计值,这些估计值与最优 α ∗ \alpha^* α∗之间距离的和是公式(5),随着随机游动的次数增加,最后会收敛,并达到最小值。因此,公式(5)可作为一个窗体透明度与它的最优值之间距离:
D i s t a n c e w j = D ( w j ) = ∑ i ∈ w j ( α i − a j I i − b j ) 2 ( 5 ) Distance_{w_j} = D(w_j) =\sum_{i \in w_j} (\alpha_i - a_j I_i - b_j )^2 \qquad(5) Distancewj=D(wj)=i∈wj∑(αi−ajIi−bj)2(5)
以每个像素为中心点作window,窗体与像素一一对应,因而图像 I I I 估计的透明度与最优透明度之间总距离可以表述为所有窗体距离的和:
D i s t a n c e I = ∑ j ∈ I D ( w j ) = ∑ j ∈ I ∑ i ∈ w j ( α i − a j I i − b j ) 2 ( 6 ) Distance_{I} = \sum_{j \in I}D(w_j) = \sum_{j \in I} \sum_{i \in w_j} (\alpha_i - a_j I_i - b_j )^2 \qquad(6) DistanceI=j∈I∑D(wj)=j∈I∑i∈wj∑(αi−ajIi−bj)2(6)
公式(6)加上一个为平滑用的正则项( ϵ a j 2 \epsilon a_j^2 ϵaj2),就得到了公式(3)。问题:为什么(2)式就 suggests 最小化这个代价函数(3)呢?
得解。
####3、求透明度的解析解
公式(3)我们重新抄一次,如下:
J ( α , a , b ) = D i s t a n c e I = ∑ j ∈ I ( ∑ i ∈ w j ( α i − a j I i − b j ) 2 + ϵ a j 2 ) ( 3 ) J(\alpha,\mathbf a,\mathbf b) = Distance_{I} = \sum_{j \in I} \left(\sum_{i \in w_j} (\alpha_i - a_j I_i - b_j )^2 + \epsilon a_j^2 \right) \qquad(3) J(α,a,b)=DistanceI=j∈I∑⎝⎛i∈wj∑(αi−ajIi−bj)2+ϵaj2⎠⎞(3)
假设窗体 w k w_k wk 的size是3*3,其像素为 { I 1 , I 2 , ⋯   , I 9 } \{ I_1,I_2, \cdots ,I_9\} {I1,I2,⋯,I9},其前景和背景颜色为: ( F k , B k ) (F_k,B_k) (Fk,Bk),根据公式(2)有:
L e t a k = 1 F k − B k , b k = − B k F k − B k Let \quad a_k=\frac {1}{F_k-B_k},b_k=-\frac {B_k}{F_k-B_k} Letak=Fk−Bk1,bk=−Fk−BkBk
令:
G k = [ I 1 1 I 2 1 I 3 1 ⋮ ⋮ I 9 1 ϵ 0 ] , α ˉ k = [ α 1 α 2 α 3 ⋮ α 9 0 ] ⇒ G k [ a k b k ] − α k ˉ = [ I 1 a k + b k − α 1 I 2 a k + b k − α 2 ⋯ I 9 a k + b k − α 9 ϵ a k ] ⇒ ∑ i ∈ w j ( α i − a j I i − b j ) 2 + ϵ a j 2 = ( G k [ a k b k ] − α k ˉ ) T ( G k [ a k b k ] − α k ˉ ) = ∥ G k [ a k b k ] − α k ˉ ∥ 2 ( 7 ) G_k=\left[ \begin{array}{cc} I_1&1\\ I_2&1\\ I_3&1\\ \vdots & \vdots \\ I_9&1\\ \sqrt{\epsilon}&0\\ \end{array} \right] , \bar \alpha_k= \left[ \begin{array}{c} \alpha_1\\ \alpha_2\\ \alpha_3\\ \vdots \\ \alpha_9\\ 0\\ \end{array} \right]\\ \Rightarrow G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k}= \left[ \begin{array}{c} I_1 a_k + b_k - \alpha_1\\ I_2 a_k + b_k - \alpha_2\\ \cdots\\ I_9 a_k + b_k - \alpha_9\\ \sqrt\epsilon a_k \end{array} \right]\\ \Rightarrow \sum_{i \in w_j} (\alpha_i - a_j I_i - b_j )^2 + \epsilon a_j^2 = \left( G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k} \right)^T \left( G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k} \right) = \left\Vert G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k} \right\Vert^2 \qquad(7) Gk=⎣⎢⎢⎢⎢⎢⎢⎢⎡I1I2I3⋮I9ϵ111⋮10⎦⎥⎥⎥⎥⎥⎥⎥⎤,αˉk=⎣⎢⎢⎢⎢⎢⎢⎢⎡α1α2α3⋮α90⎦⎥⎥⎥⎥⎥⎥⎥⎤⇒Gk[akbk]−αkˉ=⎣⎢⎢⎢⎢⎡I1ak+bk−α1I2ak+bk−α2⋯I9ak+bk−α9ϵak⎦⎥⎥⎥⎥⎤⇒i∈wj∑(αi−ajIi−bj)2+ϵaj2=(Gk[akbk]−αkˉ)T(Gk[akbk]−αkˉ)=∥∥∥∥Gk[akbk]−αkˉ∥∥∥∥2(7)
将(7)代入(3)有:
J ( α , a , b ) = ∑ k ∈ I ∥ G k [ a k b k ] − α k ˉ ∥ 2 ( 8 ) J(\alpha,\mathbf a,\mathbf b)=\sum_{k \in I} \left\Vert G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k} \right\Vert^2 \qquad(8) J(α,a,b)=k∈I∑∥∥∥∥Gk[akbk]−αkˉ∥∥∥∥2(8)
目标是求解能令(8)取最小值的 ( α , a , b ) (\alpha,\mathbf a, \mathbf b) (α,a,b),问题等价于两个连续的求最小值步骤:
(1)给定 α \alpha α ,求 J ( α , a , b ) J(\alpha,\mathbf a,\mathbf b) J(α,a,b)的最小值:$J(\alpha)=\min J(\mathbf a, \mathbf b \vert \alpha) $
(2)求 min J ( α ) \min J(\alpha) minJ(α)
由公式(7)有:
L e t β = [ a k b k ] , α = α k ˉ J k = ( G k [ a k b k ] − α k ˉ ) T ( G k [ a k b k ] − α k ˉ ) = ( G k β − α ) T ( G k β − α ) L e t ∂ J k ∂ β = 2 G k T G k β − 2 G k T α = 0 ⇒ β ∗ = ( G k T G k ) − 1 G k T α = [ a k ∗ b k ∗ ] ( 9 ) Let \quad \beta = \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right], \alpha = \bar {\alpha_k}\\ J_k =\left( G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k} \right)^T \left( G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k} \right) = \left( G_k \beta- \alpha \right)^T\left( G_k \beta- \alpha \right)\\ Let \quad \frac{\partial J_k}{\partial \beta} = 2G_k^T G_k\beta-2 G_k^T\alpha=0\\ \Rightarrow \beta^* = (G_k^T G_k)^{-1}G_k^T\alpha=\left[ \begin{array}{c} a_k^*\\b_k^* \end{array} \right]\qquad(9) Letβ=[akbk],α=αkˉJk=(Gk[akbk]−αkˉ)T(Gk[akbk]−αkˉ)=(Gkβ−α)T(Gkβ−α)Let∂β∂Jk=2GkTGkβ−2GkTα=0⇒β∗=(GkTGk)−1GkTα=[ak∗bk∗](9)
将(9)代入(8)有:
J ( α , a , b ) = ∑ k ∈ I J k = ∑ k ∈ I ∥ G k [ a k b k ] − α k ˉ ∥ 2 = ∑ k ∈ I ∥ G k ( G k T G k ) − 1 G k T α k ˉ − α k ˉ ∥ 2 L e t G k ˉ = I − G k ( G k T G k ) − 1 G k T , ⇒ J ( α , a , b ) = ∑ k ∈ I α k ˉ T G ˉ k T G ˉ k α k ˉ = ∑ k ∈ I α k T L α k ( 10 ) J(\alpha,\mathbf a,\mathbf b)=\sum_{k \in I}J_k=\sum_{k \in I} \left\Vert G_k \left[ \begin{array}{c} a_k\\b_k \\ \end{array} \right] - \bar {\alpha_k} \right\Vert^2= \sum_{k \in I} \left\Vert G_k (G_k^T G_k)^{-1}G_k^T \bar {\alpha_k} -\bar {\alpha_k} \right\Vert^2 \\ Let \quad \bar{G_k} = I- G_k (G_k^T G_k)^{-1}G_k^T,\\ \Rightarrow J(\alpha,\mathbf a,\mathbf b)=\sum_{k \in I} \bar {\alpha_k}^T \bar G_k^T \bar G_k \bar {\alpha_k}=\sum_{k \in I} \alpha_k^T L \alpha_k \qquad(10) J(α,a,b)=k∈I∑Jk=k∈I∑∥∥∥∥Gk[akbk]−αkˉ∥∥∥∥2=k∈I∑∥∥Gk(GkTGk)−1GkTαkˉ−αkˉ∥∥2LetGkˉ=I−Gk(GkTGk)−1GkT,⇒J(α,a,b)=k∈I∑αkˉTGˉkTGˉkαkˉ=k∈I∑αkTLαk(10)
公式(10)中,L被称为Laplacian Matrix, α ˉ k \bar \alpha_k αˉk是 α k \alpha_k αk最后一个元素后增添0后的扩展矢量,因而L是 G ˉ k T G ˉ k \bar G_k^T \bar G_k GˉkTGˉk去掉最后一行和一列的矩阵,它的每个元素是可确定的:
L i , j = δ i , j − 1 w k ( 1 + 1 ϵ ∣ w k ∣ + σ k 2 ( I i − u k ) ( I j − u k ) ) ( 11 ) L_{i,j}=\delta_{i,j}-\frac{1}{w_k} \left(1+\frac{1}{\frac{\epsilon}{\vert w_k \vert}+\sigma^2_k} (I_i-u_k)(I_j-u_k)\right) \qquad(11) Li,j=δi,j−wk1(1+∣wk∣ϵ+σk21(Ii−uk)(Ij−uk))(11)
其中 ∣ w k ∣ \vert w_k \vert ∣wk∣ 表示window中像素个数, u k u_k uk 表示窗体像素的平均值, σ k \sigma_k σk 表示窗体像素的方差, δ i , j = δ [ i − j ] \delta_{i,j}=\delta[i-j] δi,j=δ[i−j] 表示狄利克雷函数。
于是, J ( α , a , b ) J(\alpha,\mathbf a,\mathbf b) J(α,a,b) 可以表示成为透明度矢量 α \alpha α 的二次型,再加上限制点约束条件,问题最后转化成带有约束条件的凸优化问题:
α = arg min α T L α + λ ( α T − b s T ) D s ( α − b s ) ( 12 ) \alpha = \arg \min \alpha^T L \alpha + \lambda (\alpha^T - b_s^T)D_s(\alpha - b_s) \qquad(12) α=argminαTLα+λ(αT−bsT)Ds(α−bs)(12)
(12)中 D s D_s Ds 是对角矩阵,其对角线元素对应图中每个点,限制点(标注出是FG或BG的点)上为1值,而其他非限制点均为0。 b s b_s bs是与 α \alpha α相同维度的列矢量,限制点上为相应 α i \alpha_i αi值,其余为0。由此,可定义Loss为:
L o s s = α T L α + λ ( α T − b s T ) D s ( α − b s ) ( 13 ) Loss = \alpha^T L \alpha + \lambda (\alpha^T - b_s^T)D_s(\alpha - b_s) \qquad(13) Loss=αTLα+λ(αT−bsT)Ds(α−bs)(13)
Loss对 α \alpha α求偏导,并置零:
∂ L o s s ∂ α = 2 L α + 2 λ D s ( α − b s ) = 0 ⇒ α = λ ( L + λ D s ) − 1 D s b s = λ ( L + λ D s ) − 1 b s ( 14 ) \frac{\partial Loss}{\partial \alpha} = 2L\alpha + 2 \lambda D_s(\alpha - b_s)=0\\ \Rightarrow \alpha = \lambda (L+\lambda D_s)^{-1}D_s b_s= \lambda (L+\lambda D_s)^{-1}b_s \qquad(14) ∂α∂Loss=2Lα+2λDs(α−bs)=0⇒α=λ(L+λDs)−1Dsbs=λ(L+λDs)−1bs(14)
(14)给出了透明度 α \alpha α 的解析解。
####4、将该方法扩展至彩色图片
彩色图像 I ( R , G , B ) I(R,G,B) I(R,G,B) 可以看成是三个单色 Channel 的合并(Concatenation),透明度在这三个Channel中保持一致,于是根据(1)有:
{ I i r = α i F i r + ( 1 − α i ) B i r I i g = α i F i g + ( 1 − α i ) B i g I i b = α i F i b + ( 1 − α i ) B i b Let c ∈ { r , g , b } , so I i c = α i F i c + ( 1 − α i ) B i c ( 15 ) \left\{ \begin{array}{c} I_i^r = \alpha_i F_i^r + (1-\alpha_i)B_i^r \\ I_i^g = \alpha_i F_i^g + (1-\alpha_i)B_i^g \\ I_i^b = \alpha_i F_i^b + (1-\alpha_i)B_i^b \end{array} \right. \\ \text{Let } c \in \{r,g,b\},\text{so } I_i^c = \alpha_i F_i^c + (1-\alpha_i)B_i^c \qquad(15) ⎩⎨⎧Iir=αiFir+(1−αi)BirIig=αiFig+(1−αi)BigIib=αiFib+(1−αi)BibLet c∈{r,g,b},so Iic=αiFic+(1−αi)Bic(15)
我们希望彩色图像透明度问题也能象单色图像透明度问题那样转化为求 α \alpha α 二次型凸优化问题。方法之关键在于找到公式(5)那样的小窗体(little window)透明度的估计值与其最优值之间距离,即要从(15)中得到 α i \alpha_i αi的估计值。(虽然我们不知道最优值,但我们知道其存在,这个前面叙述有说明,若能构建出估计值,则二次型成矣。)由(15)得到:
I i = α F i + ( 1 − α ) B i ⇒ I i = α ( F i − B i ) + B i ⇒ I i − B i = α ( F i − B i ) ( 16 ) \mathbf I_i=\alpha \mathbf F_i + (1-\alpha)\mathbf B_i \\ \Rightarrow \mathbf I_i=\alpha( \mathbf F_i - \mathbf B_i)+\mathbf B_i \\ \Rightarrow \mathbf I_i - \mathbf B_i=\alpha( \mathbf F_i - \mathbf B_i) \qquad(16) Ii=αFi+(1−α)Bi⇒Ii=α(Fi−Bi)+Bi⇒Ii−Bi=α(Fi−Bi)(16)
(16)说明的是矢量 I i − B i \mathbf I_i - \mathbf B_i Ii−Bi 和矢量 $ \mathbf F_i - \mathbf B_i$ 是线性关系,这个约束太强:若两个矢量不是线性,则 α \alpha α只能为0。因而【1】引入了“两色线模型”(color line model),如图所示:
图5 “前景-背景”双色线性模型
该模型有如下几个近似:
(20)式是矢量 α \alpha α 的每一个元素的估计,参考上述分析(公式(6)),定义最优值与估算值距离:
重写一次公式(6): D i s t a n c e I = ∑ j ∈ I D ( w j ) = ∑ j ∈ I ∑ i ∈ w j ( α i − a j I i − b j ) 2 ( 6 ) 定义彩色图像距离: D i s t a n c e I = ∑ j ∈ I D ( w j ) = ∑ j ∈ I ∑ i ∈ w j ( α i − a j T I i − b j ) 2 ( 21 ) \text{重写一次公式(6):}\\ Distance_{I} = \sum_{j \in I}D(w_j) = \sum_{j \in I} \sum_{i \in w_j} (\alpha_i - a_j I_i - b_j )^2 \qquad(6)\\ \text{定义彩色图像距离:}\\ Distance_{I} = \sum_{j \in I}D(w_j) = \sum_{j \in I} \sum_{i \in w_j} (\alpha_i - \mathbf a^T_j \mathbf I_i - b_j )^2 \qquad(21) 重写一次公式(6):DistanceI=j∈I∑D(wj)=j∈I∑i∈wj∑(αi−ajIi−bj)2(6)定义彩色图像距离:DistanceI=j∈I∑D(wj)=j∈I∑i∈wj∑(αi−ajTIi−bj)2(21)
与单色图像分析一致,问题可以转换为二次型凸优化,有:
J ( α ) = α T L α ( 22 ) L i , j = ∑ k ∣ ( i , j ) ∈ w k [ δ i j − 1 ∣ w k ∣ ( 1 + ( I i − μ k ) T ( Σ k + ϵ ∣ w k ∣ I 3 ) − 1 ( I i − μ k ) ) ] ( 22 ) J(\alpha)= \alpha^T L \alpha \qquad(22) \\ L_{i,j}=\sum_{k \vert (i,j)\in w_k}[\delta_{ij}-\frac{1}{\vert w_k \vert}(1+(\mathbf I_i-\mu_k)^T(\Sigma_k+\frac{\epsilon}{\vert w_k \vert}\mathbf I_3)^{-1}(\mathbf I_i-\mu_k))] \qquad(22) J(α)=αTLα(22)Li,j=k∣(i,j)∈wk∑[δij−∣wk∣1(1+(Ii−μk)T(Σk+∣wk∣ϵI3)−1(Ii−μk))](22)
后续计算方法与单色方法相同,参考公式(12)、(13)、(14)。
在GitHub上有实现代码:https://github.com/MarcoForte/closed-form-matting
以下摘抄一段以助理解:
def compute_laplacian(img, mask=None, eps=10**(-7), win_rad=1):
"""Computes Matting Laplacian for a given image.
Args:
img: 3-dim numpy matrix with input image
mask: mask of pixels for which Laplacian will be computed.
If not set Laplacian will be computed for all pixels.
eps: regularization parameter controlling alpha smoothness
from Eq. 12 of the original paper. Defaults to 1e-7.
win_rad: radius of window used to build Matting Laplacian (i.e.
radius of omega_k in Eq. 12).
Returns: sparse matrix holding Matting Laplacian.
"""
win_size = (win_rad * 2 + 1) ** 2
h, w, d = img.shape
# Number of window centre indices in h, w axes
c_h, c_w = h - 2 * win_rad, w - 2 * win_rad
win_diam = win_rad * 2 + 1
indsM = np.arange(h * w).reshape((h, w))
ravelImg = img.reshape(h * w, d)
win_inds = _rolling_block(indsM, block=(win_diam, win_diam))
win_inds = win_inds.reshape(c_h, c_w, win_size)
if mask is not None:
mask = cv2.dilate(
mask.astype(np.uint8),
np.ones((win_diam, win_diam), np.uint8)
).astype(np.bool)
win_mask = np.sum(mask.ravel()[win_inds], axis=2)
win_inds = win_inds[win_mask > 0, :]
else:
win_inds = win_inds.reshape(-1, win_size)
winI = ravelImg[win_inds]
win_mu = np.mean(winI, axis=1, keepdims=True)
win_var = np.einsum('...ji,...jk ->...ik', winI, winI) / win_size - np.einsum('...ji,...jk ->...ik', win_mu, win_mu)
inv = np.linalg.inv(win_var + (eps/win_size)*np.eye(3))
X = np.einsum('...ij,...jk->...ik', winI - win_mu, inv)
vals = np.eye(win_size) - (1.0/win_size)*(1 + np.einsum('...ij,...kj->...ik', X, winI - win_mu))
nz_indsCol = np.tile(win_inds, win_size).ravel()
nz_indsRow = np.repeat(win_inds, win_size).ravel()
nz_indsVal = vals.ravel()
L = scipy.sparse.coo_matrix((nz_indsVal, (nz_indsRow, nz_indsCol)), shape=(h*w, h*w))
return L
def closed_form_matting_with_prior(image, prior, prior_confidence, consts_map=None):
"""Applies closed form matting with prior alpha map to image.
Args:
image: 3-dim numpy matrix with input image.
prior: matrix of same width and height as input image holding apriori alpha map.
prior_confidence: matrix of the same shape as prior hodling confidence of prior alpha.
consts_map: binary mask of pixels that aren't expected to change due to high
prior confidence.
Returns: 2-dim matrix holding computed alpha map.
"""
assert image.shape[:2] == prior.shape, ('prior must be 2D matrix with height and width equal '
'to image.')
assert image.shape[:2] == prior_confidence.shape, ('prior_confidence must be 2D matrix with '
'height and width equal to image.')
assert (consts_map is not None) or image.shape[:2] == consts_map.shape, (
'consts_map must be 2D matrix with height and width equal to image.')
logging.info('Computing Matting Laplacian.')
laplacian = compute_laplacian(image, ~consts_map if consts_map is not None else None)
confidence = scipy.sparse.diags(prior_confidence.ravel())
logging.info('Solving for alpha.')
solution = scipy.sparse.linalg.spsolve(
laplacian + confidence,
prior.ravel() * prior_confidence.ravel()
)
alpha = np.minimum(np.maximum(solution.reshape(prior.shape), 0), 1)
return alpha
上述代码中的一些解释:
1、numpy.einsum(subscripts, *operands, out=None, dtype=None, order=‘K’, casting=‘safe’, optimize=False)
解释:
einsum全称为Einstein summation convention,是一种求和的范式,在很多基于多维张量的张量运算库,如numpy,tensorflow,pytorch中都有所应用。einsum可以用一种很简单的,统一的方式去表示很多多维张量的运算。详细的解释可以参考:
https://blog.csdn.net/LoseInVain/article/details/81143966
2、scipy.sparse.linalg.spsolve
scipy.sparse.linalg.spsolve(A, b, permc_spec=None, use_umfpack=True)
Solve the sparse linear system Ax=b, where b may be a vector or a matrix.
由上述代码可见函数 closed_form_matting_with_prior() 的求解过程与公式(14)是一致的。
参考文献:
【1】《A Closed-Form Solution to Natural Image Matting》