人像晶格化-超像素預分割+塊內均值

人像晶格化-超像素預分割+塊內均值

一、晶格化效果

使用超像素分割算法SLIC進行聚類,在每個類中進行均值化。
項目地址:https://github.com/wchstrife/DigitalImageProcessing

1.1 運行環境

  • python 3.7
  • skimage
  • tqdm
  • numpy

1.2 運行

  1. cd SLIC-Superpixels
  2. python slic.py

1.3 算法原理

SLIC算法採用了K-means的算法思想,對於像素進行聚類,同時爲了降低算法複雜度,只考慮某一區域進行聚類。在考量距離時,同時考慮LAB顏色空間和XY距離空間。

算法的輸入只有一個參數K,代表要分割K個像素,假設原來圖像有N個像素,則每個超像素大小爲N/K,超像素的邊長爲S=N/KS=\sqrt{N/K}

首先將K個聚類的中心均勻的分佈在圖像上,然後調整聚類中心的位置:放在K爲中心3*3的區域內梯度最小的點上,這樣可以防止超像素中心落在噪點和邊界上。

用一個label數組記錄像素點屬於哪個聚類,dist數組記錄到像素中心的距離。

對於聚類中心X,計算周圍2S範圍內的點,使用公式更新dist數組中的最小距離,並且更新其屬於哪個聚類。距離公式如下:

dc=(ljli)2 d_c = \sqrt{(l_j - l_i)^2}

ds=(xixj)2+(yiyj)2+(zizj)2 d_s = \sqrt{(x_i - x_j)^2 + (y_i - y_j)^2 + (z_i - z_j)^2}

D=dc2+(yiyj)2+(dsS)2m2 D = \sqrt{d_c^2 + (y_i - y_j)^2 + (\frac{d_s}{S})^2 m^2}

最後對每個聚類內的像素點進行像素平均。

注意要將顏色空間從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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章