3、直方图均衡化原理:从概率密度函数到累积分布函数,均衡化的数学推导
好,咱们进入核心环节。前面两章我们看了直方图长什么样,也知道了它反映图像的什么特性。但光看还不够,我们得动手改造它。直方图均衡化,说白了就是让图像的灰度分布变得更均匀——暗的地方提亮,亮的地方压暗,让细节都露出来。
我刚开始学的时候,觉得这玩意儿就是调调对比度。后来做项目才发现,背后的数学推导才是精髓。不理解这层,你调参数就是瞎蒙。今天咱们就把这块硬骨头啃下来。
3.1 从离散到连续:灰度值的概率视角
先问一个问题:一张8位灰度图,有256个灰度级。每个灰度级出现的概率是多少?
很简单,统计一下:
- 灰度值 r 出现的次数 = h(r)
- 总像素数 = N
- 概率 p(r) = h(r) / N
这就是概率密度函数(PDF)在图像里的体现。每个灰度值对应一个概率,所有概率加起来等于1。
核心理解:直方图均衡化的本质,就是通过一个变换函数,把输入灰度 r 映射到输出灰度 s,使得 s 的分布尽可能均匀。
嗯,这里要注意。我们处理的是离散数据,但推导时用连续函数更方便。先假设灰度是连续的,范围归一化到 [0, 1]。最后再离散化回去。
3.2 累积分布函数:均衡化的核心工具
为什么是累积分布函数(CDF)?我当年也困惑过。后来在项目中调试一个低照度图像增强算法,才真正想明白。
假设我们有一个变换函数 T(r):
s = T(r) = ∫₀ʳ p(w) dw (连续形式)
这个积分就是累积分布函数。它把输入灰度 r 映射到 [0, 1] 之间的一个值。关键性质来了:
- 单调递增:保证灰度顺序不变,亮的还是亮的,暗的还是暗的
- 值域 [0, 1]:输出归一化,方便后续量化
- 导数等于 p(r):这个性质决定了均衡化的效果
我的经验:我曾经在医疗影像项目中,直接用CDF做映射,结果发现图像整体偏亮。后来检查发现,是因为没有考虑灰度级的离散化误差。记住,离散CDF的步长是1/256,不是连续的。
3.3 数学推导:为什么CDF能让直方图变平?
咱们来推导一下。假设输入灰度 r 的PDF是 p_r(r),输出灰度 s 的PDF是 p_s(s)。变换函数 s = T(r)。
根据概率论,两个随机变量的PDF关系是:
p_s(s) = p_r(r) · |dr/ds|
因为 s = T(r),所以 dr/ds = 1 / (ds/dr) = 1 / p_r(r)。代入上式:
p_s(s) = p_r(r) · (1 / p_r(r)) = 1
看到了吗?输出灰度 s 的PDF恒等于1!这就是均衡化的数学本质——输出分布是均匀的。
注意:这个推导在连续情况下完美成立。但离散情况下,由于量化误差,输出直方图只能近似均匀,不可能完全平坦。我在做卫星图像处理时就踩过这个坑——期望太高,结果发现直方图还是有点起伏。
3.4 离散实现:从理论到代码
理论说完了,咱们看看实际怎么做。离散情况下,灰度级是整数 0~255。CDF的计算变成累加:
cdf(r) = Σᵢ₌₀ʳ p(i) (i = 0, 1, ..., r)
然后映射到输出灰度:
s = round( cdf(r) × 255 )
这里有个细节:CDF的最小值可能不是0,最大值是1。直接乘255,会把最暗的像素映射到非零值。所以实际实现中,常用:
s = round( (cdf(r) - cdf_min) / (1 - cdf_min) × 255 )
这样能保证最暗的像素映射到0。
实现步骤:
- 统计直方图 h(r),r = 0~255
- 计算概率 p(r) = h(r) / N
- 计算累积分布 cdf(r)
- 归一化映射:s = round(cdf(r) × 255)
- 建立查找表 LUT[r] = s
- 遍历图像,用LUT替换每个像素
3.5 一个完整的例子
假设一张3×3的小图,灰度值如下:
| 灰度 r | 像素数 h(r) | 概率 p(r) | CDF | 映射 s |
|---|---|---|---|---|
| 0 | 2 | 2/9 ≈ 0.222 | 0.222 | round(0.222×255) ≈ 57 |
| 1 | 1 | 1/9 ≈ 0.111 | 0.333 | round(0.333×255) ≈ 85 |
| 2 | 3 | 3/9 ≈ 0.333 | 0.667 | round(0.667×255) ≈ 170 |
| 3 | 3 | 3/9 ≈ 0.333 | 1.000 | round(1.000×255) ≈ 255 |
你看,原来集中在低灰度的像素,被拉伸到了整个灰度范围。这就是均衡化的效果。
3.6 核心知识结构图
下面这张图把整个推导过程串起来了:
3.7 常见误区与避坑指南
做均衡化时,有几个坑我踩过,分享给你:
- 误区一:认为均衡化后直方图平坦——离散量化必然有误差,别追求完美
- 误区二:忽略CDF的归一化——直接乘255会导致最暗像素不是0,图像发灰
- 误区三:对彩色图像直接均衡化——应该在HSV空间的V通道上做,否则颜色会失真
我曾经在做一个工业检测项目时,对RGB三个通道分别做均衡化,结果图像颜色完全乱套了。后来改成只处理亮度通道,问题才解决。记住:均衡化改变的是灰度分布,不是颜色。
3.8 小结
这一章我们走完了从概率密度函数到累积分布函数,再到均衡化映射的完整推导。核心就一句话:用CDF作为映射函数,能把输入灰度分布变成近似均匀分布。