2015-03-31 87 views
2

我有一個96x96像素的灰度面部圖像。我試圖找到眼睛中心和嘴角。我在面部圖像上應用了一個gabor濾鏡(theta = pi/2,lamda = 1.50),並且在卷積後得到像這樣的濾鏡輸出。k-means聚類中心?

Gabor filter response

正如你可以從輸出的Gabor眼睛和嘴角看到清晰可辨。我申請scikit k均值聚類組像素起來4羣(2隻眼和2脣角落)

data = output.reshape(-1,96*96) 
estimator = KMeans(n_clusters=4) 
estimator.fit(data) 
centroids = np.asarray(estimator.cluster_centers_) 
print 'Cluster centers', centroids.shape 
print 'Labels', estimator.labels_, estimator.labels_.shape 

輸出

Input X,y: (100, 96, 96) (1783, 1) 
Gabor Filters (1, 9, 9) 
Final output X,y (100, 96, 96) (0,) 
Shape estimator.cluster_centers_: (4, 9216) 

現在問題來了:如何繪製質心的x,y 4個集羣中心的座標?我會看到眼睛中心和嘴角

更多信息:我繪製estimator.cluster_centers_,輸出就像一本代碼書。我看不到羣集質心的座標。

Kmeans codebook

我使用的步驟在本文中所描述:http://jyxy.tju.edu.cn/Precision/MOEMS/doc/p36.pdf

回答

1

我覺得這裏有關於在你做你的空間有些混亂K-means聚類。在你的問題中包含的代碼片段中,你正在使用矢量化人臉圖像作爲數據點來訓練一個KMeans模型。 K-means簇與您提供的數據生活在同一個空間中,所以(如您注意到的),您的簇質心也將是矢量化的面部圖像。重要的是,這些人臉圖像具有尺寸9216,而不是尺寸2(即,x-y座標)!

要獲得2維(x,y)座標作爲K均值質心,您需要使用2維輸入數據運行算法。就在我頭頂,似乎可以將黑暗閾值應用於您的臉部圖像,並組合僅包含黑暗像素位置的聚類數據集。然後,在此數據集上運行K-means後,質心將有望接近臉部圖像中像素最黑的像素位置。這些位置(假設您的訓練數據中的臉部圖像已經有所註冊)應該與​​您所期望的眼睛和嘴角稍微接近。

這可能非常令人困惑,所以我會嘗試添加一個示例。舉個例子,你有一個3像素寬,4像素高的「臉部圖像」。在圖像的一個閾值化後的像素可能看起來像:

0 1 2 <-- x coordinates 

0 0 0 0^y coordinates 
0 1 0 1 | 
1 0 0 2 | 
0 0 1 3 v 

如果使用直接在K-手段這個「形象」,你真正運行的K-means算法在12維空間,並且上面的圖像將被矢量化爲:

0 0 0 0 1 0 1 0 0 0 0 1 

然後,您的K均值聚類質心也將存在於相同的12維空間中。

我想提出的是,你可以提取每個圖像中1的(x,y)座標,並將它們用作K-means算法的數據。因此,對於例如上圖中,你會得到以下數據點:

1 1 
0 2 
2 3 

在這個例子中,我們從這個「形象」提取3 2維穴;隨着更多的圖像,你會得到更多的二維點。在用這些二維數據點運行K-means之後,您將獲得也可以解釋爲原始圖像中像素位置的聚類質心。您可以在圖像頂部繪製這些質心位置,並查看它們在圖像中的對應位置。

+0

看來我可能需要降低維度到2d找到聚類中心。應用閾值是一個不錯的主意:)但是即使在閾值之後,9216中高強度像素的維數也超過了100個。不可能將它帶到2d? – pbu 2015-03-31 14:04:24

+0

@pbu對不起,我感到困惑。我的意思是,在對圖像中的像素進行閾值處理後,可以提取每個暗像素的(x,y)座標,以便從每幅圖像中提取〜100(x,y)位置,然後運行K - 表示這組二維點。我會添加一個例子。 – lmjohns3 2015-04-02 00:35:13

+0

@pbu我剛剛讀了你鏈接的論文,這也是他們正在做的。仔細閱讀部分IV-B和IV-C。 – lmjohns3 2015-04-02 01:55:45