opencv:绘制直方图

一、关于直方图的数据结构
typedef struct CvHistogram
{
int type;
CvArr* bins;
float thresh[CV_MAX_DIM][2]; /* for uniform histograms */
float** thresh2; /* for non-uniform histograms */
CvMatND mat; /* embedded matrix header for array histograms */
}
CvHistogram;


二、创建直方图结构的函数
CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 );
1、dims:表示直方图的维数
2、sizes:为指向整形的指针,在使用的时候其定义为一个一维的数组。且该数组的元素个数与dims相同,每个元素表示的是对应维度上的bin的个数
譬如:假设它该直方图为一个二维的直方图,则size数组便有两个元素,第一个元素的值表示第一个维度上的bin的个数,依次类推。
3、type:他可以取值为 CvMatND或者 CvSparseMat。前者表述使用密集数组进行存储,后者表示使用稀疏数组进行存储,主要为了节省存储空间。
4、表示每个维度的上的取值范围,他用双指针的类型可以解释如下。
float range1[]={ 0,255}//他表示第一个维度上的取值范围为:0-255
float range2[]={ 0,255}//他表示第二个维度上的取值范围为:0-255
float *ranges[]={ range1,range2}//ranges变量存储的实际上是range1的地址,range1存储的实际上又是浮点数组range1[]的首地址。于是ranges便使用双指针的变量表示各个维度的取值范围。
5、uniform:设为1,表示bin是均匀分布的,0表示非均匀分布


三、从直方图里面取出各个bin的值:
 cvQueryHistValue_3D( hist, idx0, idx1, idx2 )
如果为一维直方图则为1D


四、从直方图中取出最大的值

void cvGetMinMaxHistValue( const CvHistogram* hist,
float* min_value, float* max_value,
int* min_idx=NULL, int* max_idx=NULL );


五、绘制直方图
绘制直方图,便是将各个bin的值直观的呈现在一副图像里面(一般为二值图像),为了使得得到直方图看起来是连续的,可以使用填充多边形的方法,当然也可以使用绘制矩形,使用矩形的高度来表达对应bin的个数。当然也可以使用绘制直线的方法。


具体代码如下:

[cpp]  view plain copy
  1. #include "cv.h"  
  2. #include "cxcore.h"  
  3. #include "highgui.h"  
  4.   
  5.   
  6. //绘制直方图  
  7. IplImage* DrawHistogram(CvHistogram* hist , float scaleX = 1 , float scaleY = 1)  
  8. {  
  9.   
  10.         //获取直方图中极大值  
  11.         float histMax = 0;  
  12.         cvGetMinMaxHistValue(hist , 0 ,&histMax ,0 ,0);  
  13.   
  14.         //创建图像 该图像用于显示直方图  
  15.         IplImage* imgHist = cvCreateImage(cvSize(256*scaleX , 64*scaleY) , 8 ,1);  
  16.   
  17.         //图像置零  
  18.         cvZero(imgHist);  
  19.   
  20.         //依次绘制直方图的bin  
  21.         for(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值