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;
}

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



相关文章推荐

第27节--层次聚类(下)

层次聚类代码:from numpy import *""" Code for hierarchical clustering, modified from Programming Collectiv...

[algorithm,c++] 基于c++的二维k-means代码实现

利用上课期间打的草稿,这里仅仅实现的是数据输入, 后续的 k-means #include #include #include #include using namespace std ...

使用new和vector实现一维和二维数组

new vector 一维和二维数组

最接近点对,一维和二维情况

//最接近点对 一维情况 package wkx; import java.io.IOException; import java.util.ArrayList; import java.util...

python实现Kmeans文本聚类,通过PCA降维和Matplotlib显示聚类3d三维图像

在此基础上,主要实现以下改进及结果 1.替换使用sklearn.feature_extraction.text.TfidfVectorizer,将corpus文本转换为tfidf值的svm向量。 2....

opencv中的Kmeans使用示例

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

java一维和二维数组实现乘法表

  • 2013年03月10日 20:17
  • 3KB
  • 下载

poj 2813 画家问题(枚举解决一维和二维)

给定一种状态集合,通常一个位置仅有一种状态,对其某一位置进行操作可改变其本身及其相邻位置的状态,通过一系列的操作达到目标状态集,并求出其所有可行操作中最少操作数的过程,可以将其归为画家问题。解决画家问...

一维和二维的快速dct算法

  • 2009年04月25日 11:29
  • 912KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV: Kmeans的使用一维和二维点集
举报原因:
原因补充:

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