基于 FPGA 的 CLAHE 自适应限制对比度直方图均衡算法硬件实现
一、CLAHE 算法基本原理
1.1 算法背景
CLAHE(Contrast Limited Adaptive Histogram Equalization,对比度受限的自适应直方图均衡)是对传统自适应直方图均衡(AHE)的改进。AHE 通过将图像划分为多个子区域(称为'Tiles'),对每个 Tile 独立进行直方图均衡化,从而适应图像的局部特性。然而,AHE 在噪声较大的平坦区域(如天空、墙面)容易过度放大噪声,产生伪影。
CLAHE 通过引入对比度限制机制来解决此问题。
1.2 核心处理步骤
1.2.1 图像分块 (Tiling)
将整幅图像划分为 M × N 个连续且不重叠的矩形子区域(Tiles)。本设计采用 4×4=16 分块。
1.2.2 直方图计算 (Histogram Calculation)
为每个 Tile 独立计算其灰度直方图 H(i),其中 i 是灰度级(0-255)。
1.2.3 对比度限制 (Contrast Limiting / Clipping)
这是 CLAHE 的关键步骤。首先设定'裁剪阈值'(Clip Limit),根据归一化的裁剪因子 β、Tile 总像素数 N_tile 和灰度级数 L 计算:
$$ T_{clip} = \beta \times \frac{N_{tile}}{L} $$
遍历 Tile 直方图,将超出阈值的像素数裁剪:
$$ H_{clipped}(i) = \begin{cases} T_{clip} & \text{if } H(i) > T_{clip} \ H(i) & \text{if } H(i) \le T_{clip} \end{cases} $$
1.2.4 溢出重分配 (Redistribution)
将所有灰度级裁剪下来的像素总数(溢出量)均匀重分配到所有灰度级中:
$$ N_{overflow} = \sum_{i=0}^{L-1} \max(0, H(i) - T_{clip}) $$
$$ H_{final}(i) = H_{clipped}(i) + \frac{N_{overflow}}{L} $$
硬件实现优化:由于 RTL 使用整数统计直方图,同时需要保证直方图总和不变,这里我们采用整除 + 余数分配策略:
$$ avg = \lfloor N_{overflow} / L \rfloor, \quad remainder = N_{overflow} \mod L $$
$$ H_{final}(i) = \begin{cases} H_{clipped}(i) + avg + 1 & \text{if } i < remainder \ H_{clipped}(i) + avg & \text{if } i \ge remainder \end{cases} $$
1.2.5 生成映射函数 (Mapping Function)
对于每个块(tile),基于处理后的直方图计算累积分布函数(CDF),归一化后作为映射查找表,即输入像素 h 灰度值为 j,映射后输出灰度值为 LUT(j)
$$ CDF(j) = \sum_{i=0}^{j} H_{final}(i) $$
$$ LUT(j) = \frac{L-1}{N_{tile}} \times CDF(j) $$
1.2.6 双线性插值 (Bilinear Interpolation)
为消除 Tile 边界的'块效应',每个像素的输出值通过查找周围四个 Tile 中心的 LUT 映射值 V,再进行双线性插值加权平均得出:
$$ V_{top} = (1 - \Delta x) \cdot V_{TL} + \Delta x \cdot V_{TR} $$ $$ V_{bottom} = (1 - \Delta x) \cdot V_{BL} + \Delta x \cdot V_{BR} $$ $$ P_{out} = (1 - \Delta y) \cdot V_{top} + \Delta y \cdot V_{bottom} $$


