Bootstrap

【图像分割】GrabCut算法

1.常见的图像分割方法比较

  • Magic Wand:从用户指定的像素点(或者区域)开始计算与之连接的像素的所属区域,并使得所有选择的像素,在一定的误差范围内,都落在指定区域的颜色统计范围之内。虽然用户交互很简单,但是找到正确的误差范围却非常的困难,甚至是不可能的。图(a)展示了使用Adobe Photoshop 7中Magic Wand方法的结果。由于前景和背景像素的颜色空间中的分布具有相当大的重叠,所以不能实现令人满意的分割。
  • Intelligent Scissors:允许用户通过用鼠标粗略追踪物体的边界来选择一个“最小成本轮廓”。如果所计算的轮廓不符合期望,那么就需要用户添加额外的seeds。图(b)展示了Adobe Photoshop 7中使用该方法的结果。
  • Bayes matting:基于颜色分布概率实现。将原图分为三部分(trimap),即 T = { T B , T U , T F } T=\lbrace T_B,T_U,T_F \rbrace T={TB,TU,TF}。其中, T B T_B TB是用户标记的背景区域, T F T_F TF是用户标记的前景区域, T U T_U TU是未被标记的区域。该方法通常可以获得比较好的抠图效果(见图©),但是前提条件是 T U T_U TU区域面积不是很大,并且前景和后景的颜色分布比较好区分。
  • Knockout 2:是Photoshop的专有插件,也需要用户定义trimap,类似于Bayes matting。二者的结果也是相似的。但是分割质量有时较低。结果见图(d)。
  • Graph Cut:请见本人的另一篇博客:【图像分割】Graph Cut算法,其分割效果见图(e)。(如果想深刻了解GrabCut算法,强烈推荐先学习Graph Cut算法。

2.GrabCut图像分割算法

原论文地址:“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts.

GrabCut图像分割算法是在Graph Cut算法的基础上,主要在三个方面进行了优化,最终减少了用户的交互式操作,改善了其分割结果,见图(f)。

接下来详细简介GrabCut都进行了哪三方面的优化。

2.1.彩色数据模型

GrabCut算法的惩罚函数的构造和Graph Cut类似:

也分为区域项边界项

  • 区域项:
  • 边界项:


    (<…>表示求期望)

2.1.1.区域项

在Graph Cut中,区域项的计算是基于灰度直方图。对于彩色图像来说,这无疑会损失大量的信息,因此在GrabCut中,区域项采用高斯混合模型(Gaussian Mixture Model,GMM)

高斯混合模型指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布。公式为:

P ( y ∣ θ ) = ∑ k = 1 K α k ϕ ( y ∣ θ k ) P(y\mid \theta)=\sum_{k=1}^K \alpha_k \phi(y\mid \theta_k) P(yθ)=k=1Kαkϕ(yθk)

其中, α k \alpha_k αk是系数, α k ≥ 0 \alpha_k \geq 0 αk0, ∑ k = 1 K α k = 1 \sum_{k=1}^K \alpha_k=1 k=1Kαk=1 ϕ ( y ∣ θ k ) \phi(y\mid \theta_k) ϕ(yθk)是高斯分布密度, θ k = ( μ k , σ k 2 ) \theta_k=(\mu_k,\sigma_k^2) θk=(μk,σk2)

ϕ ( y ∣ θ k ) = 1 2 π σ k e x p ( − ( y − μ k ) 2 2 σ k 2 ) \phi(y\mid \theta_k)=\frac {1}{\sqrt{2\pi}\sigma_k}exp^{(-\frac{(y-\mu_k)^2}{2\sigma_k^2})} ϕ(yθk)=2π σk1exp(2σk2(yμk)2)

称为第 k k k个分模型,也称为第 k k k个分量。

但是需要注意的是,因为输入图像绝大部分都是RGB三通道的彩色图像,所以GMM中每个分模型都是三维高斯分布。多维高斯分布公式:

N ( x ‾ ∣ μ ‾ , Σ ) = 1 ( 2 π ) D 2 1 ∣ Σ ∣ 1 2 e x p [ − 1 2 ( x ‾ − μ ‾ ) T Σ − 1 ( x ‾ − μ ‾ ) ] N(\overline x \mid \overline \mu,\Sigma)=\frac {1}{(2\pi)^{\frac {D}{2}}} \frac{1}{\mid \Sigma \mid^{\frac{1}{2}}} exp[-\frac{1}{2}(\overline x- \overline \mu)^T\Sigma^{-1}(\overline x - \overline \mu)] N(xμ,Σ)=(2π)2D1Σ211exp[21(xμ)TΣ1(xμ)]

其中, x ‾ \overline x x表示维度为 D D D的向量, μ ‾ \overline \mu μ则是这些向量的平均值, Σ \Sigma Σ表示所有向量 x ‾ \overline x x的协方差矩阵。

GrabCut算法中共构建两个GMM,一个用于前景,另一个用于背景。每个GMM均有五个高斯分量,即 k = 5 k=5 k=5。注意:为了方便计算能量函数最小化,2.1部分中的公式取了负对数。

2.1.2.边界项

边界项的公式基本和Graph Cut的一样,只是有稍微的变化:

对应Graph Cut论文,这里把 R ( A ) R(A) R(A)的系数 λ \lambda λ变更为 1 λ \frac {1}{\lambda} λ1赋给 B ( A ) B(A) B(A)正比公式的后项(相当于式 E ( A ) = λ R ( A ) + B ( A ) E(A)=\lambda R(A)+B(A) E(A)=λR(A)+B(A)两边同时除以 λ \lambda λ,因为 λ ≥ 0 \lambda \geq 0 λ0,所以等式左边有没有 1 λ \frac {1}{\lambda} λ1不影响求解最小值),再乘以一个常数 p p p使得正比关系变为相等关系,即有 γ = p λ \gamma=\frac {p}{\lambda} γ=λp

根据经验,一般情况下 γ = 50 \gamma=50 γ=50。距离采用欧式距离。

2.2.迭代

Graph Cut只对cost function进行了一次最小化求解,而在GrabCut中进行迭代操作,具体流程见下:

2.2.1.初始化

1.用户初始化一个 t r i m a p trimap trimap T T T,只有 T B T_B TB是给定的。即用户给定的矩形之外的区域为 T B T_B TB,矩形之内的区域为 T U T_U TU(即含有 T B T_B TB又含有 T F T_F TF)。

2.对于属于 T B T_B TB区域的像素点的标签设为0(背景),即 n ∈ T B , α n = 0 n \in T_B,\alpha_n =0 nTB,αn=0。对于属于 T U T_U TU区域的像素点的标签设为1(前景,先认为矩形框内的全部为前景),即 n ∈ T U , α n = 1 n \in T_U,\alpha_n=1 nTU,αn=1

3.根据标记为0或1的像素点,分别建立前景和背景的GMM。(补充:可以通过k-means算法分别把属于前景和背景的像素点聚类为k类,对应建立GMM中的k个高斯分量,而每个高斯分量的权值可以通过属于该高斯分量的像素点个数与总的像素点个数的比值来确定。)

2.2.2.迭代最小化

1.根据已有GMM,判断每个像素点的归属( T B T_B TB T U T_U TU)。

2.根据新得到的 T B T_B TB T F T_F TF,重新估计GMM参数。

3.最大流\最小割算法求得最小割。

4.重复第一步到第三步,直到结果收敛。

5.对边界进行平滑处理。(⚠️OpenCV中的GrabCut算法并没有这一步,所以其分割效果和论文中的结果有一定的差异。)

2.2.3.用户编辑

  • Edit:在分割结果不理想的情况下,用户可以额外再指定一些像素点作为前景或者后景,并相应的更新 t r i m a p trimap trimap T T T。然后执行2.2.2部分的第三步,求得最终的分割结果。
  • Refine:【可选】执行整个迭代最小化流程。

2.3.用户交互操作

GrabCut算法简化了用户交互操作。用户只需要通过矩形框(也可以是其他形式的mask)划分出 T U T_U TU区域和 T B T_B TB区域即可。并且允许用户进行进一步的编辑,改善分割结果。


想要获取最新文章推送或者私聊谈人生,请关注我的个人微信公众号:⬇️x-jeff的AI工坊⬇️

个人博客网站:https://shichaoxin.com

GitHub:https://github.com/x-jeff


;