关注深度学习、神经网络最近几年发展的朋友一定知道,现在图像的语义分割等技术最近几年发展非常迅猛,最典型的就是像Mask R-CNN这样的神作,可以非常精准的从图像中分割出不同的物体。

但是在深度学习方法尚未开启的时代,人们又是用什么方式进行抠图的呢?今天我就来给大家介绍一个非常经典的图像分割方法:GrabCut,其原论文如下。

Rother et al., “Interactive Foreground Extraction with Iterated Graph Cuts,” SIGGRAPH 2004.

大家可以看到这篇论文发表于2004年,此时深度学习的概念都还未提出。当时的人们是如何做到图像的精确分割的呢?

一、问题说明

在GrabCut之前,已经有很多方法用于解决图像的前景背景分割了,但是它们要么是不够精确,经常出现错误,要么是需要非常繁琐的用户交互操作(例如我们前面讲过的Intelligent Scissors)。而GrabCut要解决的就是如何用最简单快速的用户交互来实现最准确的图像分割:

其实不仅是GrabCut的作者,其他人也都在进行类似的研究,但总有各种问题出现。而GrabCut则在前人研究成果的基础上,创造性的引入了多种改进点,让这个问题得到了较好的解决。话不多说,接下来我们就来欣赏下作者的成果。

二、效果展示

上面这几张都是用户只需要在界面上拖出一个红框包裹住前景,然后GrabCut就可以自动将前景分割出来。

有的时候,仅仅框住前景还不能得到最好的结果,GrabCut还支持迭代式的修复,能够允许用户用画线的方式标注出前景或背景,从而得到更加精准的结果,例如下图中,第一遍红框框住士兵时,算法只得到了部分前景,帽子和一部分脚的像素丢失了,还有帽子旁边有一小部分背景的镂空区域被标注为前景了。GrabCut允许用户用画线的方式对此进行修正,从而自动得到更加准确的结果:

不仅如此,在GrabCut算法中,还允许对复杂的前景边缘,例如动物的毛发,进行更精细的修复,得到非常好的结果。下面这张图也来自GrabCut原论文,它从左到右展示了用不同的用户交互程度对图像进行标注,然后用Grabcut自动得到分割的结果。可以看到结果非常好,而且总的用户交互也很少:

那么,看起来如此不错的一种算法,它的原理是什么呢?我在下一节为你分解。

三、基本原理

3.1 Graphcut图像分割

讲到基本原理,就不得不提到另外一篇发表于2001年的经典论文:

Interactive graph cuts for optimal boundary and region segmentation of objects in N-D images

这篇论文阐述了一种让用户交互式的指定图像中部分前景和背景区域,然后自动化的分割前景和背景的方法。

在这篇文章中:

  1. 首先,需要用户明确指出少量背景像素B和前景目标像素O。
  2. 然后将图像建立为图(Graph),像素就是图上的节点(Node)
  3. 有两个特殊的节点是T节点(background terminal, 表示背景)以及S节点(Object Terminal, 表示前景)
  4. 在所有节点之间建立连接。图像像素之间的连接称作n-links,像素到特殊节点之间的连接称作t-links
  5. 为所有的连接赋以能量或权重。t-links的能量代表着一个像素有多么像前景或背景,所有下图中那些已经被标注为前景或背景的像素对应的t-links很粗。n-links的能量约束着像素之间是否会被分配为不同的区域,下图中如果相邻节点越有可能被分开,其连接越细,能量越小。
  6. 为了分割前景和背景,文章最后会采用min-cut方法,寻找一条能够使得被切开的连接的总能量最小的缝隙

看到这里,大家应该感觉到此方法的关键就是如何为连接赋以合适的能量E。原论文将E用非常经典的Gibbs形式表达为:

其中:

  • A代表每个像素的标签,例如前景标记为1,背景标记为0
  • R(A)代表当所有像素被标记后,总体的代价值

由于用户已经标记出了部分的前景和背景像素,因此已经标记的前景部分和背景部分都分别有自己的统计信息,例如直方图,我们可以认为这样的信息是先验信息。当我们执行分割后会对每个像素都标记不同的标签,此时得到的前景部分和背景部分又会有自己的直方图。当这种推断出来的直方图和先验直方图比较匹配时,R(A)较小,否则R(A)比较大。而 是用于控制R的权重。

  • B(A)代表当相邻的像素被标记为不同的标签时的代价

如果两个相邻像素颜色相近,但却被标注为了不同的区域,那么B(A)就较大,否则B(A)就较小。

因此,当我们对每条边都给予了不同的代价时,就可以按上图所示方法,寻找使得整体分割代价最小的前景与背景之间的间隙,也相当于对不同的像素分配给了前景或背景,这个过程使用的是我们之前在xxx中提到过的最小割(min-cut)算法。

3.2 GraphCut方法的缺陷以及GrabCut想要解决的问题

GraphCut方法看起来很不错,但它也有一些关键的缺陷。

  1. 尽管作者提到用户标注的前景和背景部分有各种类型的统计信息可以作为先验信息,但是作者实际上采用的是灰度直方图,它使得整个设计只适用于单色图片,而不适用于彩色图片。其论文中的例图也都是灰度图。
  2. 由于需要用户来标注前景和背景,因此给用户增加了负担。而且,如果用户标注的部分和图像的其他部分的统计分布不一致时,也会导致分割结果的错误。
  3. 针对第2点所产生的错误,GraphCut方法需要用户自己去修补,采用的方法是让用户在错误区域进行重新的标注,然后进行新的min-cut计算。这种机制设定最终会导致该算法有种”戳一下,跳一下“的感觉。
  4. GraphCut是一种二值的硬分割,整个画面要么是前景,要么是背景。而真实的自然图像里面有一些区域是既有前景也有背景的,应该是一种软分割,在前景和背景之间有一些混叠的部分。

针对这些错误,我们今天所讲述的GrabCut做了针对性的改进,我列表如下:

作者的论文中列出了GrabCut的完整算法流程:

3.3 GrabCut容易出错的地方和完整解决方案

GrabCut也并非完美的算法,它也有容易出错的地方。下面展示了在一些特殊场景,例如前景和背景对比度低比较混淆时,或前景和背景有大量细小镂空区域时,或是用户通过画框所标注的背景区域不能代表全图的背景区域的统计特征时,都容易出错。

为了解决这些问题,GrabCut在交互方式上也像其他算法一样,支持用户迭代式的改进。

3.4 GrabCut和其他方法的比较

作者的论文中列出了GrabCut和其他方法在交互方式和结果上的比较:

可以看到,GrabCut对用户的操作要求是最简单的,而结果却并非常好。注意这里为了能够让GraphCut算法支持彩色图片,作者的实现将统计信息换成了GMM。

因此,GrabCut的目标是让用户画最少的时间得到尽可能好的结果。作者还和PhotoShop中的磁力套索Magnetic Lasso在特定数据集上做了对比,结果证明只要初始的分割边缘的正确程度超过50%,那么GrabCut的结果就会优于磁力套索。

四. 应用

类似GrabCut这样的前景背景分割技术的直接应用就是”大神帮忙p个图“,我们来看看作者们列出的例子:

好吧,最后一张是苍老师乱入,我自己弄的,非作者所为

五、总结

在深度学习的各种厉害的抠图算法出来之前,有很多人研究了各种各样的方法进行前景的提取。我们今天介绍的GrabCut是一种能够让用户用最少的操作最快获取较高质量抠图效果的算法,它的特点和创新点是:

  1. 迭代式的采用GraphCut算法进行前景背景的分离
  2. 用户只需要用方框或套索标出背景就可以对很多图像进行初步分割
  3. 对边缘采用Matting方法进行精细化的软分割
  4. 在用户交互上运行进行迭代式的修补

总而言之,即便到了今天,其中的一些思想也依然有借鉴意义。例如,当今在为深度学习的算法准备数据集时,必要涉及到对图像进行标注。在标注过程中,虽然现在可以采用一些高级方法进行初步抠图,但难免会出现错误,此时,如何用最小的用户交互操作对初次结果进行修补,并(也许是迭代式的)自动化的计算出更精细的抠图结果,就是对好的标注工具的要求了。

六、参考资料

这篇文章参考了如下资料:

1. Rother et al., “Interactive Foreground Extraction with Iterated Graph Cuts,” SIGGRAPH 2004.
2. BOYKOV, Y., AND JOLLY, M.-P. 2001. Interactive graph cuts for optimal boundary and region segmentation of objects in N-D images. In Proc. IEEE Int. Conf. on Computer Vision, CD–ROM.
3. Rother et al, GrabCut presention of Microsoft Research Cambridge

最后,苍老师的图像来自下面链接,如果侵权请告知我,我立刻换图,盘上很多

http://www.hinews.cn/pic/0/14/96/00/14960084_412487.jpg

我在抠苍老师时,使用了OpenCV中自带的Sample,其地址在:

https://github.com/opencv/opencv/blob/master/samples/cpp/grabcut.cpp

Grab Cut与Graph Cut相关推荐

  1. 图像分割之(三)从Graph Cut到Grab Cut

    上一文对GraphCut做了一个了解,而现在我们聊到的GrabCut是对其的改进版,是迭代的Graph Cut.OpenCV中的GrabCut算法是依据<"GrabCut" ...

  2. matlab grab cut,matlabGrabCutS graph 算法, 编写,可以运 能直观看到结果。 272万源代码下载- www.pudn.com...

    文件名称: matlabGrabCutS下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 2462 KB 上传时间: 2015-04-18 下载次数: 12 ...

  3. 图像分割之(二)Graph Cut(图割)

    上一文对主要的分割方法做了一个概述.那下面我们对其中几个比较感兴趣的算法做个学习.下面主要是Graph Cut,下一个博文我们再学习下Grab Cut,两者都是基于图论的分割方法.另外OpenCV实现 ...

  4. Graph Cut and Its Application in Computer Vision

    Graph Cut and Its Application in Computer Vision 原文出处: http://lincccc.blogspot.tw/2011/04/graph-cut- ...

  5. Graph cut [转]

    [简介] Graph Cuts 不等于 graph cut(如 min cut.normalized cut.RatioCut), 是最近在计算机视觉中研究和应用比较多的energy minimiza ...

  6. Graph Cut(图割算法)

    转载自:http://blog.csdn.net/zouxy09/article/details/8532111 Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背 ...

  7. linux cut性能,Linux cut

    使用说明 cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出. 如果不指定 File 参数,cut 命令将读取标准输入.必须指定 -b.-c 或 -f 标志之一. 主要 ...

  8. linux cut 命令,Linux cut命令的用法介绍

    Linux cut命令用于根据字段提取文件内容.文本文件没有像数据库那样的行/列,有时我们只需要单列数据.根据分隔符剪切已识别的列(例如:冒号':',分号';',逗号','等). 对于下面示例,我们采 ...

  9. 抠图应用程序设计(一)——GrabCut算法的实现

    简介 ​ GrabCut是一种基于Graph Cut的图像分割算法,从待分割的对象周围用户指定的边界框开始,使用高斯混合模型估计目标对象和背景的颜色分布.在像素标签上构造马尔可夫随机场,其能量函数优先 ...

最新文章

  1. 在 Ubuntu 下安装 Discuz! 7.0
  2. python 统计分析apache日志_python分析apache访问日志脚本分享
  3. C# 获取当前月第一天和最后一天 计算两个日期差多少天
  4. Tableau可视化分析实战系列浏览 Tableau 环境(四) -功能区和卡参考
  5. include(),include_once(),requice(),require_once()的区别
  6. HDU 1561 The more, The Better (树形DP,常规)
  7. NIO与传统IO的区别(形象比喻)
  8. C语言程序练习-L1-023 输出GPLT (20分)
  9. Linux 安装 MySQL 以及 一些常见问题解决方案
  10. MQ队列管理器_PMTS命令
  11. python word 转html,怎么用python将Word转成html?
  12. vsco怎么两个滤镜叠加_做图比设计师还快?!这帮饭圈女孩是怎么做到的?
  13. android 台球开源,森林里的台球赛 Android新游《丛林撞球》
  14. 抽样调查之分层随机抽样
  15. win10重置网络命令_重置网络:Win10重置网络的技巧
  16. 外联式 vue+element ui 表格导出e'xcel
  17. win10 安装 SqlServer2008 亲测可行
  18. 让人又爱又恨的C语言
  19. 没人带宝宝,所以才要送去托育园?
  20. Placement service – placement安装(wallaby-allinone)

热门文章

  1. java 实现自动生成部署文档_jenkins的部署、实现自动拉取gitlab仓库代码、实现项目中代码自动部署以及项目关联触发......
  2. cmd中文乱码,输入chcp 65001
  3. 【小沐学Unity3d】Unity插件之天气系统UniStorm
  4. 哈希算法的原理和用途详解
  5. IOS自动化第二篇:WebDriverAgent安装、编译和appium使用
  6. 【信息系统安全/计算机系统安全】期末复习(HITWH)
  7. task-11 xgb算法实战
  8. ORA-03113:通信通道的文件结尾
  9. 服务器跑网站用nigx还是apache,Apache和IIS及nginx三大web服务器,新手站长该如何选择?...
  10. Java的无参构造函数