084029693.jpg

1、bin的含义

直方图中bin的含义:计算颜色直方图需要将颜色空间划分为若干小的颜色区间,即直方图的bin,通过计算颜色在每个小区间内德像素得到颜色直方图,bin越多,直方图对颜色的分辨率越强,但增加了计算机的负担。即(上图所分10个竖条区域,每个竖条区域称为一个bin)

(2)简单来说直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中。bin中的数值就是从数据中计算出的特征的统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。无论如何,直方图获得的是数据分布的统计图。直方图实际上是一个方便表示图像特征的手段。

2、cvCreateHist()创建一个直方图函数理解

dim:表示几维空间,即一般彩色图像是3通道的,dim=3,故灰度图像为1通道,则dim=1。dim=2,说明只计算彩色通道中的其中两个通道。

sizes:表示的是bin的个数,上图有10个bin,则sizes=10。

type:CV_HIST_ARRAY,CV_HIST_SPACRSE虚疏矩阵:如果在矩阵中,多数的元素为0,则称矩阵为虚疏矩阵。

ranges:上图最右边的数字100,就是说ranges范围为0~100。如果是灰度图像一般设为0~255,sizes=256,则每个 bin就表示一个灰度级的统计。在函数中ranges是bin范围的数组,即bin范围为一个数组,ranges为一个数组的数组。

uniform:决定ranges,uniform=0是均匀直方图,非0时不均匀直方图。

3、直方图归一化

归一化处理并没有改变图像的对比度 

归一化处理很简单,假设原图像是8位灰度图像,那么读入的像素矩阵最大值为256,最小值为1 
定义矩阵为I 
J=I/256,就是归一化的图像矩阵,就是说归一化之后所有的像素值都在[0,1]区间内 

以灰度图像来说,就是一个每个bin中的像素数分别除以整幅图像总的像素数,得出一个在[0,1]区间数,即概率数。

4、直方图处理流程:首先

1、首先创建一个直方图

  1. CvHistogram* cvCreateHist(   

  2. int dims, //直方图维数 

  3. int* sizes,//直翻图维数尺寸

  4. int type, //直方图的表示格式

  5. float** ranges=NULL, //图中方块范围的数组

  6. int uniform=1 //归一化标识

  7.     );  

2、计算图像直方图cvCalcHist();

3、归一化直方图cvNormalizeHist();

4、通过访问直方图元素bin的值(归一化后已变为在【0~1】区间数)在一张图片上显示出直方图来。注意最终呈现的直方图是我们通过矩形自我绘制的,不是自动有函数可生成的。

   一般默认bin的最大值为图像的最高高度。