在OpenCV中使用k-means进行颜色分类

5
我想用K-Means算法对很多图像进行聚类。我想设置聚类,使每个聚类表示图像的主导颜色或色调。我在使用K-Means进行彩色图像聚类论文中读到了一些关于这方面的内容。
有人知道如何在OpenCV中实现吗?
也许我可以比较每个图像的直方图。但如果我有很多图片,这需要很长时间。
1个回答

12

您可以将图像向量化,使每一行都是 RGB 颜色集合,然后使用 cv::kmeans 进行聚类,如下:

    std::vector<cv::Mat> imgRGB;
    cv::split(img,imgRGB);
    int k=5;
    int n = img.rows *img.cols;
    cv::Mat img3xN(n,3,CV_8U);
    for(int i=0;i!=3;++i)  
      imgRGB[i].reshape(1,n).copyTo(img3xN.col(i));
    img3xN.convertTo(img3xN,CV_32F);
    cv::Mat bestLables;
    cv::kmeans(img3xN,k,bestLables,cv::TermCriteria(),10,cv::KMEANS_RANDOM_CENTERS );
    bestLables= bestLables.reshape(0,img.rows);
    cv::convertScaleAbs(bestLables,bestLables,int(255/k));
    cv::imshow("result",bestLables);
    cv::waitKey();

谢谢你提供这段代码。我能够对颜色直方图进行聚类吗? - 501 - not implemented
1
我相信你可以做到,但是使用建议的代码时,你需要将每个箱子复制 N 次,其中 N 是箱子的值。 - Mercury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接