直方图匹配
在分析图像、物体和视频信息的过程中,我们常常想把眼中看到的对字用直方图(histogram)表示。直方图可以用来描述各种不同的事情,如物体的色彩分布、物体边缘梯度模板,以及表示目标位置的当前假设(目标当前位置的假设)的概率分布。直方图广泛应用于很多计算机视觉应用中。通过标记帧与帧之间显著的边缘和颜色的统计变化,直方图被用来检测视频中场景的变换。通过为每个兴趣点设置一个有相近特征的直方图所构成的“标签”,用以确定图像中的兴趣点。边缘、色彩、角等直方图构成了可以被传递给目标识别分类器的一个通用特征类型。色彩和边缘的直方图序列还可以用来识别网络视频是否被复制等。直方图是计算机视觉中最经典的工具之一。
简单地说,直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中。bin中的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。无论如何,直方图获得的是数据分布的统计图。通常直方图的维数要低于原始数据。
bin
“组距”的意思。
例如:计算颜色直方图需要将颜色空间划分为若干小的颜色区间,即直方图的bin,通过计算颜色在每个小区间内德像素得到颜色直方图,bin越多,直方图对颜色的分辨率越强,但增加了计算机的负担。
直方图的基本数据结构
首先直接查看CvHistogram的数据结构。
typedef struct CvHistogram
{
int type;
CvArr* bins;
float thresh[CV-MAX-DIM][2]; for uniform histograms
float** thresh2; for nonuniform histograms
CvMatND mat; embedded matrix header
for array histograms
}
CvHistogram;
这个定义看起来很简单但并非如此,因为直方图的很多内部数据都被存储于CvMatND结构中。我们用下面的程序创建一个新的直方图:
创建直方图cvCreateHist()
定义:
CvHistogram* cvCreateHist(
int dims,
int* sizes,
int type,
float** ranges=