论文原文: Efficient Graph-Based Image Segmentation
最近看RCNN,里面用到了Selective Search来产生region proposal。Selective Search用到的方法就是本文中提到的产生Region的方法。即:基于图的贪心聚类算法。该算法实现简单,速度较快。
1. 图像分割
图像分割的主要目的就是将图像(image)分割成若干个特定的、具有独特性质的区域(region),然后从中提取出感兴趣的目标(object)。而图像区域之间的边界定义是图像分割算法的关键,论文给出了一种在图表示(graph-based)下图像区域之间边界的定义的判断标准(predicate),其分割算法就是利用这个判断标准(predicate)使用贪心选择(greedy decision)来产生分割(segmentation)。该算法在时间效率上,基本上与图像(Image)的图(Graph)表示的边(edge)数量成线性关系,而图像的图表示的边与像素点成正比,也就说图像分割的时间效率与图像的像素点个数成线性关系。这个算法有一个非常重要的特性,它能保持低变化(low-variability)区域(region)的细节,同时能够忽略高变化(high-variability)区域(region)的细节。这个性质很特别也很重要,对图像有一个很好的分割效果(能够找出视觉上一致的区域,简单讲就是高变化区域有一个很好聚合(grouping),能够把它们分在同一个区域).
在做图像分割,首先需要理解如何定义一个区域,我们人眼可以很轻松地解决这个问题,但是使用数字化语言定义就没有那么容易了。比较直观的区域划分方法有,区域的颜色,边缘,纹理。
比如下面的这个图:
我们希望把它们分割成三个区域:左半部分是灰度渐进变化的,右半部分外层灰度均匀变化,内层灰度变化较大。
2. 图像(image)的图(graph)表示
图像(image)的图表示是指将图像(image)表达成图论中的图(graph)。具体说来就是,把图像中的每一个像素点看成一个顶点vi ∈ V(node或vertex),像素点之间的关系对(可以自己定义其具体关系,一般来说是指相邻关系)构成图的一条边ei ∈ E,这样就构建好了一个图 G = (V,E)。图每条边的权值是基于像素点之间的关系,可以是像素点之间的灰度值差,也可以是像素点之间的距离(如果是4-邻域相邻关系的话,这个权值就没意义了)。
将图像表达成图之后,接下来就是要如何分割这个图,或者这么理解,将每个节点(像素点)看成单一的区域,然后进行合并。文中使用最小生成树方法合并像素点,然后构成一个个区域。最小生成树(MST, minimum spanning tree), 给定需要连接的顶点,选择边权之和最小的树。上图即是一棵MST。
本文中,初始化时每一个像素点都是一个顶点,然后逐渐合并得到一个区域,确切地说是连接这个区域中的像素点的一个MST。如图,棕色圆圈为顶点,线段为边,合并棕色顶点所生成的MST,对应的就是一个分割区域。分割后的结果其实就是森林。
3. 相关定义
3.1 Internal Difference
假定图G已经简化成了MST, 一个分割区域C包含若干个顶点。顶点之间通过最小生成树的边连接。这个内部差(
ID
I
D
)就是指分割区域C中包含的最大边的权值。
即一个最小生成树中最大边的权值。对于单个像素点, Int=0 I n t = 0 。
3.2 Difference
两个区域的类间差异为
Diff(C1,C2)
D
i
f
f
(
C
1
,
C
2
)
。指的是两个分割区域之间顶点相互连接的最小边的权值。
如果两个分割部分之间没有边连接,定义 Diff(C1,C2)=∞ D i f f ( C 1 , C 2 ) = ∞ 。其实也不一定要选择两个区域连接的边的最小值,但是其他的标准将是一个NP-Hard问题。因此文中选择的是最小值。
4. 两个区域的合并标准
根据直观的理解,如果满足下面的条件,则将两个区域合并:
即两个区域的不相似度的最小值,小于任何一个区域的不相似度的最大值,就将两个区域合并。刚开始,每个区域都是单个的像素点,Int为0。因此都是0容忍的,只有像素值完全一样才能合并,导致过分割。因此刚开始的时候,应该给每个像素点一个可以容忍的范围。当生长到一定范围时,应该去掉初始容忍值的作用。原文条件为:
其中:
在每个 Int I n t 值后面增加了一个 r(C) r ( C ) :
其中 |C| | C | 为区域 C C 所包含的像素点的个数。这样随着区域的逐渐扩大,这一项的作用就越来越小,最后几乎可以忽略。就是一个可以控制所形成的区域大小的一个因子。如果 k=0 k = 0 ,则每个像素成为一个独立的区域。如果 k=+∞ k = + ∞ ,则整张图片聚成一块。因此 k k 越大,分割后的图片也就越大。
5. 算法分割步骤
0. 对于图G的所有边,按照权值进行升序排序。
1. 是一个原始分割,相当于每个顶点都是一个分割区域。
2.
q=1,2,⋯,m
q
=
1
,
2
,
⋯
,
m
,不断重复4中的操作。(m为边的条数,每次处理一条边)。
3. 根据上次
S[q−1]
S
[
q
−
1
]
的构建,选择一条边
o[q](vi,vj)
o
[
q
]
(
v
i
,
v
j
)
,如果
vi,vj
v
i
,
v
j
在两个互不相交的区域中,并且这两个区域满足合并条件,则合并这两个区域。否则什么也不做。
4. 最后得到的分割就是所求的分割
S=S[m]
S
=
S
[
m
]
。