SLIC(simple linear iterativeclustering) ,即簡單線性迭代聚類憔购。將彩色圖像轉(zhuǎn)化為CIELab顏色空間和XY坐標(biāo)下的5維特征向量导而,然后對5維特征向量構(gòu)造距離度量標(biāo)準(zhǔn)献雅,對圖像像素進(jìn)行局部聚類的過程。SLIC算法能生成緊湊占锯、近似均勻的超像素袒哥。其實(shí)質(zhì)是將K-means算法用于超像素聚類。復(fù)雜度是O(NKI), 其中消略,N是圖像的像素數(shù)堡称,K是聚類數(shù),I是迭代次數(shù)艺演。
SLIC的具體實(shí)現(xiàn)的步驟:
(1)將圖像轉(zhuǎn)換為CIELab顏色空間;
(2)初始化K個種子點(diǎn)(聚類中心)却紧,在圖像上平均灑落K個點(diǎn),K個點(diǎn)均勻的占滿整幅圖像;
(3)對種子點(diǎn)在內(nèi)的nXn(一般為3X3)區(qū)域計算每個像素點(diǎn)梯度值钞艇,選擇值最凶墓选(最平滑)的點(diǎn)作為新的種子點(diǎn),這一步主要是為了防止種子點(diǎn)落在了輪廓邊界上;
(4)對種子點(diǎn)周圍2S*2S的方行區(qū)域內(nèi)的所有像素點(diǎn)計算距離度量哩照,S=sqrt(N/K), N是圖像的像素個數(shù);
(5)每個像素點(diǎn)都可能被幾個種子點(diǎn)計算距離度量挺物,選擇其中最小的距離度量對應(yīng)的種子點(diǎn)為其聚類中心。
from skimage.segmentation import slic, mark_boundaries
from skimage import io
img = io.imread('./data/coffee.png')
segments = slic(img, n_segments=400, compactness=30)
out = mark_boundaries(img,segments)
io.imsave('./data/coffee_result.png', out)
coffee.png
coffee_result.png