一、k-means算法
k-means算法是一种简单有效的聚类算法。根据制定的类别数k,将所给数据集,以一定的距离(用户自定义距离,如本文采用是RGB图像每点的欧式距离)相近程度进行类别划分,可以理解为一种求质心的聚类方式。
算法基本流程如下:
1、随机产生k个聚类中心(也可用户指定)。计算每个样本到各个聚类中心的距离。将样本归类到相应最接近的类别中。
2、计算每个样本的算数平均数,求出每一类中离平均数最近的点记为该类新的中心。
3、判断所有类别中中心点有没有发生变化,如果中心点改变,则再次以该中心点对所有数据聚类,直到所有的中心点都不改变为止,算法结束。
二、c++实现
#define CLUST_NUM 5
struct Node
{
CvPoint point;
CvScalar color;
};
struct Clust
{
Node center;
vector<Node> buff;
};
void DCD(IplImage* src)
{
IplImage* src = NULL;
src = cvLoadImage("test.jpg");
if(!src)
{
return;
}
int width = src->width;
int height = src->height;
// 产生随机种子
CvPoint point[CLUST_NUM];
CvRNG rng(cvGetTickCount());
for (int i = 0; i< CLUST_NUM; i++)
{
point[i].x = cvRandInt(&rng) % width;
point[i].y = cvRandInt(&rng) % height;
}
//分类簇
Clust v[CLUST_NUM];
//初始化
for (int i = 0; i < CLUST_NUM; i++)
{
v[i].center.point = point[i];
v[i].center.color = cvGet2D(src, v[i].center.point.y, v[i].center.point.x);
cout <&l