人像晶格化-超像素預分割+塊內均值
一、晶格化效果
使用超像素分割算法SLIC進行聚類,在每個類中進行均值化。
項目地址:https://github.com/wchstrife/DigitalImageProcessing
1.1 運行環境
- python 3.7
- skimage
- tqdm
- numpy
1.2 運行
cd SLIC-Superpixels
python slic.py
1.3 算法原理
SLIC算法採用了K-means的算法思想,對於像素進行聚類,同時爲了降低算法複雜度,只考慮某一區域進行聚類。在考量距離時,同時考慮LAB顏色空間和XY距離空間。
算法的輸入只有一個參數K,代表要分割K個像素,假設原來圖像有N個像素,則每個超像素大小爲N/K,超像素的邊長爲。
首先將K個聚類的中心均勻的分佈在圖像上,然後調整聚類中心的位置:放在K爲中心3*3的區域內梯度最小的點上,這樣可以防止超像素中心落在噪點和邊界上。
用一個label數組記錄像素點屬於哪個聚類,dist數組記錄到像素中心的距離。
對於聚類中心X,計算周圍2S範圍內的點,使用公式更新dist數組中的最小距離,並且更新其屬於哪個聚類。距離公式如下:
最後對每個聚類內的像素點進行像素平均。
注意要將顏色空間從RGB轉換到LAB空間。
超參數設置:
iterations = 10 : 根據經驗,只需要迭代10次就可以達到收斂條件
K = 1000, 2000, 5000 :超像素的個數
M = 10-40 : 顏色空間差異的參數,M越大代表空間相似性起到的作用更大,生成的超像素塊越緊湊;越小形狀和大小越不規範。
1.4 算法效果
K = 1000, M = 10, 20, 30 時效果如下:
M = 10, K = 1000, 2000, 5000時效果如下:
1.5 參考文獻
[1] Achanta, Radhakrishna, Appu Shaji, Kevin Smith, Aurélien Lucchi, Pascal Fua and Sabine Süsstrunk. SLIC Superpixels Compared to State-of-the-art Superpixel Methods. IEEE Transactions on Pattern Analysis and Machine Intelligence 34, 11 (2012): 8. 2274-2282. https://doi.org/10.1109/TPAMI.2012.120.