一、关于直方图的数据结构
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的个数。当然也可以使用绘制直线的方法。
具体代码如下:
- #include "cv.h"
- #include "cxcore.h"
- #include "highgui.h"
- //绘制直方图
- IplImage* DrawHistogram(CvHistogram* hist , float scaleX = 1 , float scaleY = 1)
- {
- //获取直方图中极大值
- float histMax = 0;
- cvGetMinMaxHistValue(hist , 0 ,&histMax ,0 ,0);
- //创建图像 该图像用于显示直方图
- IplImage* imgHist = cvCreateImage(cvSize(256*scaleX , 64*scaleY) , 8 ,1);
- //图像置零
- cvZero(imgHist);
- //依次绘制直方图的bin
- for(