![](https://img-blog.csdnimg.cn/20190815174019565.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNzE3OTc0NA==,size_16,color_FFFFFF,t_70)
目录
- 3.1 EGBIS
- 3.1.1 算法基础概念
- 3.1.2 EGBIS 算法
- 3.1.3 算法应用
- 参考资料
3.1 EGBIS
在本章内容中,我们将介绍基于图的高效图像分割(Efficient Graph-Based Image Segmentation, EGBIS)算法,该算法是基于图的贪婪聚合算法,原理简单,速度较快,也是后期诸如选择搜索、语义分割等算法的基础。EGBIS 算法的目标是作为一种通用的图像分割计算方法,因此在设计之初就被要求满足:
- 能够捕获视觉上重要的区域,且具有全局观
- 需要具备较高的计算性能,运行时间应该是图像像素大小的线性函数
然而,这样的设计目标存在很多难点,例如,如何将一个图片划分为多个区域,如何定义一个指标去检测划分的优劣,以及如何解决局部高变区域的划分以及如何保证这个过程的计算高效性。实际上,在此之前已有许多解决方案,但是这些方式通常速度很慢,且对局部高变区域处理的不够理想,不能捕获非局部特性。
下图解释了什么是高变区域及非局部图像特征,
【图 1】
左上角是我们的原始图像,直觉上它分为三个主要区域,左侧的渐变矩形区域,右侧带孔的常值矩形区域以及右侧中间像素高度变化的小矩形区域。如果我们仅仅使用相邻像素之间的差值作为划分依据,由于高变区域内像素之间的差值远大于渐变区域内以及渐变区域边界与常值区域之间的差值,若阈值设定较大,则高变区域内图像则会被划分为多个极小的区域而其他区域化为一体(如右下角图像),这就是典型的单纯局部特性捕获,反之处理,则高变区域会归为常值区域中(如右上角图像),而通过 EGBIS 自适应的非局部特征捕获则可以较好的将图像划分为视觉上的三个区域(如左下角图像)。
3.1.1 算法基础概念
图在计算机算法中是一种基本的数据结构,可以表达为
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) ,其中
V
V
V 是图中的所有顶点集合,在该算法中,对应的是图像中的所有像素点集合,
E
E
E 代表图中顶点之间的边。每条边具有不同的权重
w
(
v
i
,
v
j
)
w(v_i, v_j)
w(vi,vj),以衡量两个顶点
v
i
,
v
j
v_i, v_j
vi,vj 之间的差值。我们可以将图
G
G
G 划分为多个不重叠的区域集合
S
S
S,
S
S
S 中每个小区域我们称之为
C
C
C。
【图 2】
为了判断两个区域之间是否存在一个边界,我们定义如下的判定准则,
D ( C 1 , C 2 ) = { true , if D i f ( C 1 , C 2 ) > M I n t ( C 1 , C 2 ) false , otherwise D(C_1, C_2)= \begin{cases} \text{true}, & \text {if $Dif(C_1, C_2) > MInt(C_1,C_2)$} \\ \text{false}, & \text{otherwise} \end{cases} D(C1,C2)={true,false,if Dif(C1,C2)>MInt(C1,C2)otherwise
其中 D i f ( C 1 , C 2 ) Dif(C_1,C_2) Dif(C1,C2) 评估的是两个不同区域中元素之间的距离值,而 M I n t ( C 1 , C 2 ) MInt(C_1, C_2) MInt(C1,C2) 评估的是一个区域内部两个元素之间的距离值,如图 2 所示。
D i f ( C 1 , C 2 ) Dif(C_1, C_2) Dif(C1,C2) 具体指的是两个不同区域中所有元素组合中距离最小的值,形象化可以理解为两个区域中最近点之间的距离,反过来 M I n t MInt MInt 应该评估的是一个区域内部某种最大的距离。即,如果一个区域内部相当紧密,不同区域间最小间距大于单个区域内部的最大距离,我们则认为两个区域间确实存在边界,否则,两个区域应该被合并为一个大区域。具体地:
D i f ( C 1 , C 2 ) = min v i ∈ C 1 , v j ∈ C 2 , ( v i , v j ) ∈ E w ( v i , v j ) Dif(C_1, C_2)=\min_{v_i \in C_1, v_j \in C_2, (v_i, v_j)\in E} w(v_i, v_j) Dif(C1,C2)=vi∈C1,vj∈C2,(vi,vj)∈Eminw(vi,vj)
在给出 M I n t MInt MInt 具体形式之前,我们先介绍一下最小生成树(MST)的概念。最小生成树是一棵连通加权无向图中所有节点且整体权值最小的一棵树。
【图 3,图片来源自维基百科】
如图 3 所示,浅灰色线及黑色线组成一个带有权值的无向图,黑色线组成的树连接了图中所有顶点且保证了所有权重加权最小。 I n t Int Int 被定义为 MST 中权值最大的边(以上图为例为 8)。即:
I n t ( C ) = max e ∈ M S T ( C , E ) w ( e ) Int(C)=\max_{e \in MST(C,E)}w(e) Int(C)=e∈MST(C,E)maxw(e)
这里并没有直接在内部采用任意两个元素之间的距离,因为这存在大量的冗余连接,而最小生成树可以摒弃这种冗余连接。在实际使用过程中,我们在 I n t Int Int 指标上做了一点处理,即 M I n t MInt MInt
M I n t ( C 1 , C 2 ) = min ( I n t ( C 1 ) + τ ( C 1 ) , I n t ( C 2 ) + τ ( C 2 ) ) MInt(C_1,C_2)=\min(Int(C_1)+\tau(C_1), Int(C_2)+\tau(C_2)) MInt(C1,C2)=min(Int(C1)+τ(C1),Int(C2)+τ(C2))
根据公式,我们可知, M I n t MInt MInt 取两个区域中 I n t Int Int 较小者,即两个区域中,只要有一个内部区域的最大值小于 D i f Dif Dif ,则认为两个区域间存在边界,这也是很直观的。另外 τ ( C ) = k / ∣ C ∣ \tau(C)=k/|C| τ(C)=k/∣C∣ 是一个阈值项。 ∣ C ∣ |C| ∣C∣ 表示区域内顶点数。如果不加这一项,对于较小的区域评估误差较大,例如极端情况下,如果区域中只存在一个顶点,则 I n t = 0 Int=0 Int=0. k k k 是一个常量,对于较大的 k k k 会导致趋向于划分较大区域块,极端情况,如果 k = + ∞ k=+\infty k=+∞,则 M I n t = + ∞ MInt=+\infty MInt=+∞,则任意区域间不存在边界,即整理聚为一块。 k k k 的取值需要结合聚类结果决定,对于边界差异较强的图像可以采用较小的 k k k 值。
3.1.2 EGBIS 算法
-
将图 G G G 中所有边按权重值大小非递减排序, Sort E = π = ( o 1 , … , o m ) \text{Sort}_E = \pi=(o_1, \dots, o_m) SortE=π=(o1,…,om) ,共有 m m m 个边
-
S 0 S^0 S0 作为初始阶段,所有的顶点 v i v_i vi 分别作为一个独立的区域 C C C
-
设置一个变量 q = 1 , … , m q=1, \dots, m q=1,…,m 循环第 3 步:
-
给定 S q − 1 S^{q-1} Sq−1 我们构造 S q S^q Sq,具体的:
-
取出第 0 步中经过排序的,边序列中的第 q q q 个权重, v i , v j v_i,v_j vi,vj 分别为该边所连接的两个顶点,例如 o q = w ( v i , v j ) o_q=w(v_i, v_j) oq=w(vi,vj)
-
如果在 S q − 1 S^{q-1} Sq−1 阶段, v i , v j v_i, v_j vi,vj 处于两个不同的区域中,且 w ( o q ) w(o_q) w(oq) 比它们的内部区域距离都小,则应该合并它们,否则什么也不做。
上步中形式化描述为:设 S q − 1 S^{q-1} Sq−1 阶段包含 v i v_i vi 顶点的区域为 C i q − 1 C_i^{q-1} Ciq−1,包含 v j v_j vj 顶点的区域为 C j q − 1 C_j^{q-1} Cjq−1
if C i q − 1 ≠ C j q − 1 C_i^{q-1} \neq C_j^{q-1} Ciq−1̸=Cjq−1 and w ( o q ) ≤ M I n t ( C i q − 1 , C j q − 1 ) w(o_q) \leq MInt(C_i^{q-1},C_j^{q-1}) w(oq)≤MInt(Ciq−1,Cjq−1):
from S q − 1 S^{q-1} Sq−1 to S q S^q Sq by merge ( C i q − 1 , C j q − 1 ) \text{merge}(C_i^{q-1}, C_j^{q-1}) merge(Ciq−1,Cjq−1)
else:
S q = S q − 1 S^q = S^{q-1} Sq=Sq−1
-
-
最终的 S = S m S = S^m S=Sm 作为返回结果。
3.1.3 算法应用
![](https://img-blog.csdnimg.cn/20190909191611160.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNzE3OTc0NA==,size_16,color_FFFFFF,t_70)
【图 4, σ = 0.5 , k = 1500 , m i n _ s i z e = 20 \sigma=0.5,k=1500, min\_size=20 σ=0.5,k=1500,min_size=20】
在实际使用过程中,我们通常需要利用高斯核对原图进行平滑处理,该过程不会改变原图的视觉效果却帮助我们移除掉图像中的一些伪影,如上图所示,左侧是我们的原图,中间及右侧图像均为利用 EGBIS 算法得到的切分结果,其中中间图像的色彩使用的划分区域内所有像素点的均值填充的,而右侧的色彩搭配则是随机的。
参考资料
1、Efficient Graph-Based Image Segmentation
2、Tutorial PPT
3、Efficient Graph-Based Image Segmentation in Python