opencv中的Kmeans使用示例

2021-07-13 05:43:06 字數 2038 閱讀 9530

kmeans是非常經典的聚類演算法,至今也還保留著較強的生命力,影象處理中經常用到kmeans演算法或者其改進演算法進行影象分割操作,在資料探勘中kmeans經常用來做資料預處理。opencv中提供了完整的kmeans演算法,其函式原型為:

double kmeans( inputarray data, int k, inputoutputarray bestlabels, termcriteria criteria, int attempts, int flags, outputarray centers = noarray() );

其中data表示用於聚類的資料,是n維的陣列型別(mat型),必須浮點型;

k表示需要聚類的類別數;

bestlabels聚類後的標籤陣列,mat型;

criteria迭代收斂準則(max_iter最大迭代次數,eps最高精度);

attemps表示嘗試的次數,防止陷入區域性最優;

flags 表示聚類中心的選取方式(kmeans_random_centers 隨機選取,kmeans_pp_centers使用arthur提供的演算法,kmeans_use_initial_labels使用初始標籤);

centers 表示聚類後的類別中心。

關於kmeans的理論可以參考:基本kmeans演算法介紹及其實現

下面給出乙個關於影象聚類的示例:

#include using namespace cv;

scalar colortab = //10個顏色

;class clusterpixels

clusterpixels(const mat& src, int clusters = 5) :clustercounts(clusters)

void setimage(const mat& src);

void setclusters(int clusters)

mat getlabels() ; //返回聚類後的標籤

mat clustergrayimagebykmeans()

}kmeans(pixels, clustercounts, labels, termcriteria(termcriteria::eps + termcriteria::max_iter, 10, 0), 5, kmeans_pp_centers);

for (int i = 0; i < rows;++i)

}return clusteredmat;

} mat clustercolorimagebykmeans()

}kmeans(pixels, clustercounts, labels, termcriteria(cv_termcrit_eps + cv_termcrit_iter, 10, 0), 5, kmeans_pp_centers);

for (int i = 0; i < rows; ++i)

}return clusteredmat;

}};

主函式:

#include "clusterimagepixels.hpp"

int main()

clusterpixels clusterpix(testimage,3);

mat colorresults = clusterpix.clustercolorimagebykmeans();

mat grayresult = clusterpix.clustergrayimagebykmeans();

if (!colorresults.empty())

if (!grayresult.empty())

if (waitkey() == 27)

return 0;

}

效果圖:

採用灰度聚類的結果:

採用rgb顏色聚類得到的效果圖:

OpenCV 中CV IMAGE ELEM 的使用

cv image elem image,elemtype,row,col 其中,image為指標陣列,elemtype為資料的訪問型別,row為影象的高度,範圍 0 height col為影象的寬度,範圍 0 width height cvgetsize image height width cvg...

k means演算法及opencv實現

k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演算法之一。k means演算法的基本思想是 以空間中k個點為中心進行聚類,對最靠近他們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。假設要把樣本集分為c個類別,演算法描述如下 1 適當選擇c個類的初...

opencv之kmeans聚類演算法

k means演算法算是個著名的聚類演算法了,不僅容易實現,並且效果也不錯,訓練過程不需人工干預,實乃模式識別等領域的居家必備良品啊,今天就拿這個演算法練練手。總結來說,這個演算法的步驟如下 kmeans是非常經典的聚類演算法,至今也還保留著較強的生命力,影象處理中經常用到kmeans演算法或者其改...