標題 | SLIC superpixel算法 |
作者 | YangZheng |
聯系方式 | 263693992 |
SLIC算法是simple linear iterative cluster的簡稱,該算法用來生成超像素(superpixel)。
基本思想
算法大致思想是這樣的,將圖像從RGB顏色空間轉換到CIE-Lab顏色空間,對應每個像素的(L,a,b)顏色值和(x,y)坐標組成一個5維向量V[l, a, b, x, y],兩個像素的相似性即可由它們的向量距離來度量,距離越大,相似性越小。
算法首先生成K個種子點,然后在每個種子點的周圍空間里搜索距離該種子點最近的若干像素,將他們歸為與該種子點一類,直到所有像素點都歸類完畢。然后計算這K個超像素里所有像素點的平均向量值,重新得到K個聚類中心,然后再以這K個中心去搜索其周圍與其最為相似的若干像素,所有像素都歸類完后重新得到K個超像素,更新聚類中心,再次迭代,如此反復直到收斂。怎么樣,是不是感覺很像K-means聚類算法。
該算法接受一個參數K,用於指定生成的超像素數目。設原圖有N個像素,則分割后每塊超像素大致有N/K個像素,每塊超像素的邊長大致為S=[N/K]^0.5,開始我們每隔S個像素取一個聚類中心,然后以這個聚類中心的周圍2S*2S為其搜索空間,與其最為相似的若干點即在此空間中搜尋。這里有一個問題,為了避免所選的聚類中心是邊緣和噪聲這樣的不合理點,算法做了改進, 在3*3的窗口中將聚類中心移動到梯度最小的區域,梯度定義為:
這樣就可以避免上面所說的情況。
最后可能出現一些小的區域d被標記為歸屬某一塊超像素但卻與這塊超像素沒有連接,這就需要把這塊小區域d重新歸類為與這塊小區域d連接的最大的超像素中去,以保證每塊超像素的完整。
算法詳解
1 初始化聚類中心
初始化聚類中心,因為算法給定了距離,所以算法的初始中心為所划分區域的中心,即根據所給定的數量,划定所屬類別的初始地區,如下圖紅框所示:
現在我們要將N為9的9*9的圖像划分成為k為4的4個大小接近的超像素,做法就是首先以步距為
的距離划分超像素,然后將中心位置的結點為超像素的中心結點。設置中心像素的時候論文還進行了進一步的處理,即在中心結點的3*3領域內選取梯度最小的點作為初始超像素的中心結點,也就是下圖中分別取黃色區域中梯度最小的點作為中心結點,好處是可以避免將超像素定位在邊緣上,並且減少用噪聲像素接種超像素的機會。不過官網上給出的matlab代碼和下面要分析的南開大學給出的源碼並沒有進行這一步操作。個人覺得進行這步操作效果會得到改善,不過改善效果有限,有沒有這一步影響不大,一個像素的間距對像素顏色的影響有限。
2 計算距離,跟新質心
其中m表示空間和像素顏色的相對重要性的度量。當m大時,空間鄰近性更重要,並且所得到的超像素更緊湊(即它們具有更低的面積與周長比)。當m小時,所得到的超像素更緊密地粘附到圖像邊界,但是具有較小的規則尺寸和形狀。當使用CIELAB色彩空間時,m可以在[1,40]的范圍內。
第二個比較新穎的地方是計算距離的時候作者與傳統的采用Kmeans進行分割的算法不同,並不是對整個空間的所有像素進行計算,而是限定了區域,區域大小為2S,即尋找時以初始聚類中心為尋找中心,確定一個2S*2S的矩形,如下圖所示:
圖1:減少超像素搜索區域。SLIC的復雜性在圖像O(N)中的像素數目中是線性的,而常規的k均值算法是O(kNI),其中I是迭代次數。這在分配步驟中提供了每個聚類中心的搜索空間。(a)在常規k均值算法中,從每個聚類中心到圖像中的每個像素計算距離。(b)SLIC僅計算從每個聚類中心到2S×2S區域內的像素的距離。注意,期望的超像素大小僅為S×S,由較小的正方形表示。這種方法不僅減少了距離計算,而且使得SLIC的復雜性與超像素的數量無關。
好處是顯而易見的,限制搜索區域的大小顯着地減少了距離計算的數量,這樣可以極大的加快速度,可以將算法控制為線性復雜度。
接着便是對kMeans算法進行迭代,直到算法收斂或迭代次數大於某一個值,根據論文大部分圖像在迭代次數為10以內,具體迭代思路如下:
3 合並孤立點
采用連通分量算法進行進一步的處理,這一步是我一開始不太明白的地方,不太懂什么是孤立的結點。直到我調試代碼才明白,即迭代完成后有可能產生如下圖所示的形狀,圖中的黃色方框所框出的結點也就是所謂的孤立點,為了使分割效果更好,我們通常不希望存在這種結點,於是可以采用連通分量進行下一步地修正。
圖中的綠框為類別2的搜索范圍,所以有可能產生圖中黃色框中的孤立結點
作者采用的連通分量的概念來解決這個問題,簡單說來就是,根據4鄰域連通或8鄰域連通(代碼采用的是4鄰域的連接方式)的連通算法,則圖中的黃色方框皆為一個聯通分量,判斷這個聯通分量的面積,如果面積過小,則將聯通分量的分類分給最近的類別,即左上角的兩個2分為1,左下角分為3,右下角分為4(具體的實現可以參看代碼)。
圖解算法
實現代碼
https://github.com/csjy309450/SLIC-Superpixels
參考資料: