在这篇文章 直方图与二值化 中,我介绍了直方图是什么(可以先看下这篇文章),以及通过直方图来对图像进行二值化的方法。
本文接着介绍直方图的第二个应用,通过直方图均衡化来提高图像整体的对比度。
目录:
- 灰度直方图
- 对比度和直方图
- 直方图均衡化
- 限制对比度的自适应直方图均衡化
一、灰度直方图
我们先通过代码获取图像的灰度直方图:
import
结果图如下,可以看到左图中灰度值为100左右的像素个数最多:
二、对比度和直方图
那么对比度和直方图有什么关系呢?
通过直方图我们可以看到各个灰度级的像素个数,即像素的分布情况。
对比度是由两个相邻区域的亮度差异产生的。换句话说,对比度是使一个物体与其他物体区别开来的视觉特性上的差异。在视觉感知中,对比度是由物体与其他物体的颜色和亮度差异决定的,而我们的视觉系统对对比度比对绝对亮度更敏感。
如果图像的大部分的像素都集中在直方图的某个范围,就表示图像中的大部分像素的灰度值差别很小,无法很好地进行分辨图像中的物体。
所以要想使得图像的对比度大,那么应该让图像中的像素均匀分布在各个灰度级上,即使得图像中最亮和最暗的像素差异最大,这体现在灰度强度和像素个数两方面。
比如下面这张图,右图是左图对应的直方图,其中红色表示直方图,黑色表示累积直方图,即每个灰度等级的值是小于该灰度等级的所有像素的个数。
可以看到累积直方图在中间位置上升的特别快,这说明了大多数像素的灰度值都集中在直方图的中间部分。
而一个对比度比较大的图的直方图和累积直方图如下:
因为累积直方图近似于一条直线,所以各个灰度区域的像素个数差异不大。
注意:上面直方图可以看到有些灰度等级的像素个数为0,这是因为在灰度均衡化时,不是对每个灰度等级进行处理,而是对灰度区间进行处理,这个区间被称为 bin。
三、直方图均衡化
直方图均衡化就是将原始图像的直方图进行非线性拉伸,使得直方图在全部灰度范围内均匀分布,通过重新分配像素灰度值来使得一定灰度区间内的像素数量大致相同,从而增强图像的对比度。
OpenCV 提供了实现直方图均衡化的函数:
img
直方图均衡化前后的图如下:
可以看到均衡化处理后对比度大大增强了,但是狗狗好像有点太亮了吧,这是因为这个直方图均衡化操作是对全局进行均衡化,直方图覆盖的范围太大,反而会丢失狗狗的一些图像信息。
四、CLAHE
CLAHE 全称为 Contrast Limited Adaptive Histogram Equalization,限制对比度的自适应直方图均衡化,名字有点太长了。。。
上面是对图像进行全局均衡化出现的问题,那么把图像划分成多个小矩形框,对这多个小矩形框分别进行直方图均衡化。当直方图只局限于某个特定矩形框时,直方图均衡化的效果就很好。
图像被划分后的小矩形框被称为 "tiles" (在 OpenCV 中,tileSize 默认为8x8),在这每个小矩形框内,直方图也会被限制在一个很小的范围内(除非图像中有噪声)。
如果小区域中存在噪声,那么该噪声就会被放大,为了避免这一点,使用了对比度限制 (在 OpenCV 中,clipLimit 默认为 2.0)。
img
结果图如下所示,可以看到调整对比度后,图像要比前一种方法柔和。
使用直方图均衡化调整图像对比度就介绍到这里,直方图均衡化还有个作用,对在不同的光线条件下拍摄不同的图片进行均衡化处理,可以使得这些图片具有大致相同的光照条件,这可以用在训练模型之前,对图像进行对预处理。
参考:
Histograms - 2: Histogram Equalization
https://blog.csdn.net/qq_40755643/article/details/84032773
如果觉得有用,就点个赞吧(ง •̀_•́)ง。