Reference:
[1] Felzenszwalb, P.F. & Huttenlocher, D.P. International Journal of Computer Vision (2004) 59: 167. https://doi.org/10.1023/B:VISI.0000022288.19776.77
这篇文章阐述了一种传统的图像分割的方法,不需要任何的先验知识,原理也十分简单易懂。它是著名的标定框提取算法Selective search的基础。
这篇文献将图像的所有像素点视为一个无向图 G = ( V , E ) G=(V,E) G=(V,E)的节点,将各条边 e = ( v i , v j ) ∈ E e=(v_i,v_j)\in E e=(vi,vj)∈E对应于每一对相邻节点的连接。其权值 w ( v i , v j ) w(v_i,v_j) w(vi,vj)为相邻两个节点的差。
分割算法中,最极端的情况是将每个像素都视为一个子图。该算法的初始化将图像分割为单个像素,并逐步进行融合,形成越来越少但越来越大的分割区域。给出一些定义:
1、Internal Difference I n t ( ⋅ ) {\rm Int}(\cdot) Int(⋅)
定义 I n t ( C ) {\rm Int}(C) Int(C)为节点集 C C C的最小生成树(Minimum Spanning Tree,MST)的最大权值。记为:
I n t ( C ) = max e ∈ M S T ( C , E ) w ( e ) I n t ( C ) = 0 i f o n l y o n e n o d e {\rm Int}(C)=\max_{e\in MST(C,E)}w(e)\\ {\rm Int}(C)=0\ \ {\rm if \ only\ one\ node} Int(C)=e∈MST(C,E)maxw(e)Int(C)=0 if only one node
2、Component Difference D i f ( ⋅ ) {\rm Dif}(\cdot) Dif(⋅)
定义 D i f ( C i , C j ) {\rm Dif}(C_i,C_j) Dif(Ci,Cj)为连接两个子图的最小权值。记为:
D i f ( C i , C j ) = min v i ∈ C i , v j ∈ C j , ( v i , v j ) ∈ E w ( v i , v j ) {\rm Dif}(C_i,C_j)=\min_{v_i\in C_i,v_j \in C_j,(v_i,v_j)\in E}w(v_i,v_j) Dif(Ci,Cj)=vi∈Ci,vj∈Cj,(vi,vj)∈Eminw(vi,vj)
如果不存在连接,则其 D i f ( C i , C j ) {\rm Dif}(C_i,C_j) Dif(Ci,Cj)为 ∞ \infin ∞。
3、基于以上定义,我们可以判断两个相邻子图间是否存在边界,判断方式如下:
D ( C i , C j ) = { T r u e D i f ( c i , c j ) > min { I n t ( c i ) , I n t ( c j ) } F a l s e o t h e r w i s e {\rm D}(C_i,C_j)=\left\{ \begin{aligned} True\qquad {\rm Dif}(c_i,c_j)>\min\{{\rm Int}(c_i),{\rm Int}(c_j)\}\\ False\qquad otherwise\qquad\qquad\qquad\qquad\qquad \end{aligned} \right. D(Ci,Cj)={TrueDif(ci,cj)>min{Int(ci),Int(cj)}Falseotherwise
即,当图间距离大于图内距离时,其就有大概率可以成为分割的边缘。但这种判断方法有个缺陷:如果子图的像素点很少(尤其是单像素的情况),它的周边成为边缘的概率会变大,所以要对小区域进行惩罚。其判断准则演变为:
D i f ( C i , C j ) > min { I n t ( C i ) + k ∣ C i ∣ , I n t ( C j ) + k ∣ C j ∣ } {\rm Dif}(C_i,C_j)>\min\{{\rm Int}(C_i)+\frac{k}{|C_i|},{\rm Int}(C_j)+\frac{k}{|C_j|}\} Dif(Ci,Cj)>min{Int(Ci)+∣Ci∣k,Int(Cj)+∣Cj∣k}
其中 ∣ C i ∣ |C_i| ∣Ci∣为 C i C_i Ci区域的大小。
有了以上定义,算法流程可以归结为:
(1)初始化
将图片中的每个像素设为一个子图component。显然每个区域有 I n t ( C i ) = 0 {\rm Int}(C_i)=0 Int(Ci)=0。然后将所有edges进行升序排序,可得到 e ∈ E = { e 1 , e 2 , . . . e m } e \in E = \{e_1, e_2, ... e_m\} e∈E={e1,e2,...em}。
(2)迭代( q = 1 , 2 , . . . , m q=1,2,...,m q=1,2,...,m)
Step 1:提取边 e q = ( v i , v j ) e_q=(v_i,v_j) eq=(vi,vj),其中 v i ∈ C i v_i\in C_i vi∈Ci, v j ∈ C j v_j \in C_j vj∈Cj。
Step 2:当 C i ≠ C j C_i \neq C_j Ci̸=Cj时,如果 D ( C i , C j ) = F a l s e D(C_i, C_j)=False D(Ci,Cj)=False,则将 C i C_i Ci与 C j C_j Cj融合,同时使 I n t ( C i ∪ C j ) = w ( e q ) {\rm Int}(C_i \cup C_j)=w(e_q) Int(Ci∪Cj)=w(eq)。
Step 3: q ← q + 1 q \gets q+1 q←q+1,返回Step 1。