• 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 );//画直方图到图像空间
    		}
    相关程序代码在:


  • 相关阅读:
    iOS9下App Store新应用提审攻略
    信息安全系统设计基础第十一周学习总结
    Linux第十一次学习笔记
    信息安全系统设计基础第十周学习总结
    Linux第八次学习笔记
    Linux第七次实验笔记
    家庭作业3.67
    Linux第六次学习笔记
    Linux第五次学习笔记
    Linux第四次学习笔记
  • 原文地址:https://www.cnblogs.com/polly333/p/4498427.html
Copyright © 2020-2023  润新知