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

501*_*ted 4 opencv cluster-analysis computer-vision

我想用K-Means算法聚集很多图像.我想设置聚类,以便每个聚类代表主色或图像的色调.我在使用K-Means的彩色图像聚类论文中读到过这个

有人有想法在OpenCV中这样做吗?

也许我可以比较每个图像的直方图.但如果我有很多照片需要很长时间

Mer*_*ury 10

您可以对图像进行矢量化,使每行都是一组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();
Run Code Online (Sandbox Code Playgroud)