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); } 复制代码
效果图
网络异常,图片无法展示
|