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
。
如果你刚好在搞图像,想快速搞个颜色聚类或者分区,这种方式真的是又快又干净。
评论区