本文源自微信公众号【Python编程和深度学习】原文链接:[GraphCut和GrabCut图像分割方法及Matlab实例](https://mp.weixin.qq.com/s?__biz=MzUxNTY1MjMxNQ==&mid=2247484194&idx=1&sn=6177d5431cec230fc1c14b56e9620b11&chksm=f9b22c96cec5a580204cb64d9c8e0b36fbcb1e4f0bea6a7a3e2b1ffcd94eeabf111893532978&token=1404604522&lang=zh_CN#rd),欢迎扫码关注鸭!
![扫它!扫它!扫它](http://cookdata.cn/media/bbs/images/公众号_1602413881117_5d14.jpg =200x200)
# 目录
[一、Graph Cut](#1)<br>
[二、Grab Cut](#2)<br>
<div id="1"></div>
##一、Graph Cut
Graph Cut把图像分割问题与图的最小割(min cut)问题相关联,首先用一个无向图G=表示要分割的图像,V和E分别是顶点(vertex)和边(edge)的集合。此处的Graph比普通图多了2个顶点(”S”和”T”,称为终端顶点)。其它所有的顶点都必须和这2个顶点相连。一个图像对应的s-t图如下:
![](http://cookdata.cn/media/bbs/images/1_1602746976792_5d14.jpg)
实线的边表示每两个邻域普通顶点连接的边n-links,虚线的边表示每个普通顶点与s和t连接的边t-links。在目标分割中,s一般表示前景目标,t一般表示背景。每条边都有一个非负的权值we,一个cut(割)(图中边集合E的一个子集C)的cost就是边子集C的所有边的权值的总和,如果它的边的所有权值之和最小,那么这个就称为最小割,也就是图割的结果。最小割把图的顶点划分为两个不相交的子集S和T,对应于图像的前景像素集和背景像素集。
Graph cut的3x3图像分割示意图如下:
![](http://cookdata.cn/media/bbs/images/2_1602747045734_5d14.jpg)
下面用Matlab演示一下GraphCut的实例,源代码连接:https://github.com/taigw/GrabCut-GraphCut
在运行user_interface.m之后会弹出交互窗口,Load Image 导入我们的图像,
![](http://cookdata.cn/media/bbs/images/3_1602747088838_5d14.jpg=715x*)
选择GraphCut, Scribbles, 鼠标左键简单描绘目标区域,右键简单描绘背景区域,
![](http://cookdata.cn/media/bbs/images/4_1602747123487_5d14.jpg)
点击Go即可完成图像分割,之后进行一些交互式的优化后,点击Save Segmentation既可以保存分割结果了。
![](http://cookdata.cn/media/bbs/images/5_1602747165783_5d14.jpg)
![](http://cookdata.cn/media/bbs/images/6_1602747190646_5d14.jpg)
<div id="2"></div>
##二、Grab Cut
是迭代的Graph Cut,利用了图像中的纹理(颜色)信息和边界(反差)信息,只要少量的用户交互操作即可得到比较好的分割结果。你只需要在目标外面画一个框,把目标框住,它就可以完成良好的分割,还可以和GraphCut结合,增加额外的用户交互(由用户指定一些像素属于目标),得到更加完美的分割结果。
GrabCut的缺点是如果背景比较复杂或者背景和目标相似度很大结果不太好,而且速度有点慢。
Graph Cut和GrabCut的不同点有:
(1)Graph Cut的目标和背景的模型是灰度直方图,Grab Cut取代为RGB三通道的混合高斯模型GMM;
(2)Graph Cut的能量最小化(分割)是一次达到的,而Grab Cut取代为一个不断进行分割估计和模型参数学习的交互迭代过程;
(3)Graph Cut需要用户指定目标和背景的一些种子点,但是Grab Cut只需要提供背景区域的像素集就可以了。也就是说你只需要框选目标,那么在方框外的像素全部当成背景,这时候就可以对GMM进行建模和完成良好的分割了。即Grab Cut允许不完全的标注(incomplete labelling)。
下面用Matlab演示一下GrabCut的实例,代码连接:https://github.com/taigw/GrabCut-GraphCut
在运行user_interface.m之后会弹出交互窗口,Load Image 导入我们的图像,选择GrabCut, Bounding box, 鼠标左键框出目标区域,点击Go,完成初步分割
![](http://cookdata.cn/media/bbs/images/8_1602747361215_5d14.jpg)
之后进行一些交互式的Scribbles优化后,点击Save Segmentation既可以保存分割结果了。
![](http://cookdata.cn/media/bbs/images/9_1602747398456_5d14.jpg =715x*)
部分转自:https://blog.csdn.net/kyjl888/article/details/78253829