4、直方图与图像质量:如何通过直方图判断图像过暗、过亮、对比度低
拿到一张遥感影像,第一眼看的什么?
我个人的习惯,不是先看图像本身,而是先拉一下它的直方图。为什么?因为人眼会骗人,但像素的统计分布不会。一张图看着挺亮,可能暗部细节全丢了;看着灰蒙蒙的,也许信息量反而很丰富。直方图就是图像的「体检报告」,过暗、过亮、对比度低,全写在上面。
4.1 直方图的基本形态与「健康」图像
先说说什么是「健康」的直方图。一张曝光合理、对比度适中的遥感图像,它的直方图应该是什么样的?
- 分布范围宽:像素值从接近0到接近255都有覆盖,不挤在某个小区域。
- 无明显断层:灰度级连续,没有大段空白(除非是特殊地物,比如纯水体)。
- 峰值适中:不会出现一个极高的尖峰把其他信息都压下去。
说白了,就是直方图「铺得开、走得匀」。我在处理高分二号的城市影像时,经常拿这个标准去卡——如果直方图两头都顶到边了,中间还有起伏,那这张图的质量基本没问题。
健康直方图特征速查
- 覆盖范围:≥ 90% 的灰度动态范围
- 无连续 10 个以上灰度级为零
- 主峰高度不超过总像素数的 15%
4.2 过暗图像:直方图「左偏」
过暗图像,也叫低照度图像。它的直方图长什么样?
像素值集中在左侧,也就是低灰度区域。大部分像素的 DN 值在 0~50 之间,右侧高亮区域几乎没像素。你想想看,整张图看起来黑乎乎的,像蒙了一层灰布。
我在项目中遇到过一件事。有一次处理山区阴影区域的 WorldView-3 数据,直方图峰值压在 DN=15 的位置,右侧到 DN=80 就没了。肉眼看去,山沟里的植被和土壤根本分不清。这就是典型的过暗——动态范围被压缩在暗部,信息挤在一起,人眼分辨不出来。
判断指标:如果直方图主体(90% 像素)集中在 0~64 区间,且右侧 192~255 区间像素占比 < 1%,基本可以判定为过暗。
过暗图像的问题不只是「看不清楚」。更严重的是,暗部噪声会被放大。我曾经做过一个实验:对一张过暗的 Landsat 8 影像做线性拉伸,结果暗部的传感器噪声也跟着被放大了,图像出现明显的条带。所以,遇到过暗图像,别急着拉伸,先看看噪声水平。
4.3 过亮图像:直方图「右偏」
过亮图像正好反过来。直方图像素值集中在右侧,大部分 DN 值在 200~255 之间。图像看起来白花花一片,像曝光过度。
这种情况在雪地、沙漠、云层覆盖的区域很常见。我记得有一次处理青藏高原的积雪影像,直方图峰值直接顶在 DN=255 的位置,而且有一个很长的「拖尾」——大量像素被截断在 255,说明已经饱和了。
饱和问题:当直方图在 255 处出现一个陡峭的尖峰,说明大量像素被「截断」。这些区域的真实辐射信息已经丢失,后期再怎么处理也恢复不了。这是硬件层面的损失,不可逆。
过亮图像的处理难点在于:你不能简单地把亮度压下来,因为饱和区的信息已经没了。我建议的做法是,先检查直方图右侧是否有「悬崖式」截断。如果有,那这部分区域只能当作无效区域处理,或者用其他时相的数据补充。
4.4 低对比度图像:直方图「窄分布」
低对比度图像,是遥感影像里最常见的质量问题。它的直方图特征是:像素值集中在一个狭窄的区间内,不管这个区间是在暗部、亮部还是中间。
举个例子:一张雾霾天气下的 SPOT 影像,直方图可能集中在 DN=80~120 之间,左右两边都是空的。图像看起来灰蒙蒙的,像隔了一层毛玻璃。地物的边界模糊,纹理细节丢失。
我把它分成三种情况:
| 类型 | 直方图位置 | 典型场景 | 处理难度 |
|---|---|---|---|
| 暗部窄分布 | 集中在 0~50 | 阴影、夜间、浓密植被 | 中等(噪声放大风险) |
| 亮部窄分布 | 集中在 200~255 | 雪地、沙漠、云层 | 高(饱和风险) |
| 中部窄分布 | 集中在 64~192 | 雾霾、薄云、大气散射严重 | 低(拉伸效果好) |
中部窄分布其实是最「好救」的。因为信息没有丢失,只是被压缩了。做一次直方图均衡化或者线性拉伸,效果立竿见影。但暗部和亮部的窄分布,处理起来就要小心了——前者怕噪声,后者怕饱和。
4.5 综合判断流程:一张图看懂
下面这张 SVG 图,是我在实际项目中总结的判断流程。拿到一张影像,按这个顺序走一遍,基本能定位问题。
4.6 实战案例:三张图的直方图对比
光说理论不够。我拿三个真实案例来对比,你一看就明白。
| 案例 | 直方图特征 | 肉眼效果 | 处理建议 |
|---|---|---|---|
| 案例A:山区阴影 | 峰值在 DN=20,90% 像素在 0~60 | 图像极暗,细节不可辨 | 先做去噪,再做直方图均衡化 |
| 案例B:雪地影像 | 峰值在 DN=250,DN=255 处有截断尖峰 | 图像过亮,雪地纹理丢失 | 检查饱和区域,考虑多时相融合 |
| 案例C:雾霾城市 | 集中在 DN=80~140,左右空白 | 图像灰蒙蒙,边界模糊 | 线性拉伸或去雾处理,效果显著 |
案例C是我最喜欢处理的一类。为什么?因为信息没丢,只是被「压缩」了。做一次线性拉伸,把 DN=80~140 映射到 0~255,图像瞬间通透。但案例A和B就麻烦得多——一个要跟噪声做斗争,一个要面对不可恢复的信息损失。
曾经踩过的坑:有一次我处理案例A类型的影像,直接做了直方图均衡化。结果暗部噪声被放大,图像出现明显的「颗粒感」。后来我学乖了,先做了一轮中值滤波去噪,再做均衡化,效果好了很多。记住:过暗图像的处理,去噪要走在增强前面。
4.7 快速自查清单
最后,给你一个我在项目里用的自查清单。拿到一张影像,按这个顺序检查,5 分钟就能判断出图像质量。
- 看分布范围:直方图覆盖了 0~255 的多少?如果 < 60%,直接判定为低对比度。
- 看峰值位置:主峰在左侧(过暗)、右侧(过亮)还是中间(低对比度)?
- 看截断情况:0 或 255 处有没有陡峭尖峰?有的话,信息已丢失。
- 看噪声水平:直方图底部有没有「毛刺」?毛刺多说明噪声大。
- 看地物可分性:不同地物的峰值是否重叠严重?重叠多说明对比度不足。