Opencv Kmeans聚类算法
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 以便于讓頭指向修改后的形狀(但數據保持原樣)-也就是說修改通道數,修改行數或者兩者者改變。
?
#include "cxcore.h" #include "highgui.h"void main() {IplImage* img = cvLoadImage( "test.jpg", 1);//三通道圖像int total= img->height*img->width;int cluster_num = 2;CvMat *row = cvCreateMat( img->height,img->width,CV_32FC3 );cvConvert(img,row);//轉一下類型!CvMat *clusters = cvCreateMat( total, 1, CV_32SC1 );cvReshape(row,row,0,total);//修改矩陣的形狀,每個數據一行,使row指向修改后的數據,不修改通道數cvKMeans2( row, cluster_num, clusters,cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ));cvReshape(clusters,clusters,0,img->width);//聚類完的結果再reshape回來方便看int i=0,j=0;CvScalar s;IplImage* resImg = cvCreateImage( cvSize(img->width,img->height), 8, 1 );//生成用來顯示結果的圖像s=cvGet2D(img,i,j);for(i=0;i<img->height;i++){for (j=0;j<img->width;j++){if (clusters->data.i[i*img->width+j]==1){s.val[0]=255;s.val[1]=255;s.val[2]=255;cvSet2D(resImg,i,j,s);//注意循環順序}else{s.val[0]=0;s.val[1]=0;s.val[2]=0;cvSet2D(resImg,i,j,s);}}}cvShowImage( "original", img );cvShowImage( "clusters", resImg );int key = cvWaitKey(0);cvReleaseImage(&img);//記得釋放內存cvReleaseImage (&resImg);cvReleaseMat(&row);cvReleaseMat(&clusters); }
?結果如下所示:
總結
以上是生活随笔為你收集整理的Opencv Kmeans聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv的K近邻算法
- 下一篇: 糗事百科的网络爬虫(v0.2)源码及解析