2012-07-10 70 views

回答

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(); 
+0

谢谢为此片段。我也可以聚集颜色直方图吗? – 2012-07-10 11:35:22

+1

我相信你可以,但使用建议的代码,你需要复制每个bin二次,当N是bin值。 – Mercury 2012-07-10 12:08:09