您的位置:首页 > 其它

Grabcut

2015-12-01 21:10 190 查看
1
导语

想跟偶像合影,但是一直没有机会,怎么办?PS,太复杂,不太会。美图秀秀,只能增白磨皮。最后还是编程靠谱



这里用的技术就是Grabcut。Grabcut主要是一种交互式分割算法,用户需要圈出自己想要分割的东西,grabcut会迭代地将其分割出来,并且迭代过程中用户可以交互。下图实验中只是圈出矩形,并未交互,可以看出算法效果还是非常鲁棒的。



下图由于部分背景跟我们想要分割的前景比较相似,因此做了一些交互



Grabcut主要涉及了Mincut/Maxflow问题,Mincut/Maxflow是graphcut和grabcut等利用能量最小割做图像分割算法的核心,在之前的帖子中已经详细介绍。因此本节中先简单带过GMM,然后再进入GrabCut。

2 小谈GMM
高斯混合模型听起来听高端大气上档次了,然后感觉有些太数学,好多人就有点发怵,其实很简单,大多数人在日常生活中可能都用过这个技术。比如说某个人在炒股,最近股市动荡非常,自己又不懂金融股市,又想赚点小钱,那找到两个懂点的人预测下下个月的A股。A预测了一个在4000点左右的高斯分布,B预测了一个在3000点左右的高斯分布,如下图。但是A的水平要高些,预测的准确率80%,B的水平相对弱些,预测的准确率20%,因此我们把两者乘以相应的系数叠加得到了一个高斯混合模型,也就是第三幅图。



但是一般情况下大部分的用法是我们知道第三幅图,去推测第一第二图,这就是GMM和EM的核心,可以用在固定摄像头下的运动物体(前景)检测。

假设我们在监控一个房间,我们的图片就呈现了这个房间的样子,这时来了一个人,我们怎么找到这个运动前景的位置呢。我们对图片的每个像素建一个高斯混合模型,比如图片的某个像素是一个一闪一闪的灯,闪的时候像素是255,不闪的时候是0。我们取连续的100帧作为背景图像,由于不闪的时间更多和相机成相的原因,80帧左右的像素都在0左右,20帧左右都在255左右,因此我们的高斯混合模型由均值在255和0的高斯分布构成,均值255的权重为0.2,均值为0的权重我0.8.现在我们有一个前景刚好覆盖了这个像素,新的像素值为100,如果这个值都不在刚刚的哪个高斯分布的2.5个sigma(方差)范围内,我们就认为它是前景。

3 GrabCut



这里从简单理解的角度去分析Grabcut.既然我们已经介绍了mincut和GMM,那么,grabcut是怎么和上面的两个问题联系起来的的呢?
如上图,除了灰色的图像像素外,我们和mincut问题一样也有两个顶点S,T。不过这两个点是虚拟的,最开始S和T跟所有的像素都有联系(边),当最后完成分割后,和S还有联系的就作为前景,跟T还有联系的就作为背景。
如果GrabCut要用到mincut,唯一我们要做的就是怎么定义边和这些边的权重,使得最后的最小割就是我们想要的分割。S和T的边我们已经定义了,然后我们规定像素只跟旁边4连通或者8连通的像素有联系(这里我们采用8连通),这样我们就定义好了边,接着我们来定义权重。当一个点跟S有联系时,如果它是前景,我们希望它的权重越大越大,反之越小越好。那问题来了,我们一开始就不知道哪个是前景还是背景,那怎么办呢。我们可以为前景和背景建模,一开始我们不是框出了一个框么,我们可以把框内的都当做前景,框外的都当做前景,然后分别用GMM去建模(Graph
Cuts中用直方图建模)



那么像素点跟ST的权重定义如下。一个点P和S
T的权重就是找他们在F和B混合高斯模型中的概率,概率越大,我们的权重应该越大,因为我们越不希望它分割开来。如果一个点在F中,那么它跟S点的连接权重为lemda,跟T的连接权重为-log(pf)。这里我自己也有个问题,为什么跟S的连接权重为lemda.

像素点跟连通像素点的权重与距离和它们的像素差有关。像素值相差越小,距离相差越小,权重也越大。



如果我们现在就分割的话会不准确,因为我们把框内所有的都当成前景,很显然其中有一些不是。因此我们需要按照高斯混合模型的解法去迭代,迭代的过程中可以有交互。参考论文中的流程算法。



[1]“GrabCut” — Interactive Foreground Extraction using Iterated GraphCuts
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: