3、高光谱数据预处理(一):辐射定标与大气校正(FLAASH、QUAC)、几何校正与正射校正
各位同学,欢迎来到高光谱数据预处理的第一讲。说实话,预处理这步看着不起眼,但我在项目里吃过不少亏。你想想看,原始数据就像一块刚从地里挖出来的璞玉,上面沾满了泥巴和杂质。你不把它洗干净、打磨好,后面再牛的分析算法也白搭。今天咱们就聊聊怎么把这堆「脏数据」变成能用的好东西。
3.1 辐射定标:把「灰度值」翻译成「物理量」
高光谱传感器拍下来的原始数据,其实是一堆DN值(Digital Number)。说白了,就是传感器内部记录的一个整数,跟地物真实的反射率还差着十万八千里。辐射定标要做的,就是把这个整数翻译成有物理意义的辐射亮度值。
公式很简单:
L = Gain × DN + Offset
其中Gain和Offset是传感器厂商提供的定标系数。不同传感器、不同波段,这两个值都不一样。我建议你拿到数据后,第一件事就是去查头文件或者元数据文件,把这两个系数找出来。
重要提醒:辐射定标是后续所有定量分析的基础。这一步做错了,后面大气校正、植被指数计算全都会偏。我在项目中遇到过有人跳过了这步,直接用DN值算NDVI,结果植被指数全是负的,折腾了两天才找到原因。
实际操作中,ENVI、ERDAS这些软件都有现成的工具。我个人习惯用ENVI的Radiometric Calibration工具,选好传感器类型,它会自动读取头文件里的定标系数。不过要注意,有些国产传感器的头文件格式不太标准,可能需要手动输入系数。
3.2 大气校正:把「雾里看花」变成「一目了然」
大气校正是预处理里最头疼的一步,也是我花时间最多的地方。为什么?因为太阳光穿过大气层到达地面,再反射回传感器,这一路上被大气分子、气溶胶、水蒸气吸收和散射得七荤八素。你看到的影像,其实是「地物信号」和「大气噪声」的混合体。
大气校正的目的,就是把大气的影响去掉,还原地物真实的地表反射率。常用的方法有两种:FLAASH和QUAC。我分别说说。
3.4.1 FLAASH:精度高,但参数多
FLAASH(Fast Line-of-sight Atmospheric Analysis of Spectral Hypercubes)是基于MODTRAN辐射传输模型的物理方法。它的原理比较复杂,但你可以简单理解为:它模拟了光线在大气中传播的整个过程,然后反推出大气参数,最后把大气影响从影像中扣除。
使用FLAASH需要输入以下参数:
| 参数 | 说明 | 获取方式 |
|---|---|---|
| 影像中心经纬度 | 影像的地理位置 | 头文件或元数据 |
| 传感器类型 | 如Hyperion、AVIRIS等 | 头文件 |
| 飞行日期和时间 | 用于计算太阳天顶角 | 元数据 |
| 大气模型 | 如热带、中纬度夏季、亚寒带等 | 根据纬度与季节选择 |
| 气溶胶模型 | 如乡村、城市、海洋等 | 根据区域特征选择 |
| 能见度 | 大气透明度指标 | 气象数据或经验值 |
我的经验:大气模型和气溶胶模型的选择,直接决定了校正效果。我曾经在华北平原做冬小麦监测,选了「中纬度冬季」大气模型,结果校正后的反射率曲线在近红外波段明显偏低。后来换成「中纬度夏季」模型(虽然当时是冬天,但那天天气晴朗、气溶胶少),结果就好多了。所以别死板,要根据实际天气状况灵活调整。
FLAASH的代码示例(ENVI IDL):
; 打开辐射定标后的影像
envi_open_file, 'calibrated_image.dat', r_fid=fid
envi_file_query, fid, dims=dims, nb=nb
; 设置FLAASH参数
flaash_params = { $
fid: fid, $
dims: dims, $
out_name: 'flaash_corrected.dat', $
sensor_type: 'Hyperion', $
flight_date: '2023-06-15', $
flight_time: '10:30:00', $
lat: 36.5, $
lon: 117.0, $
atm_model: 'Mid-Latitude Summer', $
aerosol_model: 'Rural', $
visibility: 40.0 $
}
; 执行FLAASH
envi_doit, 'flaash_doit', flaash_params
3.4.2 QUAC:快速但粗糙
QUAC(Quick Atmospheric Correction)是另一种大气校正方法。它不依赖辐射传输模型,而是直接从影像本身统计信息来估算大气参数。说白了,它假设影像里包含了各种地物(植被、土壤、水体等),然后利用这些地物的光谱特征来反推大气影响。
QUAC的优点很明显:速度快,不需要输入任何外部参数。缺点也很明显:精度不如FLAASH,尤其是在地物类型单一或者有大量阴影的区域。
避坑指南:我曾经在沙漠地区用QUAC做大气校正,结果反射率曲线在可见光波段出现了奇怪的波动。后来发现,沙漠影像里地物类型太单一(全是沙子),QUAC的统计假设不成立。所以,如果你做的是荒漠、水体或者城市密集区的研究,我建议还是老老实实用FLAASH。
QUAC的使用非常简单,在ENVI里直接点一下就行。代码示例:
; 打开影像
envi_open_file, 'calibrated_image.dat', r_fid=fid
; 执行QUAC
envi_doit, 'quac_doit', fid=fid, dims=dims, out_name='quac_corrected.dat'
3.3 几何校正与正射校正:把「歪七扭八」摆正
传感器在成像时,由于平台姿态变化、地形起伏、地球曲率等因素,影像里的地物位置跟实际位置会有偏差。几何校正就是把这些偏差纠正过来。
几何校正分两种:
- 几何粗校正:利用传感器自带的姿态参数(如GPS、IMU数据)进行校正。精度一般,但速度快。
- 几何精校正:利用地面控制点(GCP)进行校正。精度高,但需要人工选点,费时费力。
正射校正是几何校正的升级版。它考虑了地形起伏的影响,利用数字高程模型(DEM)把影像投影到正射投影面上。说白了,就是把山上的像素「拉」到它该在的位置。
关键点:对于高光谱数据,几何校正的精度直接影响后续的混合像元分解和地物分类。我建议你至少做正射校正,尤其是研究区域地形起伏较大的时候。我在云南山区做过一次实验,没做正射校正的影像,分类结果里山脊和山谷的边界错位了十几个像素,根本没法用。
几何校正的流程:
- 收集地面控制点(GCP),可以从野外实测、高精度地图或已有正射影像中获取。
- 选择校正模型,常用的有多项式模型、有理函数模型(RFM)等。
- 计算校正参数,利用最小二乘法求解。
- 重采样,把原始影像的像素值映射到校正后的网格上。常用的方法有最近邻法、双线性内插法、三次卷积法。
我的建议:重采样方法的选择要慎重。最近邻法速度快,但会破坏光谱的连续性;双线性内插法平滑了影像,但可能丢失细节;三次卷积法精度最高,但计算量大。对于高光谱数据,我一般用双线性内插法,它在光谱保真度和计算效率之间取得了平衡。
正射校正的代码示例(使用GDAL):
from osgeo import gdal
# 打开原始影像
src_ds = gdal.Open('original_image.dat')
# 打开DEM
dem_ds = gdal.Open('dem.tif')
# 设置正射校正参数
options = gdal.WarpOptions(
format='ENVI',
dstSRS='EPSG:4326',
rpc=True,
dem=dem_ds,
resampleAlg='bilinear'
)
# 执行正射校正
gdal.Warp('ortho_corrected.dat', src_ds, options=options)
3.4 本章知识体系
为了让你更直观地理解本章内容,我画了一张流程图,展示了高光谱数据预处理的核心逻辑:
这张图把整个预处理流程串起来了。你从原始DN值影像开始,先做辐射定标,然后根据需求选择FLAASH或QUAC做大气校正,最后做几何校正或正射校正。每一步的输出都是下一步的输入,环环相扣。
好了,这一章的内容就到这里。辐射定标和大气校正这块,我建议你多动手试试,拿几幅不同区域的影像跑一遍,对比一下校正前后的光谱曲线变化。只有亲手做过,才能真正理解这些参数的意义。