OpenCV KMeans图像聚类实现

KMeans 的图像聚类,用 OpenCV 来搞还是挺顺手的。你只要把图像像素拉成向量,调一下cv::kmeans()的几个参数,快就能分出区域来,像做个图像二值化、颜色分区,都还蛮实用的。

OpenCV 自带的kmeans接口挺省事,基本上就是传入数据、设置聚类数量、选个初始化方式(建议用cv::KMEANS_PP_CENTERS),剩下它都帮你算好了。聚完之后,根据labels重构一下图像就 OK 了。

像下面这段代码就比较典型,流程清晰明了,适合直接拿来试:

#include 
int main() {
  cv::Mat image = cv::imread("input.jpg");
  cv::Mat samples;
  image.convertTo(samples, CV_32F, 1.0 / 255);

int nclusters = 2; cv::TermCriteria termCrit(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 10, 1.0); cv::Mat labels, centers;

cv::kmeans(samples.reshape(1, image.rows * image.cols), nclusters, labels, termCrit, 3, cv::KMEANS_PP_CENTERS, centers);

cv::Mat clustered(image.size(), image.type()); for (int i = 0; i < image>(i / image.cols, i % image.cols) = centers.at(labels.at(i)); }

cv::imshow("Result", clustered); cv::waitKey(); return 0; }

有几点要提醒一下你:初始质心影响挺大,聚类结果每次不一样,想稳定些就多跑几次;还有就是cv::kmeans对数据格式比较挑,记得转换成CV_32F

如果你刚好在搞图像,想快速搞个颜色聚类或者分区,这种方式真的是又快又干净。

rar 文件大小:157.95KB