直方图理解 ~~CvHistogram结构的理解

直方图是计算机视觉中最经典的工具之一。现在我们来详细讲讲直方图。

1.直方图的作用。

通过标记帧与帧之间的边缘和颜色的统计变化,直方图被用来检测视频中场景的变化。通过为每个兴趣点设置一个有相近特征的直方图所构成的“标签”,用以确定图像中的兴趣点。边缘、色彩、角等直方图构成了可以被传递给目标识别分类器的一个通用特征类型。

2.如何得到直方图

(1)首先理解直方图中bin的含义

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

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


CvHistogram,现在来具体的研究一下这个结构。

定义:

typedef struct CvHistogram

{

int type;

CvArr* bins;

float thresh[CV_MAX_DIM][2];

float** thresh2;

CvMatND mat;

}CvHistogram;

第一个成员type:用来指定第二个成员bins的具体类型。bins的类型是CvArr*,看其定义可以知道,CvArr* 仅仅是被用于作函数的参数,用于指示函数接收的数组类型可以不止一个,如 IplImage*, CvMat* 甚至 CvSeq*,所以需要type来具体指定bins的类型。

第二个成员bins : 用于存放直方图每个灰度级数目的数组指针,数组在cvCreateHist 的时候创建,其维数由cvCreateHist 确定(一般以一维比较常见)。

第三个成员thresh:一个二维数组,CV_MAX_DIM对应直方图的维数。且第二维固定为2。

这个数组比较难理解,首先要理解什么是一维直方图和二维直方图。一维直方图就是单通道图像的直方图,或者彩色图像中某个单独通道的直方图。二维直方图就是2个通道的直方图,比如彩色图像的红-蓝直方图。既然是直方图,必定有上下界,所以thresh的第二维是2,比如[0 255],就是统计[0-255]区间灰度分布的直方图。而二维红-蓝直方图的thresh为[0 255;100 200],就是分别统计红色图像灰度级在[0 255]以及蓝色图像在灰度级[100 200]的分布情况。

第四个成员是thresh2一个二维数组指针,用于非均匀直方图的情形。如果是均匀直方图,会自动根据bin的个数均分上下界,每个bin的大小一样。若是非均匀直方图,就要用到thresh2这个参数指定每个区间的上下界,要是多维的直方图,那么就要为每一维的所有bin都设定上下界。

最后一个成员mat,用来存储数据。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章