前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Grab Cut与Graph Cut

Grab Cut与Graph Cut

作者头像
bye
发布2020-10-30 11:01:40
1.7K0
发布2020-10-30 11:01:40
举报
文章被收录于专栏:bye漫漫求学路bye漫漫求学路

关注深度学习、神经网络最近几年发展的朋友一定知道,现在图像的语义分割等技术最近几年发展非常迅猛,最典型的就是像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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题说明
  • 二、效果展示
  • 三、基本原理
  • 3.1 Graphcut图像分割
  • 3.2 GraphCut方法的缺陷以及GrabCut想要解决的问题
  • 3.3 GrabCut容易出错的地方和完整解决方案
  • 3.4 GrabCut和其他方法的比较
  • 四. 应用
  • 五、总结
  • 六、参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档