集群中心是k-means?

时间:2015-03-31 12:40:39

标签: image-processing numpy machine-learning scikit-learn

我有一个96x96像素的灰度面部图像。我想找到眼睛中心和唇角。我在面部图像上应用了一个gabor滤镜(theta = pi / 2,lamda = 1.50),在卷积后我得到了这样的滤镜输出。

Gabor filter response

从gabor输出中可以看出,眼角和嘴角明显可辨。我应用scikit kmeans聚类将像素组合成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)

现在问题是:如何绘制4个聚类中心的质心x,y坐标?我会看到眼睛中心和嘴角吗

更多信息:我绘制了estimator.cluster_centers_,输出就像一本代码簿。我没有看到聚类质心的坐标。

Kmeans codebook

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

1 个答案:

答案 0 :(得分:1)

我认为这里有一些关于你进行K-means聚类的空间的混淆。在问卷中包含的代码段中,您使用矢量化面部图像作为数据点来训练KMeans模型。 K-means群集与您提供的数据位于同一个空间中,因此(正如您所注意到的)您的群集质心也将是矢量化的脸部图像。重要的是,这些面部图像具有尺寸9216,而不是尺寸2(即,x-y坐标)!

要将二维(x,y)坐标作为K-means质心,需要使用二维输入数据运行算法。就在我的脑海中,您似乎可以对脸部图像应用暗度阈值,并组装仅有暗像素位置的聚类数据集。然后在此数据集上运行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

如果您使用此&#34;图像&#34;直接在K-means中,您真正在12维空间中运行K-means算法,上面的图像将被矢量化为:

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

然后你的K-means聚类质心也将存在于同一个12维空间中。

我试图建议您可以提取每个图像中1的(x,y)坐标,并将其用作K-means算法的数据。因此,对于上面的示例图像,您将获得以下数据点:

1 1
0 2
2 3

在这个例子中,我们从这个&#34;图像&#34;中提取了3个二维点。通过更多图像,您可以获得更多的二维点。使用这些二维数据点运行K-means后,您将获得聚类质心,这些聚类质心也可以解释为原始图像中的像素位置。您可以在图像上绘制这些质心位置,并查看它们在图像中的对应位置。