image-processing - k-means 中的聚类中心?

标签 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

最佳答案

我认为您进行 K 均值聚类的空间存在一些困惑。在问题中包含的代码片段中,您正在使用矢量化人脸图像作为数据点来训练 KMeans 模型。 K 均值簇与您提供的数据位于同一空间中,因此(正如您所注意到的)您的簇质心也将是矢量化的面部图像。重要的是,这些面部图像的维度为 9216,而不是维度 2(即 x-y 坐标)!

要获取二维 (x, y) 坐标作为 K 均值质心,您需要使用二维输入数据运行算法。就在我的脑海中,似乎您可以对脸部图像应用黑暗阈值,并组装仅包含黑暗像素位置的聚类数据集。然后,在该数据集上运行 K 均值后,质心有望接近面部图像中最暗像素的像素位置。这些位置(假设训练数据中的面部图像已经在一定程度上注册)应该稍微靠近您希望的眼睛和嘴角。

这可能真的很令人困惑,所以我会尝试添加一个示例。举个例子,您有 3 像素宽 x 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-means 中使用此“图像”,那么您实际上是在 12 维空间中运行 K-means 算法,并且上面的图像将矢量化为:

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

那么您的 K 均值聚类质心也将位于同一个 12 维空间中。

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

1 1
0 2
2 3

在这个例子中,我们从这个“图像”中提取了 3 个二维点;图像越多,您就会获得更多的二维点。对这些二维数据点运行 K 均值后,您将获得聚类质心,也可以将其解释为原始图像中的像素位置。您可以在图像顶部绘制这些质心位置,并查看它们在图像中的对应位置。

关于image-processing - k-means 中的聚类中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29368939/

相关文章:

python - 将图像清理成只有黑色

image-processing - JPEG 算法 - 用 Hadamard 变换替换 DCT

python - 类型错误 : object of type 'numpy.int64' has no len()

python - 使用 numpy loadtxt 将 CSV 文件导入 Google Colab

python - scikit RandomForestClassifier - 真实结果与预测分数不匹配

c - 图像修复/cvRectangle()

image-processing - 为什么在物体检测中使用LUV颜色空间来呈现物体?

python - Numpy 大小要求

machine-learning - 随机梯度下降和 Q-Learning 中的小批量处理

python - Keras 输入形状抛出值错误预期 4d 但得到形状为 (60000, 28,28) 的数组