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

来源:互联网 发布:linux 上传文件命令 编辑:程序博客网 时间:2024/06/06 17:18

在图像处理中我们会常常遇到绘制直方图,其中包括颜色直方图、梯度直方图。直方图广泛应用与许多计算机视觉应用中,通过标记帧与帧之间的边缘和颜色的统计变化,直方图用于检测场景变化。通过对每个兴趣点设置一个有相近特征的直方图作为标记,用以确定图像中的兴趣点。简单说来,直方图就是对数据进行统计,将统计值组织到之前组织好一系列的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 );//画直方图到图像空间}
相关程序代码在: