Opencv Kmeans聚類演算法

2021-06-19 02:00:01 字數 1371 閱讀 7390

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()

else

}} cvshowimage( "original", img );

cvshowimage( "clusters", resimg );

int key = cvwaitkey(0);

cvreleaseimage(&img);//記得釋放記憶體

cvreleaseimage (&resimg);

cvreleasemat(&row);

cvreleasemat(&clusters);

}

結果如下所示:

Opencv Kmeans聚類演算法

k means 演算法接受輸入量 k 然後將n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小 1.演算法基本步驟 1 從 n個資料物件任意選擇 k 個物件作為初始聚類中心 2 根據每個聚類物件的均值 中心物件 計算每個物件與這些中心物件的...

強算KMeans聚類演算法演示器

這些天做c 實驗以及這個kmeans演算法演示器,學了一下opengl,感覺有待加強。point 結構體定義及實現 結構體重載了2個運算子 1.推斷兩個point的座標值是否相等 2.用於顯示 以友元函式的方式過載 ifndef point h define point h include incl...

6 什麼是K 均值聚類 K Means 算

傳統的聚類分析計算方法主要有如下幾種 劃分方法 層次方法 基於密度的方法 基於網格的方法 基於模型的方法等。其中k means演算法是劃分方法中的乙個經典的演算法。類 指的是具有相似性的集合,聚類是指將資料集劃分為若干類,使得各個類之內的資料最為相似,而各個類之間的資料相似度差別盡可能的大。對資料集...