k-means提取图像主色(手写)

本文介绍了如何利用k-means算法提取图像的主要颜色。通过C++实现,随机生成初始聚类中心,不断迭代更新,直到聚类中心不再变化。最终展示原图像、划分区域及提取的主要颜色。
摘要由CSDN通过智能技术生成
一、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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值