我有一张96×96像素的灰度人脸图像。我试图找到眼睛中心和嘴唇角。我在人脸图像上应用了一个Gabor滤波器(theta=pi/2, lamda=1.50),卷积后得到的滤波器输出如下所示。
从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.shapeprint '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_,输出看起来像一个代码书。我没有看到聚类中心的坐标。
我使用了这篇论文中描述的步骤:http://jyxy.tju.edu.cn/Precision/MOEMS/doc/p36.pdf
回答:
我认为这里对你进行k-means聚类的空间有些混淆。在你问题中包含的代码片段中,你使用向量化的人脸图像作为数据点来训练KMeans
模型。k-means聚类存在于你提供的数据相同的空间中,因此(正如你所注意到的)你的聚类中心也将是向量化的人脸图像。重要的是,这些人脸图像的维度是9216,而不是2维(即x-y坐标)!
要获得2维(x, y)坐标作为你的k-means聚类中心,你需要使用2维输入数据运行算法。仅凭直觉,似乎你可以对人脸图像应用一个黑暗阈值,并组装一个仅包含暗像素位置的聚类数据集。然后在你对这个数据集运行k-means后,聚类中心希望能接近人脸图像中最多的暗像素位置。这些位置(假设你的训练数据中的人脸图像已经大致对齐)应该与你希望的眼睛和嘴角位置相当接近。
这可能真的很 confusing,所以我会尝试添加一个例子。假设你有“人脸图像”,宽3像素,高4像素。在对其中一张图像进行阈值处理后,它可能看起来像这样:
0 1 2 <-- x坐标0 0 0 0 ^ y坐标0 1 0 1 |1 0 0 2 |0 0 1 3 v
如果你直接在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 10 22 3
在这个例子中,我们从这个“图像”中提取了3个2维点;有了更多的图像,你会得到更多的2维点。在你使用这些2维数据点运行k-means后,你将得到可以解释为原始图像中像素位置的聚类中心。你可以将这些中心位置绘制在你的图像上,并查看它们在图像中的对应位置。