🌟 在探索CLAHE的奥秘之前,让我们先了解一下直方图均衡化的基础知识。温馨提示:本文内容较为深入,建议准备好一杯咖啡慢慢阅读。
📚 目录
📊 直方图均衡化(HE)
直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法。它的核心思想是将图像的直方图分布变成近似均匀分布,从而增强图像的对比度。
🧮 数学原理
考虑一个离散的灰度图像 { x } \{x\} {x},令 n i n_i ni 为灰度 i i i 的出现次数。图像中出现第 i i i 级像素的概率为:
p x ( i ) = n i n p_x(i) = \frac{n_i}{n} px(i)=nni
其中:
- L L L 是图像中灰度的总数(通常为256)
- n n n 是图像中像素的总数
- p x ( i ) p_x(i) px(i) 实际上是像素值 i i i 的图像直方图,已标准化为 [0,1]
定义累积分布函数(CDF)为:
c d f x ( i ) = ∑ j = 0 i p x ( j ) cdf_x(i) = \sum_{j=0}^{i} p_x(j) cdfx(i)=j=0∑ipx(j)
我们想创建一个形式为 y = T ( x ) y = T(x) y=T(x) 的转换,以生成具有平坦直方图的新图像 { y } \{y\} {y}。这样的图像将在整个值范围内具有线性化的累积分布函数:
c d f y ( i ) = i ⋅ K cdf_y(i) = i \cdot K cdfy(i)=i⋅K
对于某一常数 K K K。CDF 的属性允许我们执行这样的变换,它被定义为:
T ( x ) = c d f x ( x ) T(x) = cdf_x(x) T(x)=cdfx(x)
其中 k k k 在 [0, L] 范围内。注意,由于我们使用归一化的直方图 { x } \{x\} {x},因此 T T T 将级别映射到 [0,1] 范围内。为了将值映射回到其原始范围,需要对结果应用以下简单转换:
y ′ = y ⋅ ( m a x { x } − m i n { x } ) + m i n { x } y' = y \cdot (max\{x\} - min\{x\}) + min\{x\} y′=y⋅(max{x}−min{x})+min{x}
🎯 通俗解释
简单来说,直方图均衡化就是:
- 遍历图像的像素统计出灰度值
- 计算累积分布函数(CDF)
- 将结果映射到 0~255 范围
💡 小贴士:这里我们主要讨论灰度图(单通道图)。对于彩色图像,可以:
- 使用单独的直方图均衡化操作
- 或者使用公式 Y = 0.2126 R + 0.7152 G + 0.0722 B Y = 0.2126R + 0.7152G + 0.0722B Y=0.2126R+0.7152G+0.0722B 将 RGB 图像转换为灰度图后再进行均衡化
对于单通道图,我们假设所示的8位灰度图像具有以下值:
下表中显示了该图像的直方图。为了简洁起见,将计数为零的像素值排除在外。
所述累积分布函数(CDF)如下所示。再次,为简洁起见,排除了不会增加cdf的像素值。
再通过此cdf显示子图像中的最小值为52,最大值为154。值154的cdf为64,与图像中的像素数一致。CDF必须标准化为[0,255]。直方图的一般均衡公式为:
h ( v ) = r o u n d ( c d f ( v ) − c d f m i n ( M × N ) − c d f m i n × ( L − 1 ) ) h(v) = round\left(\frac{cdf(v) - cdf_{min}}{(M \times N) - cdf_{min}} \times (L - 1)\right) h(v)=round((M×N)−cdfmincdf(v)−cdfmin×(L−1))
其中cdf min是累积分布函数的最小非零值(在本例中为1),M×N给出图像的像素数(例如,在64以上的示例中,M为宽度,N为高度),L为使用的灰度级数(在大多数情况下为256)。请注意,要在原始数据中将大于0的值缩放到1到L-1(包括1和L-1)的范围,则上述公式将改为:
h ( v ) = r o u n d ( c d f ( v ) − 1 ( M × N ) − 1 × ( L − 1 ) ) h(v) = round\left(\frac{cdf(v) - 1}{(M \times N) - 1} \times (L - 1)\right) h(v)=round((M×N)−1cdf(v)−1×(L−1))
其中cdf(v)>0。从1缩放到255保留最小值的非零值。示例比例数据从0到255(包括0和255)的均衡公式为:
h ( v ) = r o u n d ( c d f ( v ) − 1 63 × 255 ) h(v) = round\left(\frac{cdf(v) - 1}{63} \times 255\right) h(v)=round(63cdf(v)−1×255)
例如,78的cdf为46。(第7列的下一行使用78的值。)标准化后的值变为:
h ( 78 ) = r o u n d ( 46 − 1 63 × 255 ) = r o u n d ( 0.714286 × 255 ) = 182 h(78) = round\left(\frac{46 - 1}{63} \times 255\right) = round(0.714286 \times 255) = 182 h(78)=round(6346−1×255)=round(0.714286×255)=182
🔄 自适应直方图均衡(AHE)
自适应直方图均衡(AHE)是普通直方图均衡化的升级版。它最大的特点是能够局部增强对比度,让图像的每个区域都得到适当的处理。
🎨 实现原理
- 将图片分割成多个块(例如 8×8 的块,无法整除可以补零)
- 对每个块分别计算累积分布函数
- 进行局部直方图均衡化
⚠️ 但是!AHE 有一个小缺点:它容易在图像的相对均匀区域中过度放大噪声。这主要是因为:
- 局部邻域越小,局部对比度越强
- 如果矩形区域内的图像块信息比较平坦,灰度接近,其灰度直方图呈尖状,在直方图均衡的过程中就可能会出现过度放大噪声的情况
🎯 限制对比度自适应直方图均衡化(CLAHE)
CLAHE 是 AHE 的改进版本,它通过限制对比度放大的方式来防止噪声过度放大。
🧠 核心原理
CLAHE 的实现主要包括 6 个步骤:
- 分块:将输入图像划分为大小相等的不重叠子块,每个子块含有的像素数为M。参考示例为8×8块。
- 计算子块直方图
- 计算剪切阈值 clipLimit(可以展开讨论,类似图像分割算法的大津法思想)
- 像素点重分配:对每个子块,使用步骤三中多余的像素重新分配
- 直方图均衡
- 像素点灰度值重构(源码中采用了双线性插值)
🔧 重要参数
CLAHE 的效果可以通过以下参数进行调整:
参数 | 说明 |
---|---|
窗口大小 | 分割的块大小 |
块数 | 裁剪的数量 |
CDF斜率限制 | 强度传递函数中的对比度拉伸 |
直方图 bins 个数 | 0~255 之间范围选取 |
📝 补充说明
在阅读 CLAHE 原始论文的作者之一 Karel Zuiderveld CLAHE的示例实现 时,我发现一个有趣的优化:作者通过增加双线性插值来减少代码时间复杂度。同时,插值运算及高斯平滑可以降低噪声产生。
🔗 相关参考
-
官方文档与实现
-
中文技术文章
-
英文参考资料
💡 小贴士:CLAHE 的参数调整需要根据具体应用场景来优化,没有放之四海而皆准的最佳参数组合。