K-means 用于聚类,原理很简单,就是将样本按照一定的“距离”,聚类成K个类,聚类过程是一个迭代的过程,即每次都重新计算类中样本的均值作为新的聚类中心。原理很简单,有很多博客写得比较详细,我这里就略过,在此只贴代码和结果。

#include"K-means.h"
/***************************************************************************************************
*function: cluster the rgb image using k-means method
*description:the distance is the sum of absolute difference of the Rgb color componentthat is, dis = abs(r0 -r1) + abs(g0 -g1) + abs(b0 -b1), and the initial cluster centeris random;
*param:
*src                                    I               输入彩色图像
*dst                                    O               输出聚类结果
*width                                  I               图像的宽
*height                                 I               图像的高
*clusterNum                             I               聚类个数
*runTime                                I               迭代次数
*centerColor                            I               聚类颜色结构体
****************************************************************************************************/
void TongKmeans(u08 *src, u08 *dst, s32 width, s32 height, s32 clusterNum, s32 runTime, clusterCenter *centerColor)
{s32 crossIdx = 0;clusterCenter center[100] = {0};s32 idx     = 0;RNG rng;// inition of the cluster centerfor (s32 k = 0; k < clusterNum; k++){center[k].px = rng.uniform(0,width);center[k].py = rng.uniform(0,height);s32 idx = 3 * (center[k].py * width +center[k].px); center[k].color[0] = src[idx];center[k].color[1] = src[idx + 1];center[k].color[2] = src[idx + 2];}// iteration of clusteringfor ( s32  n = 0; n < runTime; n++){
       // the cluster num should smaller than 300s32 clusterSum[300][3] = {0};s32 numCount[300]      = {0};for (s32 i = 0; i < height; i++){   crossIdx = 3 * i * width;for (s32 j = 0; j < width; j ++){   s32 minDis   =   10000000;s32 clusterK = 0;for ( s32 k = 0; k < clusterNum; k++){s32 dis =  abs(src[crossIdx]     - center[k].color[0])+  abs(src[crossIdx + 1] - center[k].color[1])+  abs(src[crossIdx + 2] - center[k].color[2]);if (dis < minDis){clusterK = k;minDis   = dis;}}// color the pix with certain colordst[crossIdx]     = centerColor[clusterK].color[0];dst[crossIdx + 1] = centerColor[clusterK].color[1];dst[crossIdx + 2] = centerColor[clusterK].color[2];clusterSum[clusterK][0] += src[crossIdx];clusterSum[clusterK][1] += src[crossIdx + 1];clusterSum[clusterK][2] += src[crossIdx + 2];numCount[clusterK]++;crossIdx += 3;}     }for ( s32 k = 0; k < clusterNum; k++){   if (numCount[k] == 0){   continue;}// renew the cluster centerf32 coe = 1.0f / numCount[k];center[k].color[0] = (u08)(coe * clusterSum[k][0]);center[k].color[1] = (u08)(coe * clusterSum[k][1]);center[k].color[2] = (u08)(coe * clusterSum[k][2]);}}
}

原图是这样的:

当迭代次数为3, 聚类个数为2时,结果如下:

当迭代次数为10, 分类个数为2时,如下:

可以看出,K-means 在迭代3次或之前就已经收敛了。

那么,改变一下聚类个数,将聚类个数分别设置为10和50,迭代次数依然是3,结果如下:

聚类个数越多,图片就被细分的越厉害,当然,所使用的的聚类标准是比较简单的RGB距离,效果并不是最佳,更多的距离标准可以采用YUV、LAB等其他颜色空间。

基于K-means的彩色图像聚类之代码实现相关推荐

  1. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

  2. 基于K-Means的文本聚类

    何为聚类 "聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性."                 ...

  3. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  4. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  5. 基于K均值聚类的葡萄酒品种判别

    特别注意:主要思路.程序和分析过程来源于:https://www.kaggle.com/xvivancos/tutorial-clustering-wines-with-k-means.本文在此基础上 ...

  6. Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索、模型初探

    Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索.模型初探 1 前言 分类和回归是强大易学的机器学习技术.需要注意的是:为了对新的样本预测未知的值, 必须从大量已知目标值的样 ...

  7. python图像分割_基于K均值聚类算法的Python图像分割

    1个K均值算法 实际上,K-means算法是一种非常简单的算法,与算法思想或特定实现无关. 通过以一定方式测量样本之间的相似度,并迭代更新聚类中心,它属于无监督分类. 当聚类中心不再移动或移动差异小于 ...

  8. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  9. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  10. python实现k core算法_python实现密度聚类(模板代码+sklearn代码)

    本人在此就不搬运书上关于密度聚类的理论知识了,仅仅实现密度聚类的模板代码和调用skelarn的密度聚类算法. 有人好奇,为什么有sklearn库了还要自己去实现呢?其实,库的代码是比自己写的高效且容易 ...

最新文章

  1. SqlServer 获取汉字的拼音首字母
  2. Android 应用程序之间内容分享详解(二)
  3. 揭秘ASP.NET 2.0的Eval方法(转)
  4. spark sql定义RDD、DataFrame与DataSet
  5. html缩进标签quote,HTML blockquote 标签
  6. c语言控制数码管显示时间,数码管显示时间整点报时C语言实例
  7. MySQL数据库是什么?有什么优点?
  8. 基于JAVA+SpringMVC+MYSQL的火车票订票系统
  9. XStream将XML转换为JAVA对象快速指南
  10. pytorch实现attention_Self-Attention手动推导及实现
  11. q函数表格怎么看_会计表格函数玩不会?送你会计表格函数公式大全,财务人都在用...
  12. 【vscode】vscode + vue项目实战记录
  13. 管理感悟:经历不是经验,套路才是
  14. 操作系统-3.假设某多道程序设计系统中有供用户使用的内存100KB,打印机1台。系统采用可变分区方式管理内存:对打印机采用静态分配,并假设输入输出操作的时间忽略不计;采用最短剩余时间优先的进程调度算法
  15. 计算机界面没磁盘驱动器,驱动器中没有磁盘的原因和解决办法
  16. Frechlet Inception Distance(FID)快速入门、使用、代码
  17. 通过lan从服务器启动系统,OPNsense启用LAN网桥
  18. MacBook安装rar解压工具
  19. 链家深圳租房信息爬取练习 附加源码
  20. 在 Windows 系统下常用的 bat 脚本分享

热门文章

  1. 百度收录提交工具-免费主动提交百度快速收录软件
  2. 企业的主数据建设方法论与实践 | 推荐收藏
  3. c语言用函数求组合数编程,C语言函数 -C语言求组合数
  4. 【disordered_zip】BUGKU
  5. 酒店管理系统数据库SQl设计思路
  6. 网页的短信与邮箱注册
  7. 逃离北上广:你以为回到小城市就非常幸福了吗?
  8. 小米等部分手机机型不弹出对话框问题
  9. Android Intent跳转第三方地图应用,传入地址
  10. RMS调度器实现原理