我很难理解labels
和centres
在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
答案 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;
}