k-means算法及opencv实现

K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

 

假设要把样本集分为c个类别,算法描述如下:

(1)适当选择c个类的初始中心;

(2) 在第k次迭代中,对任意一样本,求其到c个中心的距离,将其归类到距离最短的中心所在的类;

(3) 利用均值等方法更新该类的中心值;

(4) 重复步骤(2)(3),直到聚类中心保持不变。

该算法的最大优势在于简洁和快速,算法的关键在于初始中心的选择和距离公式。[百度百科]

 

K-means在opencv中的实现:

 

[cpp]  view plain copy
  1. void kmeans_mat(const Mat& src_img,Mat& dst_img)  
  2. {  
  3.     int width_src=src_img.cols;  
  4.     int height_src=src_img.rows;  
  5.   
  6.     Mat samples=Mat::zeros(width_src*height_src,1,CV_32FC3);//创建样本矩阵,CV_32FC3代表32位浮点3通道(彩色图像)  
  7.     Mat clusters;//类别标记矩阵  
  8.     int k=0;  
  9.     for (int i=0;i<height_src;i++)  
  10.     {  
  11.         for (int j=0;j<width_src;j++,k++)  
  12.         {  
  13.             //将像素点三通道的值按顺序排入样本矩阵  
  14.             samples.at<Vec3f>(k,0)[0]=(float)src_img.at<Vec3b>(i,j)[0];  
  15.             samples.at<Vec3f>(k,0)[1]=(float)src_img.at<Vec3b>(i,j)[1];  
  16.             samples.at<Vec3f>(k,0)[2]=(float)src_img.at<Vec3b>(i,j)[2];  
  17.         }  
  18.     }  
  19.     int nCuster=2;//聚类类别数,自己修改。  
  20.     //聚类,KMEANS PP CENTERS Use kmeans++ center initialization by Arthur and Vassilvitskii  
  21.     kmeans(samples,nCuster,clusters,TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,10,1.0),2,KMEANS_PP_CENTERS);  
  22.   
  23.     //显示聚类结果  
  24.     if (dst_img.empty())  
  25.     {  
  26.         dst_img=Mat::zeros(height_src,width_src,CV_8UC1);  
  27.     }  
  28.   
  29.     k=0;  
  30.     int val=0;  
  31.     float step=255/(nCuster-1);  
  32.     for (int i=0;i<height_src;i++)  
  33.     {  
  34.         for (int j=0;j<width_src;j++,k++)  
  35.         {  
  36.             val=255-clusters.at<int>(k,0)*step;//int  
  37.             dst_img.at<uchar>(i,j)=val;  
  38.         }  
  39.     }  
  40. }  


 k-means聚类算法,初始中心的选择是关键,有时间还需要研究下KMEANS_PP_CENTERS Use kmeans++ center initialization by Arthur and Vassilvitskii方法。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值