图像处理中kmeans聚类算法C++实现
Kmeans聚类算法是十分常用的聚类算法,给定聚类的数目N,Kmeans会自动在样本数据中寻找N个质心,从而将样本数据分为N个类别。下面简要介绍Kmeans聚类原理,并附上自己写的Kmeans聚类算法实现。
一、Kmeans原理
1. 输入:一组数据data,设定需要聚类的类别数目ClusterCnt,设定迭代次数IterCnt,以及迭代截止精度eps
输出:数据data对应的标签label,每一个数据都会对应一个label(范围0 ~ ClusterCnt-1),表示该数据属于哪一类。
2. 首先,选取初始ClusterCnt个质心位置,选取初始质心位置很重要。一般原则是这ClusterCnt个质心在数值上相互差别越远越好(距离越大越好)。偷懒的做法就是随机选取,或者是选取前面ClusterCnt个数据作为初始质心。但是前提是初始质心数值不能存在重复或者相等的情况。
3. 开始聚类,这是一个迭代过程。先针对每一个数据,计算其与每个质心之间的距离(差别),选取距离最小的对应的质心,将其归为一类(设置为同一个标签值),依次遍历所有数据。这样第一次迭代后,所有数据都有一个标签值。
4. 计算新的质心。每一次迭代完成后,计算每个类别中数据中的均值,将此均值作为新的质心,进行下一轮的迭代。这样每一轮迭代后都会重新计算依次质心。直到满足5中的条件。
5. 每次迭代后,计算每个类别中数值的方差值,然后求出所有类别方差值得均值var,将var作为一个判别准则,当本次var与上次var之间的变化小于eps时,或者迭代次数大于iterCnt时,停止迭代,聚类完成。
6. 输出数据的标签。相同标签值得被kmeans聚为一类,这样所有数据就被聚类为设定的ClusterCnt个类别。
二、图像中的应用
简单的将kmeans算法应用于图像中像素点的分类,每个像素点的RGB值作为输入数据,计算像素点与质心之间的距离,不断迭代,直到所有像素点都有一个标签值。根据标签图像将原图像中同一类别设定相同颜色,不同类别设定不同颜色。可用于图像分割等。
OpenCV中也集成有Kmeans算法的API,如下图,其选取初始质心有三种flag可以设置,随机选取、某种算法选取、用户设定。具体使用方法请参考OpenCV文档。

三、示例
原图 kmeans聚类 (10类)

四、代码
见我的码云code:https://gitee.com/rxdj/myKmeans.git
图像处理中kmeans聚类算法C++实现的更多相关文章
- Kmeans聚类算法原理与实现
Kmeans聚类算法 1 Kmeans聚类算法的基本原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对 ...
- 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析
原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)
在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...
- Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解
Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...
- OpenCV图像处理中“投影技术”的使用
本文区分"问题引出"."概念抽象"."算法实现"三个部分由表及里具体讲解OpenCV图像处理中"投影技术" ...
- K-Means 聚类算法
K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Clus ...
- k-means聚类算法python实现
K-means聚类算法 算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他 ...
- K-Means 聚类算法原理分析与代码实现
前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...
随机推荐
- 利用redis制作消息队列
redis在游戏服务器中的使用初探(一) 环境搭建redis在游戏服务器中的使用初探(二) 客户端开源库选择redis在游戏服务器中的使用初探(三) 信息存储redis在游戏服务器中的使用初探(四) ...
- 【APP测试(Android)】--安装卸载
- 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理
<C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...
- SprirngBoot微服务之间的交互—— restTemplate
一 例:需要在storage服务中请求utils服务的某个接口(两个服务都已向同一台eureka server 注册) 步骤: 1 在utils创建需被调用的接口 @RestController @R ...
- Linux 第七天
软件包管理 1.软件包分类 1)源码包(脚本安装包) 优点: l 开源,如果有足够的能力,可以修改源代码 l 可以自由选择所需的功能 l 软件是编译安装,所以更加适合自己的系统,更加稳定也效率更 ...
- 第34章:MongoDB-索引--用户管理
①用户管理 在MongoDB里面默认情况下只要是进行连接都可以不使用用户名与密码,因为要想让其起作用,则必须具备以下两个条件: ·条件一:服务器启动的时候打开授权认证: ·条件二:需要配置用户名和密码 ...
- Delphi fmx控件在手机滑动与单击的问题
Delphi fmx控件在手机滑动与单击的问题 (2016-03-08 10:52:00) 转载▼ 标签: it delphi 分类: Delphi10 众所周知,fmx制作的app,对于象TEdit ...
- 一个简单的将Markdown二级标题进行排序的脚本
我在写博客<Linux的1000个命令>的时候,相对二级标题进行一下排序,方便阅读和查找,于是就有了这个小程序. #! /usr/bin/env python3 import os imp ...
- 591. Tag Validator
Given a string representing a code snippet, you need to implement a tag validator to parse the code ...
- WPF 开机注册自启动及设置确保以管理员运行
最近用到开机自启动设置,在此记录下设置自启动的步骤,如果对各位有需要可以借阅,之前设置管理权限解释在创建解决方案是将VS以管理员方式打开,这种方法可以实现,但是个人还是偏向与本文的方式,不多说啥了,下 ...