4、高光谱数据预处理:坏波段去除、噪声平滑、归一化、数据降维(PCA、MNF)的基本方法
高光谱图像(Hyperspectral Image, HSI)通常包含数百个连续且窄的波段,其数据立方体具有“图谱合一”的特性。然而,原始数据中往往混杂着传感器噪声、大气吸收、水汽干扰以及冗余信息。如果直接将这些原始数据送入分类器或目标检测器,不仅计算开销巨大,而且噪声和冗余会严重干扰特征提取,导致模型泛化能力下降。因此,数据预处理是高光谱应用流程中承上启下的关键环节。本章将系统讲解坏波段去除、噪声平滑、归一化以及两种主流降维方法(PCA与MNF)的基本原理、操作流程与实战要点,帮助学习者建立一套稳健的预处理流水线。
4.1 坏波段去除:净化数据源头
核心原理:高光谱传感器在成像过程中,受大气水汽吸收、传感器响应非均匀性、暗电流漂移等因素影响,部分波段信噪比极低或完全失效。这些“坏波段”不仅无法提供有效的地物信息,还会在后续统计计算中引入巨大噪声方差,干扰主成分分析和分类器训练。坏波段去除的本质是数据质量筛选,其目标是在保留有效光谱信息的前提下,剔除无效或低质量波段。
判断方法:通常从三个维度综合判断:
- 目视检查:将数据立方体按波段顺序播放或生成灰度图序列,观察是否存在明显的条纹、全黑或全白波段。
- 信噪比(SNR)统计:计算每个波段的均值与标准差之比,SNR低于某一阈值(如10 dB)的波段应被标记。
- 大气吸收窗口:对于可见光-近红外(VNIR)和短波红外(SWIR)数据,1350-1450 nm和1800-2000 nm附近通常为强水汽吸收带,需结合传感器波段范围进行剔除。
| 波段范围 | 常见问题 | 处理建议 |
|---|---|---|
| 350-400 nm | 大气散射严重,信噪比低 | 视情况剔除或保留用于气溶胶校正 |
| 1350-1450 nm | 水汽强吸收,信号几乎为零 | 直接剔除 |
| 1800-2000 nm | 水汽与CO₂吸收混合 | 直接剔除 |
| 传感器边缘波段 | 响应非均匀,存在条带噪声 | 根据SNR曲线截断 |
4.2 噪声平滑:提升光谱信噪比
核心原理:高光谱数据中的噪声主要包括随机热噪声、散粒噪声和固定模式噪声。噪声平滑的目标是在不破坏光谱吸收峰和吸收谷形状的前提下,抑制随机噪声。与普通图像平滑不同,高光谱平滑需要同时考虑空间邻域和光谱邻域两个维度。常用的方法包括空间域滤波(如高斯滤波、中值滤波)和光谱域滤波(如Savitzky-Golay卷积平滑)。
操作流程:
- 空间平滑:对每个波段图像单独进行3×3或5×5高斯滤波,去除空间随机噪声。注意窗口不宜过大,否则会模糊地物边缘。
- 光谱平滑:沿光谱维使用Savitzky-Golay滤波器,窗口长度通常取5-15个波段,多项式阶数取2-3阶。该方法通过局部多项式拟合,在平滑噪声的同时保留光谱峰谷的宽度和深度。
- 联合平滑:先做光谱平滑再做空间平滑,或采用三维滤波(如BM4D)同时处理两个维度,但计算量较大。
# Python伪代码示例:Savitzky-Golay光谱平滑
from scipy.signal import savgol_filter
import numpy as np
# 假设 data 为 (rows, cols, bands) 的高光谱数据
rows, cols, bands = data.shape
data_flat = data.reshape(-1, bands) # 展平为像素×波段
data_smooth = savgol_filter(data_flat, window_length=11, polyorder=3, axis=1)
data_smooth = data_smooth.reshape(rows, cols, bands)
4.3 归一化:消除量纲与光照差异
核心原理:高光谱数据中不同波段的辐射亮度值可能相差数个数量级(如蓝波段与热红外波段),且同一地物在不同光照条件下反射率存在整体偏移。归一化的目的是将数据缩放到统一尺度,使后续的统计分析和距离度量不受量纲和光照强度的影响。常用的归一化方法包括Min-Max缩放和Z-score标准化。
方法对比:
| 方法 | 公式 | 适用场景 | 注意事项 |
|---|---|---|---|
| Min-Max | (x - x_min) / (x_max - x_min) | 数据分布均匀,无极端异常值 | 对异常值敏感,需先剔除离群点 |
| Z-score | (x - μ) / σ | 数据近似正态分布,用于PCA等需要零均值的方法 | 保留数据分布形状,但不保证在[0,1]区间 |
| 向量归一化 | x / ||x||₂ | 光谱匹配、角度制图(SAM) | 消除整体亮度差异,保留光谱形状 |
4.4 数据降维:PCA与MNF的实战对比
核心原理:高光谱数据波段间高度相关,存在大量冗余。降维旨在寻找一个低维子空间,在保留主要信息的同时降低计算复杂度。主成分分析(PCA)基于全局方差最大化原则,通过协方差矩阵的特征分解,将原始波段投影到互不相关的主成分轴上。最小噪声分离(MNF)则进一步考虑了噪声协方差,通过两次主成分变换,使输出分量按信噪比(而非方差)排序,更适合噪声分布不均匀的高光谱数据。
操作流程(MNF):
- 噪声估计:使用差分法(如计算相邻像素的差值)估计噪声协方差矩阵CN。
- 白化变换:对CN进行特征分解,构造白化矩阵W,使噪声变为单位方差。
- 标准PCA:对白化后的数据计算协方差矩阵,进行标准PCA,得到MNF变换矩阵。
- 分量选择:观察MNF特征值曲线,选取特征值明显大于1的前k个分量(特征值≈1表示该分量以噪声为主)。
# MNF变换核心步骤(示意)
# 1. 估计噪声协方差
noise = diff(data, axis=0) # 空间差分近似
C_n = np.cov(noise.reshape(-1, bands).T)
# 2. 白化
eigvals_n, eigvecs_n = np.linalg.eigh(C_n)
W = eigvecs_n @ np.diag(1/np.sqrt(eigvals_n))
# 3. 白化后数据
data_white = data.reshape(-1, bands) @ W.T
# 4. 标准PCA
C_white = np.cov(data_white.T)
eigvals, eigvecs = np.linalg.eigh(C_white)
# 5. MNF变换矩阵
MNF_matrix = eigvecs.T @ W
案例拆解:某矿区高光谱数据(224波段,去除坏波段后剩180个)用于识别蚀变矿物。初始直接使用全部波段进行SAM匹配,分类精度为72%,耗时45分钟。经MNF降维后,前15个分量的特征值均大于1.5,累计信噪比贡献达95%。使用这15个分量进行分类,精度提升至81%,耗时仅3分钟。进一步分析发现,MNF的第3和第7分量分别对应了Al-OH吸收特征和Fe³⁺吸收特征,说明MNF在抑制噪声的同时有效保留了矿物诊断信息。相比之下,PCA的前15个主成分虽然方差贡献率高达99%,但分类精度仅为76%,原因是PCA保留了部分噪声方差,且全局方差最大的方向不一定对应矿物识别最有效的方向。
4.5 预处理流程总结与常见误区
一个完整的高光谱预处理流水线应遵循“先质量筛选,再噪声抑制,后尺度统一,最后降维”的顺序。坏波段去除是前提,噪声平滑是保障,归一化是桥梁,降维是效率提升的关键。四个步骤环环相扣,缺一不可。
| 步骤 | 核心目标 | 常用工具/方法 | 验证指标 |
|---|---|---|---|
| 坏波段去除 | 剔除无效波段 | SNR曲线、目视检查 | 保留波段数、SNR均值 |
| 噪声平滑 | 提高信噪比 | S-G滤波、中值滤波 | 平滑前后SNR提升量 |
| 归一化 | 统一尺度 | Z-score、Min-Max | 数据分布直方图 |
| 降维 | 去除冗余 | PCA、MNF | 特征值曲线、分类精度 |
通过本章的学习,学习者应能够独立构建一套适用于不同传感器(如AVIRIS、Hyperion、GF-5)的高光谱预处理流程,并能够根据具体应用场景(矿物填图、植被监测、目标探测)灵活调整各步骤的参数与策略。