Opencv Kmeans聚类算法

40 篇文章 1 订阅

k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小

1. 算法基本步骤

(1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心;

(2) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;

(3) 重新计算每个(有变化)聚类均值(中心对象);

(4) 计算标准测度函数,当满足一定条件,如函数收敛时,则算法终止;如果条件不满足则回到步骤(2)。

 

2.OpenCV 函数使用

int cvKMeans2(const CvArr* samples, //输入样本的浮点矩阵,每个样本一行

                              int nclusters,//所给定的聚类数目 
        CvArr* labels, //输出整数向量:每个样本对应的类别标识

                             CvTermCriteria termcrit, //指定聚类的最大迭代次数和/或精度(两次迭代引起的聚类中心的移动距离)
        int attempts=1, CvRNG* rng=0,int flags=0, 
        CvArr* centers=0,double* compactness=0);

下面还用到了函数CvMat* cvReshape( const CvArr* arr, CvMat* header, int new_cn, int new_rows=0 );

arr 输入的数组. header 被添充的矩阵头 new_cn 新的通道数.new_cn = 0 意味着不修改通道数 new_rows 新的行数。

 如果new_rows = 0保持原行数不修改否则根据 new_cn 值修改输出数组 函数 cvReshape 初始化 CvMat 头header 以便于让头指向修改后的形状(但数据保持原样)-也就是说修改通道数,修改行数或者两者者改变。

 

[html]  view plain  copy
  1. #include "cxcore.h"  
  2. #include "highgui.h"  
  3.   
  4. void main()  
  5. {  
  6.   
  7.     IplImage* img = cvLoadImage( "test.jpg", 1);//三通道图像  
  8.     int totalimg->height*img->width;  
  9.     int cluster_num = 2;  
  10.     CvMat *row = cvCreateMat( img->height,img->width,CV_32FC3 );  
  11.     cvConvert(img,row);//转一下类型!  
  12.     CvMat *clusters = cvCreateMat( total, 1, CV_32SC1 );  
  13.     cvReshape(row,row,0,total);//修改矩阵的形状,每个数据一行,使row指向修改后的数据,不修改通道数  
  14.     cvKMeans2( row, cluster_num, clusters,cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ));  
  15.     cvReshape(clusters,clusters,0,img->width);//聚类完的结果再reshape回来方便看  
  16.   
  17.     int i=0,j=0;  
  18.     CvScalar s;  
  19.     IplImage* resImg = cvCreateImage( cvSize(img->width,img->height), 8, 1 );//生成用来显示结果的图像  
  20.     s=cvGet2D(img,i,j);  
  21.     for(i=0;i<img->height;i++)  
  22.     {  
  23.         for (j=0;j<img->width;j++)  
  24.         {  
  25.             if (clusters->data.i[i*img->width+j]==1)  
  26.             {  
  27.                 s.val[0]=255;  
  28.                 s.val[1]=255;  
  29.                 s.val[2]=255;  
  30.                 cvSet2D(resImg,i,j,s);//注意循环顺序  
  31.             }  
  32.             else  
  33.             {  
  34.                 s.val[0]=0;  
  35.                 s.val[1]=0;  
  36.                 s.val[2]=0;  
  37.                 cvSet2D(resImg,i,j,s);  
  38.             }  
  39.         }  
  40.     }  
  41.     cvShowImage( "original", img );  
  42.     cvShowImage( "clusters", resImg );  
  43.   
  44.     int key = cvWaitKey(0);  
  45.   
  46.     cvReleaseImage(&img);//记得释放内存  
  47.     cvReleaseImage (&resImg);  
  48.     cvReleaseMat(&row);  
  49.     cvReleaseMat(&clusters);  
  50. }  


 结果如下所示:

OpenCV中,Kmeans聚类算法可以用于图像分割。该算法可以将图像像素分成不同的聚类,每个聚类代表了相似的像素颜色。这样可以将图像分成不同的区域,以便进行进一步的处理。要实现Kmeans聚类图像分割,您需要配置OpenCV340版本,其他版本可能需要更改属性表。 另外,如果您想要学习更多关于OpenCV的知识,可以参考NVIDIA GPU系列技术文档中的CUDA编程入门教程。此教程包含有关接口的详细使用指南和编程案例,以及有关OpenCV和PyTorch的教程。 此外,还有一种基于无监督学习的方法来实现图像分类和聚类。这种方法使用SIFT算法提取图像特征,然后使用KMeans聚类算法进行图像分类。通过优化源代码,可以实现将对应的图像自动分类到各自的文件夹,并优化分类准确率。该方法的设计思路包括编写代码来提取图像特征、使用KMeans算法进行聚类,并将图像分类到不同的文件夹中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++结合OpenCV实现Kmeans聚类图像分割的案列](https://download.csdn.net/download/qq_41828351/11012346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [NVIDIA CUDA编程指南/opencv教程/pytorch教程(中文版)](https://download.csdn.net/download/m0_73878864/88265083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [人工智能_项目实践_图像聚类_使用SIFT算法提取图像特征,再使用KMeans聚类算法进行图像分类](https://download.csdn.net/download/admin_maxin/85024876)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值