4
我想用K-Means
算法對很多圖像進行聚類。我想設置羣集,以便每個羣集代表圖像的主色或色調。我已經在紙上讀了一些關於這個的文章Colour Image Clustering using K-MeansOpenCV中使用k-means的顏色分類
有人有想法在OpenCV中做到這一點嗎?
也許我可以比較每個圖像的直方圖。但是,如果我有很多的圖片需要花費很長的時間
我想用K-Means
算法對很多圖像進行聚類。我想設置羣集,以便每個羣集代表圖像的主色或色調。我已經在紙上讀了一些關於這個的文章Colour Image Clustering using K-MeansOpenCV中使用k-means的顏色分類
有人有想法在OpenCV中做到這一點嗎?
也許我可以比較每個圖像的直方圖。但是,如果我有很多的圖片需要花費很長的時間
您可以矢量化的圖像,這樣每一行是一組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();
謝謝爲此片段。我也可以聚集顏色直方圖嗎? – 2012-07-10 11:35:22
我相信你可以,但使用建議的代碼,你需要複製每個bin二次,當N是bin值。 – Mercury 2012-07-10 12:08:09