图像直方图是对数据集合的一种统计方法,将统计结果分布于一系列预定义的bin中,bin是直方图中经常用到的一个概念,其数值是从数据中计算出的特征统计量,这些数据不仅仅指的灰度值,统计数据可能是任何能有效描述图像的特征包括梯度、方向、色彩或任何其他特征。直方图获得的是数据分布的统计图,通常直方图的维数要低于原始数据。
图像直方图是用以表示数字图像中亮度分布的直方图,标绘了图像中亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布,这种直方图中横坐标的左侧为纯黑或较暗区域,右侧为较亮纯白的区域。因此一张较暗图片的图像直方图中数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。计算机视觉领域长借助图像直方图来实现图像的二值化。直方图意义如下:
. 直方图是图像中像素强度分布的图形表达方式。
. 它统计了每个强度值所具有的像素个数。
假设有一个矩阵包含一张图像信息(灰度值0-255),如下:
如果按照某种方式去统计这些数字,已知数字的范围包含256个值,将这个范围分割成子区域就是bins,如:
然后再统计在每一个bin的像素数目。采用这一方法统计上面的数字矩阵我们可以得到下图(x轴表示bin, y轴表示各个bin中的像素个数)。
以上只是一个所名直方图如何工作以及它的用处的简单示例。直方图可以统计的不仅仅是颜色灰度,它可以统计任何图像特征(如梯度,方向等等).具体阐述以下直方图的具体细节:
a. dims: 需要统计的特征的数据,上面的例子中,dims=1因为我们仅仅统计了灰度值(灰度图像)
b. bins:每个特征空间子区段的数据,上面的例子中bins=16
c. range: 每个特征空间的取值范围,在上面的例子中range=[0,255]
如果想统计两个特征,直方图就由上面的二维扩展为三维,x轴和y轴分别代表一个特征,z轴是再bin区间的样本数据,同样的方法适用于更多多维度的情况。
在opencv中提供了calcHist()函数计算图像的直方图,计算完成后可以采用前面提到的opencv中的绘图函数如rectangle、line()等绘制显示出来.calcHist()函数原型如下:
void cv::calcHist ( const Mat * images,
int nimages,
const int * channels,
InputArray mask,
OutputArray hist,
int dims,
const