在分析图像、物体和视频信息的时候,我们经常用直方图来表达我们关注的信息。直方图在计算机视觉中应用广泛。例如,通过判断帧与帧之间边缘和颜色的统计量是否出现巨大变化,来检测视频中场景的变换。
直方图只是简单地将数据归入预定义的组,并在每个组内进行计数。也可以选择对数据提取特征、再对特征进行计数,这里的特征可以是梯度的长度、梯度的方向、颜色或者其他任何可以反映数据特点的特征,也就是说,直方图是一种用来揭示数据分布的统计特性的工具。直方图的维度通常比原始数据的维度低。
OpenCV中使用数组来表示直方图,这里的数组和用来表示其他数据额数组没有任何区别。这意味着对于一维或二维数组,你可以使用cv::Mat(NX1或者1XN来表示一维数组),也可以使用vector<>或稀疏矩阵类型。当我们把一个数组视为直方图时,它就具有和普通数组完全不同的含义。例如,若一个n维数组被视为直方图,数组中的每个元素表达的是该n维直方图中对应组中的计数结果。而直方图中组的编号就是数组某维与其该组对应的元素的下标,它们通常都是整数。
OpenCV中使用cv::calcHist()从数据创建直方图
什么是灰度直方图:
在数字图像处理中,灰度直方图是一种计算代价非常小但很有用的工具,它概括了一幅图像的灰度级信息。灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。
c++代码如下:
Mat calcGrayHist(const Mat & image)
{
Mat histogram = Mat::zeros(Size(256,1),CV_32SC1); //256对应的是0~255共计256个像素值
//注意,Size对应的是x和y,也就是第一个元数是矩阵的列数
int rows = image.rows; //输入图像的行数
int cols = image.cols; //输入图像的列数
for(int r =0;r<rows;r++)
{
for(int c = 0;c<cols;c++)
{
int index = int(image.at<uchar>(r,c); //获取每个点的像素值
histogram.at<int>(0,index) +=1; //获取了一个像素值,在相应的位置上加1
}
}
return histogram;
}
图像对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之,对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰。