原理部分参考zouxy09大神的博客:https://blog.csdn.net/zouxy09/article/details/8534954
GrabCut是Graphcut的一种升级版。该算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只要少量的用户交互操作即可得到比较好的分割结果。
你只需要在目标外面画一个框,把目标框住,它就可以完成良好的分割:
Grab Cut和Graph Cut有何不同?
(1)Graph Cut的目标和背景的模型是灰度直方图,Grab Cut取代为RGB三通道的混合高斯模型GMM;
(2)Graph Cut的能量最小化(分割)是一次达到的,而Grab Cut取代为一个不断进行分割估计和模型参数学习的交互迭代过程;
(3)Graph Cut需要用户指定目标和背景的一些种子点,但是Grab Cut只需要提供背景区域的像素集就可以了。也就是说你只需要框选目标,那么在方框外的像素全部当成背景,这时候就可以对GMM进行建模和完成良好的分割了。即Grab Cut允许不完全的标注(incomplete labelling)。
1、RGB颜色空间模型
我们采用RGB颜色空间,分别用一个K个高斯分量(一取般K=5)的全协方差GMM(混合高斯模型)来对目标和背景进行建模。于是就存在一个额外的向量k = {k1, . . ., kn, . . ., kN},其中kn就是第n个像素对应于哪个高斯分量,kn∈ {1, . . . K}。对于每个像素,要不来自于目标GMM的某个高斯分量,要不就来自于背景GMM的某个高斯分量。其中公式7为图像的能量.。
其中,U就是区域项,表示一个像素被归类为目标或者背景的惩罚,也就是某个像素属于目标或者背景的概率的负对数,这里与GraphCut中Rp(lp)的意思一致。我们知道混合高斯密度模型是如下形式:
所以取负对数之后就变成式(9)&#