1.kmeans函数参数介绍
/**
* data 代表样本
* k 聚类时有多少种分类
* bestLabels 标记后的一个类别 整形
* criteria 算法终止 迭代次数
* attempts 判断样本的聚类次数
* flags: 确定簇心的计算方式。有三个值可选:KMEANS_RANDOM_CENTERS 表示随机初始化簇心。KMEANS_PP_CENTERS 表示用kmeans++算法来初始化簇心(没用过),KMEANS_USE_INITIAL_LABELS 表示第一次聚类时用用户给定的值初始化聚类,后面几次的聚类,则自动确定簇心。
* centers: 用来初始化簇心的。与前一个flags参数的选择有关。如果选择KMEANS_RANDOM_CENTERS随机初始化簇心,则这个参数可省略。
*/
bestLabels
kmeans(Mat data, int K, Mat bestLabels, TermCriteria criteria, int attempts, int flags, Mat centers)
2.java调用效果
public static void getKmeans(Mat image) {
int width = image.width();
int height = image.height();
int pointCount = width * height;
Mat points=image.reshape(image.channels(), pointCount);
points.convertTo(points, CvType.CV_32F);
Mat bestLabels=new Mat();
TermCriteria criteria=new TermCriteria(TermCriteria.COUNT + TermCriteria.EPS, 10, 0.1);
Core.kmeans(points, 4, bestLabels, criteria, 3, Core.KMEANS_RANDOM_CENTERS);
double[][] color={{0,0,255},{0,255,0},{255,0,0},{0, 255, 255}};
Mat result = Mat.zeros(image.size(), image.type());
int index=0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
index = i * width + j;
//获取聚类标记的点
int lable = (int)bestLabels.get(index,0)[0];
//为聚类相同的像素点填充颜色
result.put(i, j, color[lable]);
}
}
HighGui.imshow("zero", result);
}
效果图