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附近,信号几乎被水汽吸收完

针对不同噪声,处理方法也不同:

  1. 条带噪声:用傅里叶变换或小波变换,在频域里把特定频率的噪声滤掉
  2. 死像素:用邻近像素插值替换,或者直接用中值滤波
  3. 水汽吸收带:直接删除这些波段,别想着去补,补出来的也是假的

重要提醒:我曾经试图用水汽吸收带的插值数据做植被含水量反演,结果模型精度惨不忍睹。后来才明白——那些波段的信息已经被大气完全吸收了,插值出来的数据纯属自欺欺人。直接删掉,别犹豫。

去噪处理的顺序也有讲究。我个人习惯:先做坏像素修复,再做条带噪声去除,最后做光谱平滑。顺序反了,效果会打折扣。

4.5 本章知识体系

下面这张图,把整个预处理流程串起来了。你可以把它当作操作手册来用。

高光谱数据预处理流程 原始DN值数据 辐射定标 → 辐射亮度 反射率转换 → 反射率 条带噪声去除 坏像素修复 水汽波段删除 Savitzky-Golay平滑

这张图里,去噪处理我画成了三个并行模块。实际执行时,顺序是:先修坏像素,再去条带噪声,最后删水汽波段。别搞反了。

好了,预处理这块就聊到这儿。记住一句话:预处理做得好,后面分析没烦恼。我这些年吃过的亏,都写在上面了,希望你能少走弯路。

本章要点回顾:

  • 辐射定标:DN → 辐射亮度,注意暗电流校正
  • 反射率转换:消除光照影响,必要时做大气校正
  • Savitzky-Golay滤波:窗口大小取波段数的3%~7%,阶数2~4
  • 去噪处理:先修坏像素,再去条带,最后删水汽波段

专注资料整理