抠图应用程序设计(一)——GrabCut算法的实现

简介

​ GrabCut是一种基于Graph Cut的图像分割算法,从待分割的对象周围用户指定的边界框开始,使用高斯混合模型估计目标对象和背景的颜色分布。在像素标签上构造马尔可夫随机场,其能量函数优先选择具有相同标签的连接区域,并不断优化迭代求取最优解,GrabCut的用户操作和效果如下:

Graph Cut算法

​ Graph Cut算法是一种能量优化算法,广泛应用于计算机视觉领域中的前背景分割、立体视觉、抠图技术等。该方法把图像分割问题和图的最小化分割问题关联起来,通过计算对无向图的分割完成图像分割操作。

Graph

​ Graph Cut中的图(Graph)与一般的无向图不同,一般的无向图由顶点和边组成,即G=<V, E>,V和E分别是顶点(vertex)和边(edge)的集合,每条边上对应一个权值。Graph Cut中的图在这基础上添加多两个顶点,分别用符号S和T表示,统称为终端顶点,其他所有的顶点都必须和这两个顶点相连形成边集合中的一部分。

Graph Cut图中的顶点和边各分为两种:

  1. 第一种顶点对应图像中的像素点,每两个邻域顶点(对应于图像中每两个邻域像素)的连接就是一条边,这种边称为n-links。
  2. 第二种顶点即为上述的终端顶点,分别为S(源点)和T(汇点)。每个普通顶点和这2个终端顶点之间都有连接,组成第二种边,称为t-links。

​ 根据上述定义,一张图像可以生成对应的s-t图,如下图所示。每个像素对应图中的一个相应顶点,另外还有s和t两个顶点。下图有两种边,实线的边表示每两个邻域普通顶点连接的边n-links,虚线的边表示每个普通顶点与s和t连接的边t-links。在前后景分割中,s一般表示前景目标,t一般表示背景。

​ 图中每条边上的权值为代价,对于图中的边集合E中的一个子集C,代价就是边子集C的所有边的权值的总和。对图的边集合中的边进行断开生成S图和T图的操作,称为图的分割。如果一个图分割,它的边集合所有权值之和最小,则称为最小图分割。由福特-富克森定理表明,图的最大流量问题的解与最小图分割的解相同,所以可以使用最大流量模型获得s-t图的最小图分割,把图的顶点划分为两个不相交的子集S和T,其中s∈S,t∈T和S∪T=V 。这两个子集就对应于图像的前景像素集和背景像素集,那就相当于完成了图像分割。

权值的确定

​ 假设整幅图像的标签 L = l 1 , l 2 , … , l p L=l_{1}, l_{2}, \ldots, l_{p} L=l1,l2,,lp, 其中 l i l_{i} li 为 0 (背景) 或 1 (前景), 图像的能量 可以表示为:

E ( L ) = α R ( L ) + B ( L ) E(L)=\alpha R(L)+B(L) E(L)=αR(L)+B(L)

​ 其中, R ( L ) R(L) R(L) 为区域项, B ( L ) B(L) B(L) 为边界项, α \alpha α 为能量因子, 如果 α \alpha α 为 0 , 则只考虑边界 因素。 E ( L ) E(L) E(L) 表示的是损失函数, 也叫能量函数, 图割的目标就是优化能量函数使其值达 到最小。
对于区域项, 一般取作概率的负对数值, 所以 t − 1 i n k \mathrm{t}-1 \mathrm{ink} t1ink 的权值如下:

R p ( 1 ) = − ln ⁡ P r ( l p ∣ ′ o b j ′ ) R p ( 0 ) = − ln ⁡ P r ( l p ∣ ′ b k g ′ ) R ( L ) = ∑ p ∈ P R p ( l p ) \begin{gathered} R_{p}(1)=-\ln P r\left(\left.l_{p}\right|^{\prime} o b j^{\prime}\right) \quad R_{p}(0)=-\ln P r\left(\left.l_{p}\right|^{\prime} b k g^{\prime}\right) \\ R(L)=\sum_{p \in P} R_{p}\left(l_{p}\right) \end{gathered} Rp(1)=lnPr(lpobj)Rp(0)=lnPr(lpbkg)R(L)=pPRp(lp)

​ 对于边界项,则有

B ( L ) = ∑ p , q ∈ N B { < p , q > } ⋅ δ ( l p , l q ) δ ( l p , l q ) = { 0 ,  if  l p = l q 1 ,  if  l p ≠ l q B { < p , q > } ∝ exp ⁡ ( − ( l p − l q ) 2 2 σ 2 ) \begin{gathered} B(L)=\sum_{p, q \in N} B_{\{<p, q>\}} \cdot \delta\left(l_{p}, l_{q}\right) \\ \delta\left(l_{p}, l_{q}\right)=\left\{\begin{array}{l} 0, \text { if } l_{p}=l_{q} \\ 1, \text { if } l_{p} \neq l_{q} \end{array}\right. \\ B_{\{<p, q>\}} \propto \exp \left(-\frac{\left(l_{p}-l_{q}\right)^{2}}{2 \sigma^{2}}\right) \end{gathered} B(L)=p,qNB{<p,q>}δ(lp,lq)δ(lp,lq)={0, if lp=lq1, if lp=lqB{<p,q>}exp(2σ2(lplq)2)

​ p和q为邻域像素,边界平滑项主要体现分割L的边界属性, B { < p , q > } B_{\{<p, q>\}} B{<p,q>}可以解析为像素p和q之间不连续的惩罚,一般来说如果p和q越相似(例如它们的灰度),那么 B { < p , q > } B_{\{<p, q>\}} B{<p,q>}越大,如果他们非常不同,那么 B { < p , q > } B_{\{<p, q>\}} B{<p,q>}就接近于0。换句话说,如果两邻域像素差别很小,那么它属于同一个目标或者同一背景的可能性就很大,如果他们的差别很大,那说明这两个像素很有可能处于目标和背景的边缘部分,则被分割开的可能性比较大,所以当两邻域像素差别越大, B { < p , q > } B_{\{<p, q>\}} B{<p,q>}越小,即能量越小。

GrabCut算法

​ GrabCut算法在Graph Cut的基础上,采用RGB三通道的混合高斯通道模型GMM,并且将一次到达的能量最小化分割改为分割估计和模型参数学习的交互迭代过程。

高斯混合模型

​ 对前景和背景分别在 RGB 颜色空间, 分别用一个 K K K 维高斯分量的全协方差高斯混 合模型进行建模。可以得到对于一张图像的 Gibbs(吉布斯自由能)为

E ( α , k , θ , z ) = U ( α , k , θ , z ) + V ( α , z ) U ( α , k , θ , z ) = ∑ n D ( α n , k n , θ , z n ) D ( α n , k n , θ , z n ) = − log ⁡ π ( α n , k n ) + 1 2 logdet ⁡ ∑ ( α n , k n ) + 1 2 [ z n − μ ( α n , k n ) ] T ∑ ( α n , k n ) − 1 [ z n − μ ( α n , k n ) ] θ = π ( α , k ) , μ ( α , k ) , ∑ ( α , k ) , α = 0 , 1 , k = 1 , … , K \begin{gathered} E(\alpha, k, \theta, z)=U(\alpha, k, \theta, z)+V(\alpha, z) \\ U(\alpha, k, \theta, z)=\sum_{n} D\left(\alpha_{n}, k_{n}, \theta, z_{n}\right) \\ D\left(\alpha_{n}, k_{n}, \theta, z_{n}\right)=-\log \pi\left(\alpha_{n}, k_{n}\right)+\frac{1}{2} \operatorname{logdet} \sum\left(\alpha_{n}, k_{n}\right) \\ +\frac{1}{2}\left[z_{n}-\mu\left(\alpha_{n}, k_{n}\right)\right]^{T} \sum\left(\alpha_{n}, k_{n}\right)^{-1}\left[z_{n}-\mu\left(\alpha_{n}, k_{n}\right)\right] \\ \theta=\pi(\alpha, k), \mu(\alpha, k), \sum(\alpha, k), \alpha=0,1, k=1, \ldots, K \end{gathered} E(α,k,θ,z)=U(α,k,θ,z)+V(α,z)U(α,k,θ,z)=nD(αn,kn,θ,zn)D(αn,kn,θ,zn)=logπ(αn,kn)+21logdet(αn,kn)+21[znμ(αn,kn)]T(αn,kn)1[znμ(αn,kn)]θ=π(α,k),μ(α,k),(α,k),α=0,1,k=1,,K

​ 可得混合高斯密度模型为

D ( x ) = ∑ i = 1 K π i g i ( x ; μ i , ∑ i ) , ∑ i = 1 K π i = 1 , 0 ≤ π i ≤ 1 g ( x ; μ , ∑ ) = 1 ( 2 π ) d ∣ ∑ ∣ exp ⁡ [ − 1 2 ( x − μ ) T ∑ − 1 ( x − μ ) ] \begin{gathered} D(x)=\sum_{i=1}^{K} \pi_{i} g_{i}\left(x ; \mu_{i}, \sum_{i}\right), \sum_{i=1}^{K} \pi_{i}=1, \quad 0 \leq \pi_{i} \leq 1 \\ g\left(x ; \mu, \sum\right)=\frac{1}{\sqrt{(2 \pi)^{d}\left|\sum\right|}} \exp \left[-\frac{1}{2}(x-\mu)^{T} \sum^{-1}(x-\mu)\right] \end{gathered} D(x)=i=1Kπigi(x;μi,i),i=1Kπi=1,0πi1g(x;μ,)=(2π)d 1exp[21(xμ)T1(xμ)]

​ Gibbs 能量的区域能量项确定后, 我们就可以确定边界项:

V ( α , z ) = γ ∑ ( m , n ) ∈ C [ α n ≠ α m ] exp ⁡ ( − β ∥ z m − z n ∥ 2 ) V(\alpha, z)=\gamma \sum_{(m, n) \in C}\left[\alpha_{n} \neq \alpha_{m}\right] \exp \left(-\beta\left\|z_{m}-z_{n}\right\|^{2}\right) V(α,z)=γ(m,n)C[αn=αm]exp(βzmzn2)

迭代能量最小化分割

​ GrabCut 算法通过迭代, 在每次迭代过程中求取目标和背景建模的 GMM 参数更优, 使得图像分割更优。
​ 首先, 通过用户框选且标得到一个初始的 trimap T \mathrm{T} T, 即方框外的像素全部作为背 景像素 T B T_{B} TB, 而方框内 T U T_{U} TU 的像素全部作为可能是目标的像素。对 T B T_{B} TB 内的每一像素 n n n, 初始 化像素 n n n 的标签 α n = 1 \alpha_{n}=1 αn=1, 其他的设置成 α n = 0 \alpha_{n}=0 αn=0 的像素, 这样就可以通过像素估计目标和 背景的 GMM 模型。然后开始进行迭代最小化步骤:

  1. 对每个像素分配 GMM 中的高斯分量

k n : = argmin ⁡ k n D n ( α n , k n , θ , z n ) k_{n}:=\operatorname{argmin}_{k_{n}} D_{n}\left(\alpha_{n}, k_{n}, \theta, z_{n}\right) kn:=argminknDn(αn,kn,θ,zn)

  1. 对于给定的图像数据 Z, 学习优化 GMM 的参数

θ : = argmin ⁡ θ U ( α , k , θ , z ) \theta:=\operatorname{argmin}_{\theta} U(\alpha, k, \theta, z) θ:=argminθU(α,k,θ,z)

  1. 分割估计

min ⁡ { α n : n ∈ T U } min ⁡ k E ( α , k , θ , z ) \min _{\left\{\alpha_{n}: n \in T_{U}\right\}} \min _{k} E(\alpha, k, \theta, z) {αn:nTU}minkminE(α,k,θ,z)

  1. 重复步骤1-3,直到收敛
  2. 采用border matting对分割的边界进行平滑等等后期处理。

Border Matting技术会使目标分割边界更加自然和perfect。

源码下载

基于opencv和qt的多功能抠图应用

参考

Interactive graph cuts for optimal boundary & region segmentation of objects in ND images

" GrabCut" interactive foreground extraction using iterated graph cuts

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rosen.

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值