用ENVI 5.3.1做Landsat 8影像的辐射定标和大气校正,是每个搞遥感的人最早接触的一整套预处理流水线。不管你后面是要算植被指数、反演地表温度,还是做土地利用分类,这一步绕不过去。今天我把完整的实例操作、参数设置、容易踩的坑从头到尾捋一遍,包括Landsat 8 OLI数据的关键细节,顺带把MODIS卫星数据大气校正的差异也聊透,希望刚入门的同学看完就能照着做,不用再东拼西凑看十几篇文档。
这篇文章需要一点前置知识:你至少知道DN值、辐亮度、反射率这几个词大概是什么意思,知道ENVI是个遥感图像处理软件。如果你完全零基础,问题也不大,下面每个关键步骤我都会解释“为什么要这么做”,绝不让你只照猫画虎。
1. 预处理思路与整体流程设计
1.1 为什么Landsat 8数据必须做辐射定标
Landsat 8下载下来的Level-1数据,本质上是传感器记录的数字量化值,也就是DN值。这个DN值和地物真正的辐射能量之间,存在一个近似线性的关系,线性系数就写在MTL.txt文件里。传感器设计、增益调整、模数转换都会让DN值不等于地物反射的能量,所以第一步必须做辐射定标,把DN值还原成物理量——辐亮度或者表观反射率。
很多人觉得“我下载的已经是Landsat表面反射率产品了,不需要定标”,那是个误解。你自己从USGS下载的L1级产品,真正要处理归档级别,其实经常还是L1T,只有官方发布的L2表面反射率产品才省掉了这一步。日常做实验,还是习惯从L1开始自己控制全流程,因为L2产品的算法还在持续更新,处理细节未必符合你的研究需求,而且后面接FLAASH大气校正时,你本来就需要先拿到辐亮度或反射率中间数据。
1.2 大气校正到底在“纠正”什么
大气对太阳辐射的吸收和散射,会让传感器收到的信号里混杂着大气自身的贡献,这是辐射定标无法消除的。大气校正要解决的是三件事:大气分子散射、气溶胶散射、大气吸收(主要是水汽和臭氧)。你可以这样理解:透过有雾气的玻璃看窗外的树,玻璃上那层雾也是光的一部分,观感就是灰蒙蒙的。大气校正就是想办法把这层“雾”的程度估算出来,再从影像里减掉,顺带把被吸收掉的那部分能量补偿回来。
如果只做辐射定标不做大气校正,计算NDVI、阈值分割、多时相对比都会受到很大干扰。尤其是跨季节、跨地区的影像对比,太阳高度角、大气条件都不同,不含大气校正的反射率根本没可比性。这是定量遥感里最基础也最重要的认知。
1.3 两种主流大气校正方案对比:FLAASH与QUAC
ENVI里常用的大气校正工具主要是FLAASH和QUAC,自己写代码的话还有6S和MODTRAN。FLAASH基于MODTRAN辐射传输模型,物理机制严谨,参数多,效果好,是很多论文里的标准流程。QUAC则几乎不需要参数,直接用影像内典型地物的光谱特性估算大气参数,速度快,但精度不如FLAASH稳定,适合做快速浏览和不要求高精度定性分析的任务。
本篇文章选择FLAASH为主,因为Landsat 8的多光谱波段数完全满足FLAASH的运行要求,而且研究场景里大家对精度要求普遍更高。FLAASH虽然参数多,但只要吃透原理,其实没那么复杂。后面我也会拿MODIS数据的大气校正来对比说明参数设置差异。
2. 准备工作与核心文件解析
2.1 数据来源与文件清单
Landsat 8影像通常从USGS EarthExplorer下载,选的是Landsat Collection 2 Level-1产品,文件下载解压后是一大堆tif和txt。真正用得上的核心文件有这么几类:
- MTL.txt:唯一的“说明书”,包含了影像获取日期、中心太阳高度角、太阳方位角、定标系数、投影信息、卫星高度等一系列关键参数。
- 各波段GeoTIFF文件:LC08_L1TP开头的文件名,每波段的文件名末尾有波段号,比如_B2是蓝波段,_B5是近红外,_B10是热红外。
- 质量控制文件:标记云、云阴影等像元,预处理阶段可以不用,但后面做像元筛选很实用。
不同的数据版本定标系数形式会略有差异。Collection 2和早期Collection 1的MTL.txt字段就有区别,比如反射率定标字段的名称和分组不同。拿到数据先打开MTL.txt仔细看一眼,不要直接套用别人文章里的数字。
2.2 辐射定标系数怎么读取
辐射定标的核心是下面两个公式:辐亮度 L = ML × DN + AL,反射率 ρ = (Mρ × DN + Aρ) / cos(θs)。其中ML、AL是辐亮度增益和偏移,Mρ、Aρ是反射率增益和偏移,θs是太阳天顶角。这些系数全部在MTL.txt里,找RADIOMETRIC_RESCALING字段就行。
举个例子,Collection 2 Level-1的MTL.txt里会写:REFLECTANCE_MULT_BAND_2 = 2.0000e-05,REFLECTANCE_ADD_BAND_2 = -0.100000。如果你要手动算波段2的反射率,那就是2.0e-05乘DN再减0.1,最后除以cos太阳天顶角。这里的太阳天顶角不是太阳高度角,二者互余,别搞混。
在ENVI的辐射定标工具里,其实这些系数会自动读取,不需要你手动算。但手动走一遍公式有个好处——后续检查输出数据是否正常时,你能估算出反射率大概在什么范围,不会因为工具抽风输出一堆异常值还看不出来。
2.3 ENVI 5.3.1环境检查
打开ENVI 5.3.1后,先检查一下Toolbox里有没有Radiometric Correction和Atmospheric Correction这两个模块。FLAASH工具在Toolbox里叫做FLAASH Atmospheric Correction,如果找不到,多半是模块安装不全。
另外,处理较大影像前建议先确认电脑内存。Landsat 8多光谱波段全部加载进来,一个几十MB的Geo TIFF还好,但FLAASH跑起来会多个中间文件,数据量翻好几倍,内存不足会非常痛苦。我自己的习惯是先用File→Open打开MTL.txt,如果提示“Unknown File”,也不要慌,手动把各波段文件按顺序打开即可,MTL是给ENVI自动识别用的。
3. 辐射定标实操解析
3.1 Radiometric Calibration工具逐项设置
在ENVI 5.3.1中执行Radiometric Calibration,路径是Toolbox → Radiometric Correction → Radiometric Calibration。打开后选择你加载的Landsat 8多波段数据,注意一般只选可见光、近红外、短波红外这些光学波段,热红外波段是另一套定标逻辑,本篇文章不涉及。
弹出的Radiometric Calibration参数面板,核心选项是Calibration Type,下拉有Radiance和Reflectance两个选项。如果选Radiance,输出就是辐亮度影像,单位通常是W/(m²·sr·μm);如果选Reflectance,输出就是TOA表观反射率。
Output Interleave建议选BIL,FLAASH对输入数据的波段存储顺序有要求,BIL是最稳妥的选择。如果选BSQ也行,但后续使用不如BIL顺手。Output Data Type选Float,避免整型截断误差。Scale Factor这里先保留默认的1.0,后面会详细说。
3.2 为什么优先输出反射率再乘10000
很多教程写的是先输出辐亮度,再用Band Math换算单位,最后进FLAASH。这条路线本身没错,但坑点在于单位换算繁琐,容易乘错系数。Landsat 8在ENVI里输出的辐亮度单位通常是W/(m²·sr·μm),而FLAASH要求的输入辐亮度单位是μW/(cm²·sr·nm),两者换算不直观,网上很多资料写法不一,新手一不留神就错。
我平时更推荐直接走反射率路线:Radiometric Calibration面板里Calibration Type选Reflectance,Scale Factor填10000,输出就是反射率乘10000后的整数或浮点数据。FLAASH对输入数据提供两种支持方式,一种是直接输入辐亮度,另一种是输入反射率乘10000的影像,后者可以在FLAASH面板里明确选成“Reflectance”,完全不需要手动做单位换算,省掉一整个坑。
这个“乘10000”的本质是照顾整型存储,因为反射率正常范围是0到1,直接存整数就全变0了,乘以10000后,0.35的反射率就变成3500,精度和文件大小都合适。
3.3 定标结果怎么检查
辐射定标完成后,先别急着进FLAASH。用ENVI打开结果影像,把鼠标移到水面、裸土、植被这些典型地物上,看数值是否符合常识。比如植被区域在近红外波段的反射率×10000值应该明显高于红波段,如果绿得出奇,说明定标过程可能出了问题。
再一个是看影像的直方图,正常情况下反射率×10000数据分布不会全部挤在一个极端值附近。如果出现大范围0值或非常低的数值,检查太阳天顶角是否被正确计算了,有些数据版本的太阳高度角已经是天顶角,有些则是需要你用90°去减的高度角,一旦算反,整幅影像反射率水平就反了。
最后记得保存成ENVI Standard格式,FLAASH对输入数据格式有要求,GeoTIFF虽然能打开,但头文件信息不一定完整,转成.dat格式最稳。保存时务必勾选输出波长信息,FLAASH没有波长信息基本跑不起来。
4. FLAASH大气校正实操解析
4.1 输入数据准备与波段要求
FLAASH的入口在Toolbox → Atmospheric Correction → FLAASH Atmospheric Correction。打开后第一步就是选择输入文件,刚才辐射定标得到的反射率乘10000影像会成为主角。
FLAASH对输入数据有硬性要求:必须是BIL或BSQ的连序格式,必须有波长信息和FWHM(半高宽)字段,数据量纲如果是反射率,必须是反射率×10000的整型或浮点数据。如果你之前选了Output Interleave为BSQ,到这里也能用,但BIL更标准。
在校正的多光谱设置里,选哪些波段参与校正也很关键。对Landsat 8来说,最好把波段2到波段7都选上,也就是蓝、绿、红、近红外、短波红外1、短波红外2。传感器类型选择Landsat-8 OLI,如果版本里没有这个选项,就需要手动在波段列表中填入中心波长和FWHM,Landsat 8各波段的值网上都能查到。
4.2 关键参数设置:从MTL.txt里提取信息
FLAASH界面的Scene Parameters是重头戏。Scene Center Location填影像中心经纬度,你可以直接在地图上选,也可以从MTL.txt里的CORNER_UL_LAT_PRODUCT等字段推算。传感器类型选Landsat-8 OLI后,Flight Height会默认填好,但最好还是手动确认一下,Landsat 8轨道高度约705千米。
成像日期和成像时间必须和MTL.txt完全一致。DATE_ACQUIRED对应日期,SCENE_CENTER_TIME对应时间,格式要注意是UTC时间,不是本地时间。这里填错会导致太阳位置计算错误,大气校正结果出现系统性偏差,排查起来很隐蔽。
大气模式的选项有Tropical、Mid-Latitude Summer、Mid-Latitude Winter、Sub-Arctic Summer、Sub-Arctic Winter几个,按影像所在纬度和季节选。国内大部分中纬度地区,夏天选Mid-Latitude Summer,冬天选Mid-Latitude Winter。如果研究区在海南或广东南部这种低纬度区域,选Tropical更合理。
水汽反演选项里,Landsat 8没有水汽吸收波段,一般选No。气溶胶模型选中性常用Rural,海边或近海区域选Maritime,城市区域选Urban。气溶胶反演方法如果影像内有暗目标,比如浓密植被,就选2-band K-T,否则选None。初始能见度一般填40km,如果影像上明显有雾霾,可以改成20km甚至更低。
4.3 为什么不建议跳过Multispectral Settings
FLAASH面板里有一个Multispectral Settings按钮,很多人觉得麻烦就跳过了,这是不对的。如果气溶胶反演选2-band K-T,就需要在这里指定水汽吸收波段和K-T反演波段,通常用红波段和短波红外1波段。如果选None,那至少要把Water Absorption Feature选成No,并确认波长覆盖范围包含所有输入波段。
在这个面板里还可以做光谱平滑,也就是Spectral Smoothing。启动后输出结果的光谱曲线会更光滑,去除波段之间不合理的跳变。但对Landsat 8这种波段数不算多的传感器,平滑力度别太大,否则会把真实的光谱特征一并抹掉。条纹去除功能在本地无条带的Landsat 8数据上不需要开。
4.4 运行FLAASH并解读输出
所有参数设置完后,指定输出路径,FLAASH会先生成输入数据的缩放统计,接着运行MODTRAN辐射传输计算。这一过程通常几分钟到十几分钟,取决于影像大小和电脑性能。
输出的地表反射率影像数值同样被缩放,一般是0到10000的范围,代表反射率乘10000。打开结果后,植被光谱曲线应该呈现典型的红边特征,水体在近红外波段反射率极低,裸土曲线平滑没有剧烈尖峰。如果结果整体偏暗、偏绿,多半是大气模型选错或者气溶胶参数不合适,这时回到参数面板调整再跑一遍。
需要注意的是,FLAASH输出的是地表反射率而非辐射度,这意味着后期分类和指数计算直接基于这个反射率就行。不要再自己做辐射定标,也不要再把它当成TOA反射率来计算NDVI,否则口径全乱了。
5. 常见问题与实战排坑
5.1 Scale Factor和单位换算的坑
我见过不少人在辐射定标时直接选Radiance,然后想着“FLAASH需要辐亮度,那我直接输入就行”,结果FLAASH提示数据单位不对,或者跑出来的反射率全是负值。根本原因是W/(m²·sr·μm)和μW/(cm²·sr·nm)的换算没有做。
我在实操中更推荐反射率×10000路线,如果一定要用辐亮度,记得查清楚ENVI输出头文件里写的单位,再用Band Math做一个单位换算。这类问题特别隐蔽,因为软件不会报错,只是输出数值整体偏移,像这种情况,检查辐亮度量级是最快的判断方式。
5.2 波长文件和FWHM缺失
FLAASH报告“Wavelength file not found”或者“Zero width”的报错,很大概率是辐射定标输出时没有把波长信息写入头文件。解决办法是打开头文件编辑窗口,手动添加wavelength和fwhm字段。Landsat 8的光谱响应参数可以在ASD光谱库或USGS官网查到。
一个小经验:FLAASH运行前一定会读取输入数据的头文件,如果从GeoTIFF直接转换的.dat文件缺失波长,添加时要用纳米为单位,比如482属于可见光蓝波段,不能写成0.482微米,否则自动识别会错乱。
5.3 输出结果偏色、负值和条纹怎么处理
大气校正结果发绿,常见原因是大气模型选成Tropical但又处在中高纬地区,水汽估算偏差大,导致绿波段被过度补偿。此时回到Scene Parameters重新选大气模式,再跑一次。
出现负值像元的原因通常有两个:一是原影像有云或厚气溶胶,FLAASH在暗像元上反演失败;二是气溶胶反演方法选的是2-band K-T,但暗像元波段指定错误。前者只能在预处理阶段用云掩膜去除,后者需要检查Multispectral Settings中的波段编号是否对应正确。
条纹问题主要出现在Landsat 7和部分高光谱数据上,Landsat 8本身很干净,如果出现,多半是传感器故障或数据处理问题,建议直接检查原始数据的QC波段,排除坏扫描线。
5.4 与MODIS卫星数据大气校正的对比参考
说到MODIS卫星数据大气校正,很多同学也会遇到。MODIS L1B数据处理的逻辑和Landsat 8完全一致,但要先读取自带的定标系数,而不是MTL.txt。MODIS有36个波段,可以覆盖从可见光到热红外的极宽范围,FLAASH对MODIS的支持是内置的,但处理前需要把波段子集切到可见光-短波红外范围,并去掉几个不参与反演的大气窗口波段。
MODIS数据的空间分辨率本身较低,做大气校正时对气溶胶参数非常敏感,尤其在水体区域,用错气溶胶模型会让近红外反射率出现大面积负值。实际操作中,我一般会对比MODIS官方表面反射率产品MOD09GA,如果FLAASH结果和官方产品差异超过15%,说明参数设置有不合理的地方,需要回头检查。
另外,MODIS数据还涉及几何校正,因为L1B是未几何精校正的条带数据,要先投影到目标坐标系再进入FLAASH,否则后面按坐标提取反射率会错位。这部分和Landsat 8直接使用L1T产品有本质区别。
6. 结语:几条个人实操体会
我做Landsat 8大气校正的次数很多,最想说的一点是:不要小看预处理。辐射定标和大气校正做得好不好,直接影响后期反演和分类精度,而且这种影响不是肉眼能发现的,很多人把整个流程跑完,结果看着挺正常,但NDVI数值比真实值低了一大截,回头查才发现是大气校正参数填错了。
实操中最常被我叮嘱学生的三件事:第一,MTL.txt里的时间、经纬度、太阳天顶角一定要逐项核对,参数错了重跑的代价远大于细节检查的功夫;第二,优先走反射率×10000再进FLAASH这条路径,少绕弯,少出错;第三,每次跑完FLAASH顺手记录一个像元的地表反射率光谱,和典型地物光谱对比一下,养成这个习惯,你会比同级人早半年发现参数问题。
最后再分享一个效率技巧:把常用的FLAASH参数组合保存成模板文件,下次遇到同一区域、同一季节的影像,直接调模板再改日期,能省不少时间。希望这篇实例操作能帮你少走点弯路,把这个遥感入门的硬骨头啃下来。