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