日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Opencv Kmeans聚类算法

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。