4. 自适应直方图均衡化(AHE):局部对比度增强、分块策略、块效应问题
直方图均衡化(HE)大家应该都熟悉,它对整张图做全局映射。但在低光照场景下,全局处理往往顾此失彼——暗部细节刚拉起来,亮部就已经过曝了。这时候,自适应直方图均衡化(AHE)就派上了用场。
说白了,AHE 的核心思想就是:不看全局,只看局部。每个像素的映射函数只由它周围一个小窗口决定。这样,暗区的对比度能独立增强,亮区也不会被过度拉伸。
对于像素 (x, y),以其为中心的邻域窗口 W 内,计算局部直方图 h_W,然后做 CDF 映射:
g(x, y) = round( (L-1) * CDF_W( f(x, y) ) )其中 L 是灰度级数(通常 256),CDF_W 是窗口内的累积分布函数。
4.1 分块策略:如何划分局部窗口
AHE 的第一步就是决定“局部”有多大。我习惯把这个问题拆成两个参数:窗口大小和滑动步长。
| 窗口大小 | 效果特点 | 适用场景 |
|---|---|---|
| 8×8 或 16×16 | 对比度极强,噪声放大明显 | 纹理丰富、噪声低的图像 |
| 32×32 | 平衡对比度与噪声 | 大多数低光照场景(默认推荐) |
| 64×64 或更大 | 接近全局 HE,局部细节丢失 | 光照均匀、只需微调的场景 |
我在项目中遇到过一个问题:窗口太小,结果把传感器噪声也当成细节给放大了,整张图全是颗粒感。嗯,这里要注意——窗口越小,局部统计越不稳定,噪声越容易被当成信号。
4.2 块效应问题:为什么会有?怎么解决?
如果你直接用不重叠的块做 AHE,会发现图像上出现明显的棋盘格。这就是块效应。为什么会这样?
因为相邻块的直方图分布不同,映射函数也不同。同一个灰度值,在左边块被映射成 200,在右边块被映射成 180,边界处自然就出现了跳变。
解决块效应,主流方法有两种:
- 双线性插值(Bilinear Interpolation):每个像素的映射值由周围 4 个块的映射结果加权平均得到。权重由像素到块中心的距离决定。这是最常用的方法,计算量可控,效果也不错。
- 重叠块(Overlapping Blocks):每个像素都以其为中心计算一次直方图。效果最好,但计算量巨大——每像素都要做一次直方图统计,基本不实用。
实际工程中,几乎都用双线性插值。我一般把块大小设为 32×32,然后对每个像素做双线性插值,基本看不到块效应。
4.3 AHE 的完整流程
下面这张图展示了 AHE 从输入到输出的核心流程:
4.4 代码实战:OpenCV 中的 CLAHE
实际开发中,我们很少手写 AHE。OpenCV 提供了 createCLAHE 接口,它其实是 AHE 的改进版——限制对比度自适应直方图均衡化(CLAHE)。CLAHE 在 AHE 的基础上加了一个对比度裁剪步骤,防止噪声被过度放大。
import cv2
import numpy as np
# 读取低光照图像
img = cv2.imread('low_light.jpg', 0)
# 创建 CLAHE 对象
# clipLimit: 对比度裁剪阈值,越大对比度越强
# tileGridSize: 分块大小,必须为整数
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# 应用 CLAHE
result = clahe.apply(img)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('CLAHE', result)
cv2.waitKey(0)
- clipLimit:我一般从 2.0 开始调。如果噪声明显,降到 1.0;如果对比度不够,升到 3.0~4.0。超过 5.0 基本就会看到明显的噪声放大。
- tileGridSize:8×8 适合细节丰富的场景,16×16 更平滑。对于 1080P 图像,我常用 16×16。
4.5 AHE 与 CLAHE 的对比
| 特性 | AHE | CLAHE |
|---|---|---|
| 对比度增强 | 强,但可能过度 | 可控,有裁剪限制 |
| 噪声放大 | 严重 | 明显抑制 |
| 块效应 | 需要插值处理 | 内置插值,基本无块效应 |
| 计算复杂度 | 中等 | 略高(多了裁剪步骤) |
| 工程推荐度 | 不推荐直接使用 | 强烈推荐 |
你想想看,如果 AHE 是“野蛮生长”,那 CLAHE 就是“有管理的增长”。它把对比度限制在一个范围内,不让任何一个灰度级被过度拉伸。这也是为什么 CLAHE 成为工业界事实标准的原因。
去噪 → CLAHE → 锐化
好了,AHE 和 CLAHE 的核心内容就这些。记住一句话:局部对比度增强的关键在于“分块”和“限制”。分块大小决定细节保留程度,对比度限制决定噪声控制能力。这两个参数调好了,低光照图像的质量能上一个台阶。