5

I want to cluster a lot of images with the K-Means Algorithm. I want to set up the clusters, so that each cluster represent the dominant color or the hue of the image. I've read something about this in the paper Colour Image Clustering using K-Means

Does someone have an idea to do this in OpenCV?

Maybe I can compare the histograms of each image. But if I have a lot of pictures it takes a very long time

Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
501 - not implemented
  • 2,638
  • 4
  • 39
  • 74

1 Answers1

12

You can vectorize your image so each row is a set of RGB, and than use cv::kmeans to cluster, something like:

    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();
Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
Mercury
  • 1,886
  • 5
  • 25
  • 44