最大期望值算法(EM算法)---opencv3.1

最大期望值算法(EM算法)---opencv3.1

摘自opencv3.1源码例程

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/ml.hpp"
using namespace cv;
using namespace cv::ml;
int main( int /*argc*/, char** /*argv*/ )
{
	const int N = 4;
	const int N1 = (int)sqrt((double)N);
	const Scalar colors[] ={
		Scalar(0,0,255), Scalar(0,255,0),
		Scalar(0,255,255),Scalar(255,255,0)
	};
	int i, j;
	int nsamples = 100;
	Mat samples( nsamples, 2, CV_32FC1 );
	Mat labels;
	Mat img = Mat::zeros( Size( 500, 500 ), CV_8UC3 );
	Mat sample( 1, 2, CV_32FC1 );
	samples = samples.reshape(2, 0);
	for( i = 0; i < N; i++ )
	{
		// form the training samples
		Mat samples_part = samples.rowRange(i*nsamples/N, (i+1)*nsamples/N );
		Scalar mean(((i%N1)+1)*img.rows/(N1+1),((i/N1)+1)*img.rows/(N1+1));
		Scalar sigma(30,30);
		randn( samples_part, mean, sigma );
	}
	samples = samples.reshape(1, 0);
	// cluster the data
	Ptr<EM> em_model = EM::create();
	em_model->setClustersNumber(N);
	em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);
	em_model->setTermCriteria(TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 300, 0.1));
	em_model->trainEM( samples, noArray(), labels, noArray() );
	// classify every image pixel
	for( i = 0; i < img.rows; i++ )
	{
		for( j = 0; j < img.cols; j++ )
		{
			sample.at<float>(0) = (float)j;
			sample.at<float>(1) = (float)i;
			int response = cvRound(em_model->predict2( sample, noArray() )[1]);
			Scalar c = colors[response];
			circle( img, Point(j, i), 1, c*0.75, FILLED );
		}
	}
	//draw the clustered samples
	for( i = 0; i < nsamples; i++ )
	{
		Point pt(cvRound(samples.at<float>(i, 0)), cvRound(samples.at<float>(i, 1)));
		circle( img, pt, 1, colors[labels.at<int>(i)], FILLED );
	}
	imshow( "EM-clustering result", img );
	waitKey(0);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值