/*--------------------CSS部分-------------------*/ /*--------------------JS部分-------------------*/

Oopencv学习心得(二)——绘制直方图

在图像处理中我们会常常遇到绘制直方图,其中包括颜色直方图、梯度直方图。直方图广泛应用与许多计算机视觉应用中,通过标记帧与帧之间的边缘和颜色的统计变化,直方图用于检测场景变化。通过对每个兴趣点设置一个有相近特征的直方图作为标记,用以确定图像中的兴趣点。简单说来,直方图就是对数据进行统计,将统计值组织到之前组织好一系列的bin中。bin的分配自己设定,其中bin中的数值为从数据中计算出的特征统计量,直方图实际上是一个方便表示图像特征的手段。

在opencv中讲解里直方图的应用实例:

在程序开始首先定义变量,以及结构体。

如:

/*****************************直方图绘制初始化**********************/
CvHistogram *hist=0;//创建多维直方图
int dims=48;//在直方图中dims大小,越大精度越高。
float arrnge[]={0,180};//空间坐标系中像素范围
float *parrnge=arrnge;//用来初始化 hist。
IplImage *image=0,*hsv=0,*hue/*色调*/=0,*mask/*掩码*/=0,*backproject/*幕后影像*/=0,*histimg=0;//直方图;
之后是进入视频图像采集阶段,第一次采集图像,则为相应的图像分配空间。

if (!image)
		{
			image=cvCreateImage(cvGetSize(pFrame),8,3);
			image->origin=pFrame->origin;
			hsv=cvCreateImage(cvGetSize(pFrame),8,3);
			hue=cvCreateImage(cvGetSize(pFrame),8,1);//色彩创建空间为单通道图像
			mask=cvCreateImage(cvGetSize(pFrame),8,1);//分配掩码图像空间
			backproject=cvCreateImage(cvGetSize(pFrame),8,1);//分配反向投影图空间
			histimg=cvCreateImage(cvSize(320,240),8,3);
			cvZero(histimg);//将背景设为灰度空间
			hist=cvCreateHist(1,&dims,CV_HIST_ARRAY,&parrnge,1);//计算直方图,分配建立直方图空间
		}

采集到图像分配空间之后,便是在计算直方图,以及前期处理得到相关感兴趣区域的直方图

cvCopy(pFrame,image,0);
		cvCvtColor(image,hsv,CV_BGR2HSV);//转化颜色空间
		cvInRangeS(hsv,cvScalar(0,30,30),cvScalar(180,256,180),mask);//制作掩码空间,只处理H:0~180,S:30~256,v:30~180.
		cvSplit(hsv,hue,0,0,0);//取得H分量。
		cvSetImageROI(hue,rect);//得到选择区域,设置原选择框
		cvSetImageROI(mask,rect);//得到选择区域,设置mask选择框
		cvCalcHist(&hue,hist,0,mask);//得到选择框内且满足掩码班内的直方图
		cvGetMinMaxHistValue(hist,0,&max_val,0,0);//只找最大值
		cvConvertScale(hist->bins,hist->bins,max_val?255./max_val:0.,0);//缩放bin到区间[0,255],如果大于0,则压缩。
		cvResetImageROI(hue);
		cvResetImageROI(mask);
		float bin_w = histimg->width / dims;  // hdims: 条的个数,则 bin_w 为条的宽度

最后便是画直方图。
// 画直方图
		for( int i = 0; i < dims; i++ )
		{
			int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );
			//float bin_val=cvQueryHistValue_1D(hist,0);
			CvScalar color=hsv2rgb(i*180.f/dims);
			cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),
				cvPoint((i+1)*bin_w,histimg->height - val),
				color, -1, 8, 0 );//画直方图到图像空间
		}
相关程序代码在:


posted @ 2013-05-15 15:18  bldong  阅读(1072)  评论(0编辑  收藏  举报