Kmeans:数据坐标中的标签和输出中心是什么

时间:2016-08-31 11:20:11

标签: c++ opencv

我很难理解labelscentres在kmeans中的含义,特别是OpenCV的kmeans()函数。

据我所知,kmeans会在数据样本中找到k个簇。并且centres参数告诉我每个群集的中心/质心。

但是当我尝试检查我的centres时,标签是什么?它说我有2行3列但是我运行了6个集群的kmeans - 那么'中心'不应该有6行(每个簇1个)?最后检查中心的值是输出浮点值 - 它们不应该是索引(整数)吗?与数据样本数组的索引一样。

如何在运行kmeans后获得聚类中心(在数据坐标中)?最终我试图找到最常见的颜色 - 所以我认为聚类中心是BGR / HSV / Lab值取决于我的Mat类型?

kmeans(collapsedImage, 6, labels,
    TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0),
    3, KMEANS_PP_CENTERS, centres);


printf("rows: %d, cols: %d", centres.rows, centres.cols); 
// outputs 'rows : 2, cols : 3'

for (int i = 0; i < centres.rows; i++) {
    for (int j = 0; j < centres.cols; j++) {
        std::cout << centres.at<float>(i, j) << " ";
    }

    std::cout << std::endl;
}

// Outputs: Why are these floats???
// 1.48938 0.578623 0.464539
// 242.628 131.947 80.5347

1 个答案:

答案 0 :(得分:0)

Ok so @Miki has explained what labels are and below solves how to get the cluster centres (I'm pretty sure this is correct):

printf("cols: %d, rows: %d", centres.cols, centres.rows);
int x = 0;
for (int i = 0; i < centres.rows; i++) {

    Vec3b s(centres.at<float>(i, 0), centres.at<float>(i, 1), centres.at<float>(i, 2));
    std::cout << "Dominant Colour (aka Cluster centre?): " << s << std::endl;

    rectangle(image, Rect(x, 10, 10, 10), s, 3, 0);
    x += 22;
}