2015-03-31 89 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