1. 程式人生 > >機器學習:simple linear iterative clustering (SLIC) 演算法

機器學習:simple linear iterative clustering (SLIC) 演算法

影象分割是影象處理,計算機視覺領域裡非常基礎,非常重要的一個應用。今天介紹一種高效的分割演算法,即 simple linear iterative clustering (SLIC) 演算法,顧名思義,這是一種簡單的迭代聚類演算法,這個演算法發表於 2012 年的 PAMI 上。

SLIC 演算法有幾個關鍵點,
1: 影象分割塊的初始化,每一個影象塊都是一個聚類,聚類的中心稱為 superpixel,聚類的個數 k 是人為設定的,SLIC 演算法先將影象分成大小大小一致的影象 patch,假設影象的畫素個數為 N, 需要分割的影象 patch 個數為 k, 那麼每個 patch 的大小為 S

×S,S=N/k

2:聚類中心的初始化,在劃分好的影象塊裡,隨機取樣一個點作為聚類的中心,為了避免取樣的初始點是噪聲或者是在邊緣部分,演算法做了一點變化,在取樣點附近 3×3 的區域計算臨近畫素點的梯度,選擇臨近點中梯度最小的點為聚類中心。

3: 計算畫素點到聚類中心的距離,影象分好塊,選擇好了每一個影象塊的聚類中心,接下來就是計算影象中每一個畫素點離聚類中心的距離了,這裡與通常的聚類演算法不一樣,一般的聚類演算法會計算畫素點離每一個聚類中心的距離,換句話說,每一個聚類中心都要和所有的畫素點計算距離,這個明顯是費時,而且也是沒有必要的,SLIC 演算法簡化了這一步,只計算每個聚類中心周圍 2

S×2S 範圍類的畫素點與該聚類中心的距離,這樣可以節省很多的運算時間。

為了可以衡量距離,這個演算法考慮了 空間距離 和 顏色距離 兩種:

dc=(ljli)2+(ajai)2+(bjbi)2
ds=(xjxi)2+(yjyi)2
D=(dcm)2+(dsS)2

演算法最後衡量距離的形式如下所示:

D=(dc)2+(dsS)2m2

在 CIELAB 顏色空間中,論文中提到 m 的取值範圍大概是 [1, 40]

4:重新聚類,計算完距離之後,每一個畫素點都會更新自己所屬的影象塊,將同一個影象塊的畫素點取平均,得到新的聚類中心,然後再重複前面的步驟,直到兩次聚類中心的距離小於某個閾值。演算法的流程圖如下所示:

這裡寫圖片描述

給出一段Python 的程式碼:

# import the necessary packages
from skimage.segmentation import slic
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
from skimage import io
import matplotlib.pyplot as plt


# load the image and convert it to a floating point data type
image = img_as_float(io.imread("image.jpg"))

# loop over the number of segments
for numSegments in (100, 200, 300):
    # apply SLIC and extract (approximately) the supplied number
    # of segments
    segments = slic(image, n_segments = numSegments, sigma = 5)

    # show the output of SLIC
    fig = plt.figure("Superpixels -- %d segments" % (numSegments))
    ax = fig.add_subplot(1, 1, 1)
    ax.imshow(mark_boundaries(image, segments))
    plt.axis("off")

# show the plots
plt.show()

這裡寫圖片描述

這裡寫圖片描述