OpenCV之直方图拉伸

本文介绍了如何使用OpenCV进行直方图拉伸以增强图像对比度。通过忽略直方图中高度接近0的区域,将图像灰度级拉伸至全部可用范围,提高了图像的视觉效果。直方图拉伸的数学公式和实际应用代码被详细阐述,并展示了拉伸前后图像的对比,特别是在处理彩色图像时,分别对R、G、B通道进行拉伸。
  1. 本文代码使用OpenCV版本:2.4.13
  2. 本文代码在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=(ggrayMin)255(grayMaxgrayMin)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值