kmeans算法的原理参考:http://www.cnblogs.com/mikewolf2002/p/3368118.html

下面学习一下opencv中kmeans函数的使用。

首先我们通过OpenCV中的随机数产生器RNG,生成一些均匀分布的随机点,这些点的位置对应一副图像中的像素位置,然后使用kmeans算法对这些随机点进行分类,并计算出分类簇的中心点。

随机产生的簇的数量是2到5之间的值,采样点的数量范围是1-1000,一维矩阵centers存放kmeans算法结束后,各个簇的中心位置。

//簇的数量
int k, clusterCount = rng.uniform(2, MAX_CLUSTERS+1);
//采样点的数量
int i, sampleCount = rng.uniform(1, 1001);
Mat points(sampleCount, 1, CV_32FC2), labels;

clusterCount = MIN(clusterCount, sampleCount);
//中心点矩阵
Mat centers(clusterCount, 1, points.type());

printf("clusterCount=%d, sampleCount=%d\n", clusterCount, sampleCount);
//产生多高斯部分的随机采样点
for( k = 0; k < clusterCount; k++ )
    {
    Point center;
    center.x = rng.uniform(0, img.cols);
    center.y = rng.uniform(0, img.rows);
    Mat pointChunk = points.rowRange(k*sampleCount/clusterCount,
        k == clusterCount - 1 ? sampleCount :
        (k+1)*sampleCount/clusterCount);
    printf("rows start=%d rows end=%d\n", k*sampleCount/clusterCount, k == clusterCount - 1 ? sampleCount :
        (k+1)*sampleCount/clusterCount);

注意rng.fill函数,会以center点为中心,产生高斯分布的随机点(位置点),并把位置点保存在矩阵pointChunk中。
    //第三个参数中心,第四个参数偏移
    rng.fill(pointChunk, CV_RAND_NORMAL, Scalar(center.x, center.y), Scalar(img.cols*0.05, img.rows*0.05));
    }

//打乱points中值,第二个参数表示随机交换元素的数量的缩放因子,总的交换次数dst.rows*dst.cols*iterFactor,第三个参数是个随机发生器,决定选那两个元素交换。

randShuffle(points, 1, &rng);

kmeans函数中points为输入矩阵,其中存储的是采样点,labels也是一个一维矩阵,它的size和points一样,里面存储的是每个采样点执行kmeans算法后属于属于那一个簇,值为0到clusterCount-1,centers中存放的是kmeans算法结束后每个簇的中心位置。

flags(第7个参数)为KMEANS_PP_CENTERS 表示使用 kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007]算法决定簇的初始中心,否则就是采用随机值的方法决定初始中心。

如果flags是CV_KMEANS_USE_INITIAL_LABELS,则需要初始化labels,就是初始指定点的分类。

最后我们在图像中画出每个位置点对应的像素,中心位置用蓝色的圆圈表示。

//labels中放的是执行kmeans算法后sample中簇的索引
kmeans(points, clusterCount, labels,
    TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),
    3, KMEANS_PP_CENTERS, centers);

img = Scalar::all(0);

for( i = 0; i < sampleCount; i++ )
    {
    int clusterIdx = labels.at<int>(i);
    Point ipt = points.at<Point2f>(i);
    circle( img, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA );
    }

cout<<"Center: \n"<<centers<<endl;

//用蓝色画出每个聚类的中心
//有bug,不让我直接用centers.at<Point2f>(i);,会异常
for( i = 0; i < clusterCount; i++ )
    {
    Point ipt = Point(centers.at<float>(i*2), centers.at<float>(i*2+1));
    circle( img, ipt, 5, Scalar(255,0,0),CV_FILLED, CV_AA );

}
imshow("clusters", img);

下面图像是5个簇的kmeans聚类结果。

源代码参考工程:FirstOpenCV15

OpenCV学习(22) opencv中使用kmeans算法相关推荐

  1. OpenCV学习-P34-P38 Opencv边缘检测

    OpenCV学习-P34-P37 Opencv边缘检测 Sobel检测算子 Laplacian检测算子 Canny边缘检测算法 边缘检测总结 边缘检测分为两类:基于搜索和基于零穿越 基于搜索:寻找图像 ...

  2. OpenCV学习-P29-P32 Opencv直方图均衡化、掩膜

    OpenCV学习-P29-P32 Opencv直方图均衡化及掩膜 1 直方图 2 直方图均衡化 3 直方图自适应均衡化 1 直方图 直方图原理:统计图像各个灰度区间的像素数 cv2.calcHist( ...

  3. Opencv学习笔记 - OpenCV 4机器学习算法简介

    在机器学习中,一些比较流行方法的包括:支持向量机(SVM).人工神经网络(ANN).聚类.k-最近邻.决策树和深度学习.OpenCV支持并实现几乎所有这些方法,并有详细的文档说明(包含在Main mo ...

  4. Opencv学习笔记 - 使用opencvsharp和Boosting算法处理分类问题

    决策树非常有用,但单独使用时它并不是表现最佳的分类器.改进的方法随机森林和Boosting算法.随机森林与Boosting算法都是在内部循环中使用决策树的,因此继承了决策树的许多优良属性,它们通常是机 ...

  5. Opencv学习笔记——opencv配置安装与IDE环境安装

    文章目录 前言 一.opencv配置安装 二.IDE的安装 总结 前言 既然开始对AI视觉这个方面有兴趣,也初步接触了一些AI视觉在嵌入式方面的应用,那自然少不了对Opencv的学习.到现在开始学习o ...

  6. OpenCV学习——绘制OpenCV徽标

    今天看到一个关于OpenCV的练习题,用绘图功能创建OpenCV的徽标. 关于OpenCV的绘图功能,在下面这篇笔记里写过了,这里不再多写,直接上代码!OpenCV学习--绘图功能_笨小古的博客-CS ...

  7. 【机器学习】聚类算法中的 K-means 算法及其原理

    系列文章目录 第十四章 Python 机器学习入门之聚类算法 目录 系列文章目录 前言 一.什么是聚类 二.K-means 聚类算法的直观理解 三.K-means 聚类算法公式 四.K-means 聚 ...

  8. Opencv学习_3 (Opencv读取视频 视频进度控制 写视频)

    opencv读取视频: 使用opencv读取视频主要用到这几个函数:cvCreateFileCapture  cvQueryFrame (或cvGrabFrame cvRetrieveFrame)   ...

  9. opencv学习(part1)--OpenCv框架介绍

    学习笔记,仅供参考,有错必究 文章目录 opencv学习 OpenCv框架介绍 二值图像分析 二值图像定义与说明 图像二值化介绍 常见的二分类分割方法 opencv学习 OpenCv框架介绍 Open ...

最新文章

  1. 【spring】动态代理
  2. 剑指offer:面试题28. 对称的二叉树
  3. SharePoint 2016 必备组件离线安装介绍
  4. 【CyberSecurityLearning 附】虚拟机部署Linux操作系统(centos6.9、Ubuntu16.04)
  5. PC如何接管手机的双因子身份验证 靠的是英特尔的CPU
  6. [css] 重置(初始化)css的作用是什么?
  7. 鹰眼系统原理_山东首家露天焚烧鹰眼监控系统在我镇投入使用
  8. mysql8导入不同schme_新特性解读 | MySQL 8.0.22 任意格式数据导入
  9. 相平衡计算matlab代码,MATLAB,气液相平衡程序,求帮忙改一下。 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  10. uboot移植——uboot的硬件驱动部分
  11. 【Monster High】MMD镜头+动作打包下载.zip
  12. Plain Road
  13. 若依设置匿名访问路径
  14. PINN解偏微分方程--程函方程
  15. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:ESP8266 + MQ3酒精传感器 + webserver(局域网内曲线变化图)
  16. Unity3d 利用 AvproVideo 播放带透明通道mov视频在部分电脑无法播放的解决方案
  17. kafka消费组和分区关系详解
  18. C++ 优缺点之我见
  19. 问答学习系统 - 针式PKM V8.20新增功能
  20. 成人高考 计算机英语作文,「2017成人高考高起专英语作文」求成人考试英语作文4篇!...

热门文章

  1. Python自动化运维之15、网络编程之socket、socketserver、select、twisted
  2. Asp.net禁用页面缓存的方法总结
  3. 6月全球Web服务器市场份额:Apache升至64.33%
  4. 【Marva Collins' Way】第三章
  5. 关于家庭无线局域网的连接
  6. 从/etc/inetd.conf学习服务(4)
  7. 经常和电脑、信息化设备打交道,食品保健养生非常重要!
  8. 21种代码的“坏味道”
  9. MySQL-回表查询与索引覆盖
  10. AIOps中异常检测简的单应用