这周学习直方图,看了许多资料,才搞明白其中的一些道道,现在结合下图给大家分享下。
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、首先创建一个直方图
-
CvHistogram* cvCreateHist(
-
int dims,
-
int* sizes,
-
int type,
-
float** ranges=NULL,
-
int uniform=1
-
);
2、计算图像直方图cvCalcHist();
3、归一化直方图cvNormalizeHist();
4、通过访问直方图元素bin的值(归一化后已变为在【0~1】区间数)在一张图片上显示出直方图来。注意最终呈现的直方图是我们通过矩形自我绘制的,不是自动有函数可生成的。
一般默认bin的最大值为图像的最高高度。
本文出自 “入乎其内出乎其外” 博客,请务必保留此出处http://b217dgy.blog.51cto.com/5704306/1340102