映像分割是電腦視覺領域的基本問題,而超像素分割是一個預先處理的步驟,所謂的超像素,是指具有相似紋理、顏色、亮度等特徵的相鄰像素構成的映像塊(是像素的集合),利用超像素代替像素進行影像處理,能夠在很大程度上降低後續影像處理任務的複雜度。超像素產生的演算法大致可以分成基於圖論的方法和基於梯度下降的方法,SLIC演算法屬於後者。在目前的超像素分割演算法中,SLIC的效果相對比較好。
關於超像素分割演算法的介紹,可以參考《超像素分割演算法研究綜述》一文:
http://wenku.baidu.com/link?url=NLGalCf2j04mcUbD7358Gwu1kknpD9U_8U8SlYCsLFZ5-_knoKnKTEgpuE0JnunR4Obib3CBDEqyEouwEqLhZ1oCr58YJuM8RROTHe8fUHu
關於SLIC的實現,可以參考《SLIC Superpixels》一文:
http://ivrlwww.epfl.ch/supplementary_material/RK_SLICSuperpixels/index.html
本文轉載自:http://blog.csdn.net/u014568921/article/details/44588207
以下為轉載內容:
----------------------------------------------------------------------------------------------------------------------------------------------------------
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的視窗中將聚類中心移動到梯度最小的地區,梯度定義為
G(x,y)=[V(x+1,y)-V(x-1,y)]^2+[V(x,y+1)-V(x,y-1)]^2
這樣就可以避免上面所說的情況。
因為L,a,b在CIE-Lab色彩空間,L,a,b的大小有限制,而映像尺寸則沒有限制,如果圖片的尺寸比較大,會造成衡量向量距離時空間距離(x,y)的影響過大,所以需要調製空間距離(x,y)的影響,所以需要對x,y進行normalize。改進向量距離的度量如下:
d_lab=[(Lk-Li)^2+(ak-ai)^2+(bk-bi)^2]^0.5
d_xy=[(Xi-Xk)^2+(Yk-Yi)^2]^0.5
Ds=d_lab+(m/S)*d_xy
m用來調整d_xy的權值,一般為1-20,在演算法中設定為10。
最後可能出現一些小的地區d被標記為歸屬某一塊超像素但卻與這塊超像素沒有串連,這就需要把這塊小地區d重新歸類為與這塊小地區d串連的最大的超像素中去,以保證每塊超像素的完整。 演算法流程
來看看效果吧: