OpenCV: Kmeans的使用一维和二维点集

原创 2017年08月19日 23:28:13

OpenCVKmeans算法默认使用了Kmeans++选取种子点

参考:OpenCv中Kmeans算法实现和使用

//效果:根据半径聚类,并不一定能得到好的结果。
float CBlotGlint::ClusterByR(  )
{
	//根据半径大小聚类,找出合适的类别个数和每一类的个数
	std::vector<float>   radiuses(this->blobs.size() );
	std::vector<std::pair<float,int> >   radiusesIdx(this->blobs.size() );
	for ( int i=0; i< this->blobs.size(); ++i ){
		radiuses[i] =this->blobs[i].diaGlint;
		radiusesIdx[i].first  = radiuses[i];
		radiusesIdx[i].second = i;
	}

	{
		using namespace cv;

		this->blobs[0].diaGlint;

		const int MAX_CLUSTERS = 5;
		Scalar colorTab[] =
		{
			Scalar(0, 0, 255),
			Scalar(0,255,0),
			Scalar(255,100,100),
			Scalar(255,0,255),
			Scalar(0,255,255)
		};

		Mat img( 500, 500, CV_8UC3 );
		RNG rng( 12345 );
		std::vector<std::vector<float> >  outC;
		std::vector<std::vector<std::pair<float,int> > >  outCidx;

		{
			outC.clear();
			int k;
			int clusterCount = rng.uniform(2, MAX_CLUSTERS+1);
			int i;
			int sampleCount =radiuses.size();// rng.uniform(1, 1001);
			Mat points(sampleCount, 1, CV_32FC1), labels;
			for ( int i=0; i< sampleCount; ++i ){
				points.at<float>(i) = radiuses[i];
			}

			clusterCount = MIN(clusterCount, sampleCount);
			clusterCount = std::max(clusterCount,3);
			clusterCount = 3;

			Mat centers;
			kmeans(points, clusterCount, labels,
				TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),
				3, KMEANS_PP_CENTERS, centers);

			outC.resize( clusterCount );
			outCidx.resize( clusterCount );

			img = Scalar::all(0);
			for( i = 0; i < sampleCount; i++ )
			{
				int clusterIdx = labels.at<int>( i );
				outC[clusterIdx].push_back( points.at<float>( i  ) );
				outCidx[clusterIdx].push_back( 
					std::make_pair ( points.at<float>( i  ) ,radiusesIdx[i].second ) );

				Point ipt = this->blobs[i].centerOfGlint;
				circle( img, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA );
			}

			cv::imshow("clusters", img);

			char key = (char)cv::waitKey(1);
		}

		return 0;

	}

	return 1.0;
}

即使如此,每次聚类的效果仍然不一定相同,显示一定的随机性。



Kmeans算法详解及MATLAB实现

首先要来了解的一个概念就是聚类,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它“这个东西被分为某某类”这样一些例子...
  • dulingtingzi
  • dulingtingzi
  • 2016-04-25 16:08:53
  • 29804

K-means算法实战-一维数据的聚类

用户有个开关,可以记录用户每次开关灯的状态,并且能够记录开关灯前后的光敏值。一般用户每天开灯时间集中在晚上,关灯时间也基本集中在晚上,但是有一些异常值,比如起夜上厕所开灯、上完厕所再关灯。获取用户开关...
  • qq_16583687
  • qq_16583687
  • 2017-08-01 15:24:19
  • 2270

深入理解K-Means聚类算法

概述什么是聚类分析聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。不同的簇类型聚类旨在发现有用的对象簇,在现实中我们用到很多的簇的类型,使用...
  • taoyanqi8932
  • taoyanqi8932
  • 2016-12-18 20:50:09
  • 34817

用matlab实现kmeans算法,非常完整例子一维和二维

  • 2015年11月30日 15:44
  • 48KB
  • 下载

opencv中的Kmeans使用示例

kmeans是非常经典的聚类算法,至今也还保留着较强的生命力,图像处理中经常用到kmeans算法或者其改进算法进行图像分割操作,在数据挖掘中kmeans经常用来做数据预处理。opencv中提供了完整的...
  • owen7500
  • owen7500
  • 2016-06-07 17:20:09
  • 6518

【通俗易懂】层次聚类算法的原理及实现

层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚...
  • guomutian911
  • guomutian911
  • 2017-05-27 17:21:44
  • 655

[opencv]K-means聚类算法分割图像

1.K-means算法 K-means是一种经典的无监督聚类算法。 算法原理: (1)从N个数据对象中取K个点作为聚类中心。 (2)计算N个数据对象到各个聚类中心的距离,将N个数据对象划分到距离最...
  • kingcooper
  • kingcooper
  • 2016-03-04 17:43:41
  • 4766

学习OpenCV——一次颜色聚类

1.首先区分三个通道,画出每个通道的直方图; 2.平滑直方图,像素值等于前后共七种颜色数量的平均值; 3.取波峰,波谷。(条件:颜色数亮s(i-2)s(i+1)>s(i+2)或s(i-2)>s(i...
  • sangni007
  • sangni007
  • 2012-03-23 12:59:52
  • 3919

Opencv Kmeans聚类进行图像颜色聚类分割(绝对有用)

  • 2011年04月28日 10:01
  • 1.76MB
  • 下载

Opencv cvKmeans2进行灰度图像和彩色图像聚类

  • 2013年08月27日 19:00
  • 7KB
  • 下载
收藏助手
不良信息举报
您举报文章:OpenCV: Kmeans的使用一维和二维点集
举报原因:
原因补充:

(最多只允许输入30个字)