图像分割之图割
学习图像分割,使用属于图割(Graph Cut)方法的Efficient Graph-Based Image Segmentation进行实验。
实验问题
图像分割(Segmentation)1指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程。
实验环境
操作系统:Ubuntu 14.04.3 LTS
开发环境:gcc v4.8.5
实验过程
这里使用Efficient Graph-Based Image Segmentation2作为本次实验的解决方案。
这篇文章解决了把图像分割成区域的问题。文章定义了一个使用图像的图表示(graph-based)来衡量两个区域边界置信度的预测器,然后设计了一个基于该预测器的有效分割算法,并表明虽然该算法使用贪心决策但它产生的分割满足全局特性。文章使用2种不同的局部邻居的方法来构建图,并阐明真实与合成图像的结果。该算法的运行时间几乎与图的边数目成线性关系,在实验中也很快。该方法的一个重要特征是它能保持在变化较低的图像区域的细节,同时忽略了在变化较高的区域的细节。
相关工作
图像的图表示
图像的图表示是指将图像表达成图论中的图G=(V,E)。具体来说就是,把图像中的每一个像素点看成一个顶点vi∈V,像素点之间的关系对(一般指相邻关系)构成图的一条边ei∈E。图k 每条边的权值是基于像素点之间的关系,例如可以为像素点之间的灰度值差。
最小生成树
图像用图表示之后,可以使用最小生成树方法合并像素点,使其构成若干个区域。
相关定义
分割区域(Component)的内部差(Internal difference)
假设图G已经简化成了最小生成树MST(C,E),一个分割区域C包含若干个顶点,顶点之间通过最小生成树的边连接。这个内部差就是指分割区域C中包含的最大边的权值。
Int(C)=maxe∈MST(C,E)w(e)
分割区域(Component)之间的差别(Difference)
指两个分割区域之间顶点相互连接的最小边的权值。
Dif(C1,C2)=minvi∈C1,vj∈C2,(vi,vj)∈Ew((vi,vj))
如果两个分割部分之间没有边连接,定义Dif(C1,C2)=∞。
分割区域(Component)边界的一种判断标准(predicate)
判断两个分割部分之间的差别Dif相对于MInt的大小,这里引入了一个阈值函数τ 来控制两者之间的差值。下面给出这个判断标准的定义:
D(C1,C2)={trueif Dif(C1,C2)>MInt(C1,C2)falseotherwise
MInt(C1,C2)=min(Int(C1)+τ(C1),Int(C2)+τ(C2))
阈值函数τ主要是为了更好的控制分割区域边界的定义。比较直观的理解,小分割区域的边界定义要强于大分割区域,否则可以将小分割区域继续合并形成大区域。在这里给出的阈值函数与区域的大小有关。
τ(C)=k/|C|
|C|是指分割部分顶点的个数(或者像素点个数),k是一个参数,可以根据不同的需求(主要根据图像的尺寸)进行调节。
分割S太精细(too fine)
如果一个分割S,存在两个分割区域C1,C2∈S,它们之间没有明显的边界,则称S太精细。
分割S太粗糙(too coarse)
如果一个分割S,一个合适的调整(refinement)S′使得S不是太精细,则称S太粗糙。
对任意一个图,都存在一个分割S,既不是太精细也不是太粗糙。
算法过程
算法如下所示。
输入: n个点、m条边的图G=(V,E)
输出: V的分割S=(C1,⋯,Cr)
对于图G的所有边,按权值进行不下降排序,得到π=(o1,⋯,om)
S0是一个原始分割,相当于每个顶点当做是一个分割区域
重复3的操作forq=1,⋯,m
根据上次Sq−1的构建。选择一条边oq(vi,vj),如果vi和vj在分割的互不相交的区域中,比较这条边的权值与这两个分割区域之间的最小分割内部差MInt,如果oq(vi,vj)<MInt,那么合并这两个区域,其他区域不变;否则什么都不做
最后得到的就是所求的分割S=Sm
算法证明
引理1 上述步骤3中两个通过边连接的互不相交区域,如果它们不合并,则它们将一直保留到最后。
步骤3中的边是这两个区域之间相互连接最小的边,若这条边不允许这两个区域合并,后面权值更大的边更不可能使得这两个区域合并,故这两个区域能够保留到最后。
定理1 通过上述算法得到的分割不是太精细。
对初始化状态S0,分割是最精细的。通过算法,把能合并的区域都合并了,得到的区域之间都有明显的分界线,所以不是太精细。
定理2 通过上述算法得到的分割不是太粗糙。
对最后的状态Sm,能够合并的区域都合并了,不能合并的都保留了下来。如果对于留下来的任意一个区域进行分割,那么必然就导致这两个子区域之间没有明显的分界线,那么这个调整是太精细。显然不存在一个调整不是太精细,故最后得到分割不是太粗糙。
定理3 在上述算法中,相同权值的不同边的顺序不影响最后的结果。
两条边e1,e2涉及四个顶点,只有当涉及到三个区域是对实验结果可能有影响,这里只讨论这种情况。在分割区域A和B之间,在分割区域B和C之间。对e1是否导致A和B合并,以及e2是否导致B和C合并,分类讨论就可以很容易得出上述结论。
算法效率分析
算法使用排序和路径压缩的并查集实现,耗时主要分为两部分:
步骤0的排序,使用常用的排序算法都能够达到O(mlog(m))。
步骤1-3,时间复杂度为O(mα(m)),α是一个非常缓慢增长的Ackerman反函数。
主要的时间都是在第二部分,α由于是一个增长非常缓慢的函数,所以基本可以认为是一个常数,这也是该算法基本能够与图像像素点数量成线性关系的原因。
算法实现
首先对图像进行一个高斯滤波,这样做可以去掉一些噪声,而又不影响图像的视觉效果。在构建图表示的过程采用四邻域点,即每个像素点与其周边四个像素点之间各构成一条边,边的权值通过计算颜色值的欧式距离衡量。当然也可以先在每个颜色通道进行分割,然后求它们的交,这样会使得分割效果更好(分割的更精细)。阈值函数τ的参数k可以根据图像大小以及需求进行调节。
实验数据集
PASCAL VOC 2012数据集
PASCAL VOC 20123数据集相关地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html
PASCAL VOC(Pattern Analysis, Statistical Modelling and Computational learning, Visual Object Classes) 2012指2012年一个视觉对象的分类识别和检测的挑战赛。
挑战的主要目标是识别一些现实场景中的视觉对象类。数据集中有20个分类,分别是:
人:人
动物:鸟、猫、牛、狗、马、羊
交通工具:飞机、自行车、船、公共汽车、汽车、摩托车、火车
室内物体:瓶子、椅子、餐桌、盆栽植物、沙发、电视/显示器
比赛主要分为分类、检测、分割3个部分,这里我们只关注分割比赛。
分割比赛需要对给定的物体分类生成像素级的分割,其它则作为背景。
实验结果
由于这篇文章并没有实现对特定对象的分割,故没办法完成PASCAL VOC 2012中对不同对象进行分割及同一类对象不同实例的分割。
这里选择几张PASCAL VOC 2012中的测试图像,使用这篇文章的分法进行实验。
部分图像及其分割结果如下。
Original Image | Segmented Image |
---|---|
![]() |
![]() |
![]() |
![]() |
参考
图像分割. 维基百科. 最后修订于2015年10月20日. https://zh.wikipedia.org/wiki/%E5%9B%BE%E5%83%8F%E5%88%86%E5%89%B2↩︎
Felzenszwalb P F, Huttenlocher D P. Efficient graph-based image segmentation[J]. International Journal of Computer Vision, 2004, 59(2): 167-181.↩︎
Visual Object Classes Challenge 2012 (VOC2012). PASCAL2. http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html↩︎