Java调用opencv聚类算法kmeans

1,037 阅读1分钟

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);
	}

效果图

捕获.PNG