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演算法或者其改...