4、高光谱数据预处理:辐射定标、反射率转换、光谱平滑(Savitzky-Golay滤波)、去噪处理
拿到原始的高光谱数据,别急着分析。我见过太多新手,直接把DN值扔进模型里跑,结果一塌糊涂。说白了,传感器记录的原始数字(DN值)跟真实物理量之间,隔着一层窗户纸。这层纸不捅破,后面所有分析都是空中楼阁。
今天这章,咱们就聊聊数据预处理的四个关键步骤。我个人习惯把这四步叫做「从DN到干净光谱的必经之路」。每一步都有坑,我踩过不少,今天一并告诉你。
核心观点:预处理不是可选项,是必选项。不做预处理的分类精度,可能比做了的低20%以上。
4.1 辐射定标:把DN值变成物理量
辐射定标,说白了就是把传感器记录的「灰度值」转换成「辐射亮度值」。为什么要做?因为不同传感器、不同增益设置下,同一个物体拍出来的DN值可能差很多。你想想看,这怎么对比?
公式其实很简单:
L = Gain × DN + Offset
其中Gain(增益)和Offset(偏移)这两个参数,通常由传感器厂商提供。我在项目中遇到过最坑的事——有人用了上一年的定标参数来校正今年的数据。结果呢?光谱曲线整体偏移,分类全乱套了。
我的经验:每次采集数据前,务必做一次暗电流校正。盖上镜头盖拍一张全黑图像,用这个来修正Offset值。别偷懒,这一步能省掉后面很多麻烦。
辐射定标后的单位通常是W/(m²·sr·μm)或μW/(cm²·sr·nm)。记住这个单位,后面反射率转换要用到。
4.2 反射率转换:消除光照影响
辐射定标之后,我们得到的是辐射亮度值。但这个值受光照条件影响很大——晴天和阴天拍同一个物体,辐射亮度能差好几倍。怎么办?转成反射率。
反射率是物体的固有属性,跟光照无关。计算公式:
ρ = (π × L × d²) / (E₀ × cos(θ))
其中:
- ρ:反射率
- L:辐射亮度(上一步得到的)
- d:日地距离(天文单位)
- E₀:大气层外太阳辐照度
- θ:太阳天顶角
嗯,这里要注意——这个公式假设地表是朗伯体。实际中很少有完美的朗伯体,但作为近似已经够用了。
避坑指南:我曾经在植被光谱分析中忽略了大气校正,直接用表观反射率做分析。结果植被红边位置偏移了5nm,导致叶绿素含量估算完全错误。后来我养成了一个习惯——只要做定量分析,必须做大气校正。
常用的反射率转换方法有两种:
| 方法 | 适用场景 | 精度 | 复杂度 |
|---|---|---|---|
| 经验线性法 | 有已知反射率靶标 | 中等 | 低 |
| 辐射传输模型(如6S、MODTRAN) | 无地面同步测量 | 高 | 高 |
| 暗目标法 | 有暗目标(如深水体) | 中等 | 低 |
4.3 光谱平滑:Savitzky-Golay滤波
反射率转换之后,你可能会发现光谱曲线毛毛躁躁的,像锯齿一样。这是因为传感器噪声、环境扰动等因素造成的。直接拿这种曲线做分析,导数计算会放大噪声,结果惨不忍睹。
Savitzky-Golay滤波,我个人最喜欢用的平滑方法。它不像移动平均那样简单粗暴地抹平细节,而是用多项式拟合来保留光谱特征。
核心思想:对每个点,取它前后共2m+1个点,用n阶多项式拟合,然后用拟合值代替原始值。
from scipy.signal import savgol_filter
# 窗口大小:11,多项式阶数:3
smoothed_spectrum = savgol_filter(raw_spectrum, window_length=11, polyorder=3)
参数选择技巧:窗口大小和多项式阶数怎么选?我一般遵循「三七原则」——窗口大小取光谱波段数的3%~7%,多项式阶数取2~4。阶数太高会过拟合,窗口太大又会丢失细节。你想想看,如果窗口设成99,那跟直接画条直线有什么区别?
我记得有一次做矿物识别,窗口设小了,噪声没滤干净,导数光谱里全是假峰。后来把窗口从5调到11,效果立竿见影。所以别怕调参,多试几次。
4.4 去噪处理:不止是平滑
光谱平滑只是去噪的一种。实际上,高光谱数据的噪声来源很多:
- 条带噪声:推扫式传感器特有的,表现为图像上的竖条纹
- 死像素/坏像素:某个波段完全不响应或响应异常
- 水汽吸收带:1350-1450nm和1800-1950nm附近,信号几乎被水汽吸收完
针对不同噪声,处理方法也不同:
- 条带噪声:用傅里叶变换或小波变换,在频域里把特定频率的噪声滤掉
- 死像素:用邻近像素插值替换,或者直接用中值滤波
- 水汽吸收带:直接删除这些波段,别想着去补,补出来的也是假的
重要提醒:我曾经试图用水汽吸收带的插值数据做植被含水量反演,结果模型精度惨不忍睹。后来才明白——那些波段的信息已经被大气完全吸收了,插值出来的数据纯属自欺欺人。直接删掉,别犹豫。
去噪处理的顺序也有讲究。我个人习惯:先做坏像素修复,再做条带噪声去除,最后做光谱平滑。顺序反了,效果会打折扣。
4.5 本章知识体系
下面这张图,把整个预处理流程串起来了。你可以把它当作操作手册来用。
这张图里,去噪处理我画成了三个并行模块。实际执行时,顺序是:先修坏像素,再去条带噪声,最后删水汽波段。别搞反了。
好了,预处理这块就聊到这儿。记住一句话:预处理做得好,后面分析没烦恼。我这些年吃过的亏,都写在上面了,希望你能少走弯路。
本章要点回顾:
- 辐射定标:DN → 辐射亮度,注意暗电流校正
- 反射率转换:消除光照影响,必要时做大气校正
- Savitzky-Golay滤波:窗口大小取波段数的3%~7%,阶数2~4
- 去噪处理:先修坏像素,再去条带,最后删水汽波段