简介

​ 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} t−1ink 的权值如下:

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(lp​∣′obj′)Rp​(0)=−lnPr(lp​∣′bkg′)R(L)=p∈P∑​Rp​(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,q∈N∑​B{<p,q>}​⋅δ(lp​,lq​)δ(lp​,lq​)={0, if lp​=lq​1, if lp​=lq​​B{<p,q>}​∝exp(−2σ2(lp​−lq​)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)=n∑​D(αn​,kn​,θ,zn​)D(αn​,kn​,θ,zn​)=−logπ(αn​,kn​)+21​logdet∑(α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=1∑K​πi​gi​(x;μi​,i∑​),i=1∑K​πi​=1,0≤πi​≤1g(x;μ,∑)=(2π)d∣∑∣ ​1​exp[−21​(x−μ)T∑−1​(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(−β∥zm​−zn​∥2)

迭代能量最小化分割

​ 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​:=argminkn​​Dn​(α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​:n∈TU​}min​kmin​E(α,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

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

  1. 程序设计艺术与方法实验报告( STL 的熟悉与使用 搜索算法的实现 计算几何算法的实现 动态规划算法的实现)

    文章目录 实验一.STL 的熟悉与使用 实验二.搜索算法的实现 实验三.计算几何算法的实现 实验四.动态规划算法的实现 小组实验报告https://blog.csdn.net/qq_44977889/ ...

  2. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  3. 红包指定分配金额php,php仿微信红包分配算法的实现方法_PHP

    本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int $money 用于分配的金额 * ...

  4. php 红包算法教程,php仿微信红包分配算法的实现方法

    php仿微信红包分配算法的实现方法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int ...

  5. 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...

    计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...

  6. 计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random()、webkit中crypto等随机算法的实现

    计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random().webkit中crypto等随机算法的实现 本文篇幅较长,如想直接看 js 的随机数实现可定位本文E ...

  7. php+仿微信发红包+负数,php仿微信红包分配算法的实现方法

    本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int $money 用于分配的金额 * ...

  8. 机器学习系列文章——算法的实现(knn,朴素贝叶斯,决策树,模型评估)

    一.机器学习算法分类: 机器学习算法可分为两大类,即分类与回归.其中分类是针对离散型数据,比如判定一直动物是猫是狗,判断一个人的信用等级:而回归问题为针对连续型数据,如预测淘宝店铺销量,预测明天气温等 ...

  9. 红包的分配算法php,php仿微信红包分配算法的实现方法,红包算法

    php仿微信红包分配算法的实现方法,红包算法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @para ...

最新文章

  1. 我眼中的Linux设备树(二 节点)
  2. String 与StringBuilder
  3. java操作js文件_JS操作文件
  4. Ubuntu--useradd指令使用
  5. .net中调用exchange服务器发邮件
  6. 反积分饱和 程序_用抗积分饱和PID控制传递函数为G(s)的被控对象
  7. android自动发送dtmf,Android发送dtmf键盘事件(模拟通话界面键盘事件)
  8. 年轻人开始“反算法”
  9. python和c 先学哪个-C和Python我该先学什么?
  10. 交流异步电机矢量控制(一)——电机模型及其坐标变换
  11. 总结Learning Efficient Single-stage Pedestrian Detectors by Asymptotic Localization Fitting
  12. app invento2r wxbit版 快速开发简单蓝牙上位/蓝牙串口助手
  13. 搜狗输入法纯净_五款良心无广告的纯净输入法推荐
  14. 使用mbr2gpt将MBR磁盘转换为GPT磁盘
  15. JavaScript中onblur事件
  16. linux运维基础[系统磁盘管理]——————存储设备的识别、df、du、fsck
  17. umi 如何配置webpack_umi+dva开发环境+经常使用配置和webpack配置
  18. 密码算法测试向量——HMAC-SHA系列
  19. 穷爸爸和富爸爸读后感
  20. PS制作CSS精灵图

热门文章

  1. GDI+ 绘图闪烁解决方法
  2. 阿里跟腾讯又㕛叒打起来了,这次是在东南亚
  3. Java游戏服务器架构的并发问题及解决方案
  4. 互联网+来袭,消费者更挑剔,什么才是零售业的未来?
  5. uni-app的发展和应用
  6. 2023二建建筑施工备考第二天Day06水泥
  7. 一个人怎样才算见过世面?
  8. uniapp 使用map组件 动态自定义标记点图标及内容文字
  9. 最早的计算机网络游戏,手机网络游戏早期发展史——图文游戏
  10. 2021年会议平板十大品牌榜中榜,十大会议平板品牌销量排行榜