- 本文代码使用OpenCV版本:2.4.13
- 本文代码在Win10+Visual Studio 2013 Update 3下测试通过
上一个博客《OpenCV之图像直方图计算》讲述了图像直方图的计算。计算出图像的直方图后,我们不仅可以据此观察图像的像素分布情况,还可以利用它对图像进行增强,例如直方图拉伸(Histogram Stretching)。
比如,我们有一个灰度图像的直方图如下所示:
可以看到,该直方图的左右两侧都有一部分区域,其高度近乎于0。这意味着,在该图像中,对应灰度级的像素出现的次数近乎于0。换句话说,图像所使用的灰度级集中在中部区域,从而使得图像具有较低的对比度。
如果我们忽略掉左右两侧高度近乎于0的区域,然后将直方图向左右两侧拉伸,则就可以使用到所有的灰度级,从而提高图像的对比度,这就是直方图拉伸的理念。拉伸后的直方图如下所示:
直方图拉伸的数学公式
假设决定忽略左右两侧高度小于等于minValue
的区域,那么首先应该从最左侧向右寻找第一个高度大于minValue
的灰度值,设为grayMin
;然后从最右侧向左寻找第一个高度大于minValue
的灰度值,设置为grayMax
,从而得到将要进行拉伸的区域[grayMin, grayMax]
。而要拉伸的目标是[0, 255]
。
所以对于原区域[grayMin, grayMax]
中的任意灰度g
,其拉伸后的结果应为:
g=(g−grayMin)∗255(grayMax−grayMin)