ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Landsat 8遥感影像预处理:ENVI 5.3.1辐射定标与FLAASH大气校正实操

Landsat 8遥感影像预处理:ENVI 5.3.1辐射定标与FLAASH大气校正实操 1. 先弄清楚这步预处理到底在干什么最近好几个做遥感的朋友私信问我说拿到Landsat 8的影像之后直接用ENVI 5.3.1做分类结果地物反射率算出来怎么都对不上实测值植被指数曲线也是乱的。我一问十个里面有八个跳过了辐射定标和大气校正这一步。这其实是一个非常典型的误区Landsat 8 Level-1T产品给到你的还是原始DN值这个DN值不是地表真实反射率它里面混着太阳高度角、大气散射、传感器响应等多重因素。你不把这些因素去掉后面的NDVI、水体提取、土地利用分类全都会偏。这篇文章就是一次完整的实例操作记录环境是ENVI 5.3.1数据源是Landsat 8 OLI/TIRS的Level-1T产品核心内容就两块辐射定标和大气校正。我会把每一步的参数设置、背后的原理逻辑、以及我反复试过之后得出的避坑经验全部写出来。适合谁看正在做本科或硕士论文、需要自己处理遥感影像的同学以及刚接触遥感预处理、想把流程跑通又不想走弯路的研究人员和工程师。先说明一点我整套操作里没有用任何其他第三方插件全部是ENVI 5.3.1自带的Radiometric Calibration和FLAASH模块。所以只要你电脑上装了正版或者教育版的ENVI 5.3.1就能照着文章一步步复现。操作系统方面我在Windows 10上跑的ENVI 5.3.1在Windows 7到Windows 11上表现都稳定内存建议至少8GB如果影像很大建议16GB起步不然跑FLAASH那一步会等得让人抓狂。1.1 为什么必须做辐射定标和大气校正很多人会问Landsat 8的数据不是已经做过几何校正了吗对Level-1T确实做了几何校正但辐射方面的处理它只做到L1级也就是只是把原始数据整理成了规范的DN值格式。这个DN值的大小和地物本身的反射特性之间隔着一道复杂的数学关系。用一个生活化的例子来类比你把一件白衬衫放在正午太阳下拍照和放在阴天拍照照片上这件衬衫的亮度值相当于DN值是完全不同的但你心里清楚衬衫本身没变。遥感的辐射定标和大气校正就是要把这种环境光干扰去掉还原出衬衫本来的颜色。辐射定标解决的是传感器响应问题把DN值转换成传感器入瞳处的辐射亮度值或者表观反射率大气校正解决的是大气散射、吸收、路径辐射的问题把入瞳处的信号转换到地表真实反射率。这一步不做你的NDVI算出来可能整体偏低水体提取时山体阴影和浑浊水体混在一起分不开做多时相变化检测时还会因为不同日期影像的大气状态不同而产生虚假变化。尤其是在做定量遥感反演的时候比如反演叶面积指数、地表温度、气溶胶光学厚度辐射定标和大气校正就不是可选项而是必选项了。即使你只是做定性分类我个人的建议也是至少把辐射定标做了因为很多分类算法的阈值和训练样本是在反射率空间里定义的直接拿DN值喂进去很容易出问题。1.2 你手里的Landsat 8数据该用到哪些文件在动手操作之前先把数据准备齐。这里我以USGS EarthExplorer下载的Landsat 8 OLI/TIRS C2 L1产品为例下载解压后你会看到一个以LC08开头的文件夹里面最核心的是这几个东西首先那个以_MTL.txt结尾的元数据文件这是整个预处理的钥匙。ENVI的辐射定标和FLAASH大气校正全靠读这个文件来获取参数比如太阳高度角、太阳方位角、各波段的增益和偏置、成像日期时间等。千万别手动改这个文件也别给它改文件名我就见过有人为了图方便把MTL.txt改名成data.txt结果ENVI死活读不出参数。其次各波段的GeoTIFF文件。OLI传感器的9个波段是分开存的文件名里会有波段编号比如_B2.TIF是蓝波段、_B3.TIF是绿波段、_B4.TIF是红波段、_B5.TIF是近红外以此类推。这里我特别提醒一句ENVI 5.3.1在把多波段影像合成一个文件时不要直接用File Open As Landsat那个方式在5.3.1里对C2级别产品的兼容性不太好我更推荐先把B2到B7这几个波段单独打开然后用Layer Stacking合成或者直接在辐射定标和大气校正的对话框里用Select按钮把几个波段一起选进去。最后是质量评估波段BQA文件。这个文件标注了每个像元的云、云影、冰雪、水体等质量信息在做大气校正之前先看一眼这个文件判断一下研究区影像的云覆盖情况。如果云量超过10%我建议换个日期重新下载因为FLAASH大气校正对云的容忍度其实很低云和云影区域的反射率反演出来基本是废的后期还得费劲做掩膜。2. 辐射定标实操把DN值变成物理量辐射定标这一步在ENVI 5.3.1里非常成熟工具位置也好找。菜单栏点Radiometric Correction下面会出来Radiometric Calibration这个选项。在开始之前有一个我踩过的坑要先说关闭你当前打开的所有波段图像或者至少确认当前活动窗口是你要处理的Landsat 8影像。ENVI这个工具在很多版本里对当前活动窗口有依赖如果同一个文件被打开了多次它默认处理的是你最后一次点击的那个窗口经常有人在这儿弄混处理完了一看输出结果发现处理的是隔壁影像。2.1 ENVI 5.3.1里辐射定标工具怎么调打开Radiometric Calibration工具后第一步是选择输入文件。这里有两种方式一是直接用Open File选择已经打开的影像文件二是用Open External File选择磁盘上的GeoTIFF。我推荐用第二种因为ENVI 5.3.1读取外部文件时会自动带入坐标系和投影信息不容易出乱子。选好文件之后你会看到一个设置面板里面有几个关键的选项。首先是Calibration Type这个选项让你选择定标的输出类型。默认的是Radiance辐射亮度值单位是W/(m²·µm·sr)。如果你后续要做的是地表温度反演选Radiance就对了如果你要做植被指数、土地分类那直接在辐射定标这步选Reflectance表观反射率会更省事。但这里我给出我的建议做大气校正之前就选Radiance。原因后面讲FLAASH的时候再说简单说就是FLAASH需要辐射亮度作为输入而且它自己内部会做反射率转换你提前转了反而可能引入二次处理的误差。其次是Output Interleave这个指的是输出文件的数据排列方式。BSQ、BIL、BIP三种格式ENVI默认用BSQ我建议你保持默认。虽然BIP在处理某些像元级分析时更快但后续FLAASH和大多数波段运算工具对BSQ的兼容性最好。我试过用BIP跑FLAASH有的版本会在读取文件时报Input file has invalid interleave的错误排查了半天最后发现是这个问题。然后是Scale Factor。这里有两个数值0.1和1.0这个选项是ENVI 5.3.1处理Landsat 8 Collection 2数据时容易让人懵的地方。C2产品的反射率和辐射亮度缩放因子官方规定是0.00001和0.1ENVI工具里的Scale Factor选项会自动读取MTL文件里对应波段的Radiance Mult和Radiance Add实际上你现在选0.1还是1.0影响的主要是输出数据是否自动换算成更小的整数范围。我的建议是选0.1这样输出的辐射亮度值量级在0到几十之间后面在FLAASH里检查曲线时看着更直观内存占用也更小。2.2 那几个参数到底该怎么选选完上述参数后还有一个Output Data Type输出数据类型要注意。ENVI默认输出为Float浮点型我强烈建议保持这个默认。因为辐射定标是把整型DN值乘以一个带小数的增益系数结果天然是浮点数如果你为了省空间强行改成Integer就会损失精度而且那些负值或者极小的值会被截断后面的计算就全错了。另一个选项是Output Filename和Output Directory这里是让设置输出文件的路径和名字。我建议所有预处理文件集中放在同一个文件夹里文件名用你记忆方便且不带中文的命名规则。比如我习惯用LC08_xxx_rad.dat表示辐射定标输出用LC08_xxx_flaash.dat表示大气校正输出。文件名带中文在ENVI 5.3.1的某些版本里会有编码问题虽然大部分时候没事但一旦报错找不到文件就够你折腾半天了。设置完成后点OKENVI会弹出处理进度条。处理速度取决于你的影像大小和电脑配置。一个标准的Landsat 8整景影像大约170km x 185km在8GB内存的机器上大概需要一两分钟。处理完成后主窗口会显示定标结果。你在Display里打开它拉伸方式设为2% Linear仔细看视觉效果是否和原始影像基本一致只是亮度和色调上有合理变化。如果出现大面积黑白噪点或条纹说明定标参数有问题需要回头检查。2.3 定标后的结果怎么验证辐射定标做完不能直接拿去干活得先验证一下结果对不对。验证方法其实很简单就是读取几个纯地物像元的辐射亮度值和Landsat官方手册里的典型区间对照一下。在ENVI里把定标后的影像加载出来用Cursor Value工具在工具栏上有个十字准星图标点击水体和裸地的像元看一下读数。以Landsat 8的第四波段红波段中心波长0.655µm为例对于一般的内陆清洁水体辐射亮度值大约在5到15 W/(m²·µm·sr)之间对于干燥的裸土或者城市不透水面可以在30到60之间如果读数出现上千量级的那一定是你Scale Factor选错了或者输入文件选到了热红外波段。这里顺便说一句很多初学者会不小心把TIRS热红外波段Band 10、Band 11和OLI光学波段一起选进去做辐射定标这会导致后续FLAASH直接报错或者结果离谱。热红外波段的定标方法和光学波段不同FLAASH也不接受热红外波段参与大气校正。另一个验证方法是对比DN值变化趋势。辐射定标本质上是线性变换所以定标前后影像的空间纹理和相对亮度关系应该完全一致。你在定标前记录几个典型像元的DN值比如一个亮目标DN12000一个暗目标DN3000那么定标后的辐射亮度值亮目标除以暗目标得到的比值应该基本等于12000除以3000误差在千分位级别是正常的。如果这个比值明显变了要么是增益系数没读对要么是你中间手动做了一些额外的拉伸或裁剪操作。3. 大气校正实操FLAASH模块的完整设置辐射定标做完接下来就是重头戏大气校正。ENVI 5.3.1里的大气校正工具有三种FLAASH、QUAC和Dark Subtraction。我这次用的是FLAASH它是基于MODTRAN辐射传输模型开发的精度最高也是学术论文里最常用、审稿人最认可的方法。QUAC虽然使用门槛低不需要输入太多参数但它本质上是一种经验算法精度和适用性都有限。我的建议是如果你的目标是要发表论文或者做一些定量分析老老实实用FLAASH。在工具栏里点击Spectral Atmospheric Correction Module FLAASH第一个跳出来的窗口是输入文件选择。这里需要注意FLAASH的输入必须是辐射定标后的辐射亮度数据不能是反射率数据也不能是原始DN值这个我在前面已经强调过了。选择好文件后ENVI会让你设置输入数据的参数包括Data Type数据类型、Scale Factor等。因为我们在辐射定标时已经选了辐亮度值并用了Scale Factor0.1所以这里Data Type选FloatScale Factor一般设为1即可那个数值是用于把单位换算成FLAASH期望的µW/(cm²·nm·sr)ENVI会自动处理。3.1 FLAASH的核心原理和参数依据FLAASH为什么需要你填那么多参数因为它要在辐射传输方程里求解大气对信号的影响。简单说传感器接收到的辐射能量L可以写成这样一个关系它大致等于地表反射的太阳辐射经过大气衰减后的贡献加上大气自身发射的路径辐射再加上周围环境散射进入传感器的贡献。FLAASH的目的就是基于MODTRAN里预设的大气模型通过你提供的成像时间、位置、海拔、气溶胶类型等信息反算出大气参数然后从观测信号中把地表反射率解出来。所以每填一个参数本质上你都是在告诉FLAASH那一天那一刻、在哪个地方、什么样的天气状况下拍的。 参数填得越准解出来的地表反射率越接近真实值。反之如果你随手乱填比如把成像日期填错了半年太阳高度角差个二十度那FLAASH输出的反射率曲线可能会整体偏移或严重扭曲而且你从结果上是很难肉眼判断出来的这才是最危险的。3.2 六个关键参数逐一拆解第一个参数是Input Radiance Scale Factors输入辐亮度缩放系数和Output Reflectance Scale Factors输出反射率缩放系数。前者如果选1意味着你输入的辐射亮度单位为µW/(cm²·nm·sr)如果你前面选了Scale Factor0.1那么实际值的量级是W/(m²·µm·sr)和µW/(cm²·nm·sr)之间刚好差一个因子ENVI一般在读取时会自动换算。保险的做法是在输入文件选完后点一下Edit标签查看ENVI识别到的转换关系确认没有数量级的错误。我上次给一个学生排查就发现他输入的辐亮度数值整体偏小了1000倍结果所有反射率反演出来都是0.001级别整个影像黑漆漆一片。第二个参数是输出反射率文件名的设置。这里有一个小技巧勾选Output Reflectance File时把文件命名为_ref.dat顺手也勾选上Output Diagnostic File诊断文件和Output Flat File平坦文件。诊断文件里会记录FLAASH运行过程中的各种中间参数和回归统计出了问题时这个文件是你排查的第一手资料。平坦文件则起到一个像元值均匀性的参考作用对于判断影像是否存在条带问题很有用。第三个参数是中心点经纬度Lat Lon和传感器高度Sensor Altitude。中心点经纬度会根据你输入影像的地理信息自动加载通常不用手动改。但传感器高度要特别注意Landsat 8的轨道高度大约是705公里这里单位是km所以填705就对了。千万别把这个和航拍无人机的参数搞混有人填了个0.7FLAASH直接认为传感器在地表附近MODTRAN计算完全错乱。第四个参数是成像日期和过境时间Flight Date和Flight Time GMT。Landsat 8过境的时间是当地时间上午十点左右但MTL文件里给的时间是UTC世界标准时间FLAASH要求填的是GMT时间也就是UTC千万不要按当地时间填。这个信息在MTL文件里找有专门的一行写着DATE_ACQUIRED和SCENE_CENTER_TIME。填错时间的后果是太阳天顶角计算错误进而导致大气路径辐射估算错误最终反射率会整体偏差。第五个参数是大气候类型和大气模型。Landsat 8全球覆盖FLAASH里给了六种大气模型从Sub-Arctic Winter到Tropical。选什么模型依据是你成像时研究区的纬度、季节和地表状况。中纬度夏季一般选Mid-Latitude Summer我国大部分地区春夏秋三季都适用北方冬季选Sub-Arctic Winter。这个选择对结果影响很大因为不同模型的温湿度廓线差异直接决定大气水汽含量、气溶胶散射特性进而影响每个波段的透过率。你说我拿不准选哪个一个偷懒但有效的办法是查一下成像当天的气象数据或者直接看研究区的植被茂盛程度和季节特征来判断。第六个参数是气溶胶模型和多光谱气溶胶反演。气溶胶类型通常有Rural乡村型、Urban城市型、Maritime海洋型和Tropospheric对流层型。这要看你研究区的下垫面特征来定。城市地区选Urban植被覆盖好的郊区和农田选Rural沿海地区选Maritime。这个参数同样要尽量贴近实际因为它决定了气溶胶的散射相函数和单次散射反照率。然后勾选Multispectral Aerosol Retrieval这个选项会利用OLI影像本身的多个波段来自动反演气溶胶光学厚度和大气水汽含量比手动输入更准。如果研究区里有深水或浓密植被区域这个反演效果会更好因为它们在大气校正后几乎不反射近红外是很好的暗目标。3.3 运行后的检查与精度判断所有参数填好后点OK运行。FLAASH处理一景Landsat 8全波段影像大概要跑10到30分钟这个时间取决于你的电脑CPU核心数和影像大小。在进度条走完之后先不看结果图直接看输出诊断文件。里面会有一段文字记录水汽反演结果、气溶胶光学厚度AOD等参数。正常的AOD值一般在0.05到0.8之间如果你在比较干净的地区成像AOD在0.1左右是合理的如果AOD反演出来是负值或者大于2那基本说明输入参数有问题需要用前面的方法逐个排查。然后打开大气校正后的反射率文件检查两个地方一是典型地物的反射率光谱曲线。找一个清洁水体的像元用Spectral Profile工具查看它的反射率曲线正常水体的近红外波段反射率应该非常低一般在2%以下而且曲线整体是随波长增加的衰减趋势。二是检查红波段和近红外波段的散点图。在二维散点图工具里把红波段设为X轴、近红外设为Y轴植被像元应该呈现出一个明显的向下弯曲的鹰钩形态这个形态反映了植被在红波段强吸收、近红外强反射的特征。如果散点图变成一条直线或者乱成一团那大气校正基本失败了。4. 我在实际操作中踩过的坑讲完完整流程下面这部分是我最想分享的内容。说实话这些坑每一个都是我或者身边同事在操作中真实遇到过的有些在文档里根本查不到只能靠自己一点点试出来。我整理成几条最常见的你对照着排查会省很多时间。4.1 常见报错和解决办法先说报错MTL file not found或者Unable to read metadata。这个问题的90%原因是你把MTL文件和波段文件放在不同的文件夹或者改了文件名。ENVI在读取Landsat 8影像时会自动在同级目录找MTL文件一旦找不到就会中断。解决办法是把MTL.txt和所有波段TIF放在同一个文件夹里保持文件名原样不动。还有个小概率原因是MTL文件编码格式问题有的系统下载下来是UTF-8的ENVI 5.3.1对UTF-8 with BOM的支持不太好用记事本打开另存为ANSI编码就能解决。再说一个非常常见的FLAASH运行到一半报错Error: Aerosol retrieval failed或者Water column retrieval failed。这个报错的核心原因是气溶胶反演算法找不到足够的暗像元。解决办法有以下几种一是把Aerosol Retrieval从Multispectral改为None手动输入一个AOD值。这个值怎么定呢你可以查一下成像当天附近气象站的气溶胶观测数据或者用同区域其他时相的FLAASH反演结果作为参考一般取0.1到0.3之间是比较安全的。二是检查你的输入影像是否包含云和云影覆盖严重的区域如果整个影像超过三分之一被云和云影占据气溶胶反演算法很容易失败。三是有时候把选择的波段范围缩小一些也能缓解比如只用B2到B5进行气溶胶反演。还有内存不足类的报错Out of memory在ENVI 5.3.1里也很常见尤其是在处理整景Landsat 8全波段数据时。解决的思路是给ENVI分配更多的可用内存但首先要确认你电脑本身物理内存够用。如果只有8GB内存我建议在ENVI的Preferences里把Cache Size调大比如调到3GB但不要超过物理内存的一半。另外一个更有效的办法是分块处理先只制定B2-B7这六个波段做大气校正不要一次把全波段和热红外都加上处理完再用Layer Stacking合成。这样既省内存速度也快不少。还有一个隐蔽的问题ENVI提示Data range is not consistent with expected values。出现这个报错多半是输入文件的辐亮度值范围和FLAASH预期不匹配。检查方法是用Cursor Value读几个像元的颜色值看是否在0到100的合理区间。如果读出来是几百上千甚至几万那大概率是你辐射定标时把Scale Factor选成了1.0而不是0.1导致数据没有正确换算。回到辐射定标那一步重新处理一遍就行。4.2 几个容易忽略但很关键的小细节第一个小细节是关于波段顺序。FLAASH会按照你输入的波段波长顺序来处理数据而Landsat 8的波段顺序在ENVI 5.3.1里有时会被打乱尤其是你用不同方式打开影像时。我在做第一次FLAASH时就是因为波段顺序不对结果出来的反射率光谱曲线整个形状是反的。检查方法很简单在FLAASH参数面板里会显示每个波段的中心波长你对照一下Landsat 8的官方波段表确认波段顺序从蓝到短波红外的排列是B2、B3、B4、B5、B6、B7波长依次是0.48、0.56、0.65、0.86、1.61、2.2。如果顺序不对必须在输入文件选择窗口里手动调整波段顺序。第二个小细节是热红外波段的问题。Landsat 8的OLI有9个波段TIRS有两个热红外波段Band 10、11。很多教程会告诉你直接把全部波段一起做校正但在ENVI 5.3.1的实践里FLAASH对TIRS波段的处理算法和光学波段不同而且在气溶胶反演和暗目标选择时热红外波段完全帮不上忙反而经常引发报错。我的实操习惯是辐射定标时也只选OLI的B2-B7这六个波段热红外波段单独用Radiometric Calibration处理一次后续做地表温度反演时单独用。这样做不仅FLAASH跑得快还少很多莫名其妙的错误。第三个小细节是注意研究区位置。如果你研究区处于Landsat 8影像的边缘那里的观测几何和前视后视方向差异会比较大FLAASH的精度会受到一定影响。一般来说Landsat 8的幅宽是185公里中心区域60公里以内的大气校正精度比较高如果你研究区在影像边缘建议考虑用两景影像拼接后分别校正或者检查FLAASH输出的圆滑指数和诊断信息确认结果质量可接受。第四个小细节和最新的相关工作有关有些同行会拿MODIS卫星数据的大气校正结果来和Landsat 8做交叉验证。MODIS的MOD09GA产品就提供了经过大气校正的地表反射率数据空间分辨率是500米。当你手头没有地面实测光谱时可以下载同一天、同一区域的MOD09GA数据把Landsat 8大气校正后的反射率聚合到500米尺度和MOD09GA对应波段的反射率做对比。如果两者的误差在5%以内那你的大气校正基本是可靠的。这个方法我多次使用非常有说服力论文里写与MOD09GA产品交叉验证均方根误差低于X%也更让人信服。5. 一个可以让你少跑两遍的批处理技巧如果你手里不只有一景Landsat 8影像而是有七八景甚至更多比如做时间序列分析或者大范围制图一景一景手动操作会累死人。ENVI 5.3.1提供了Batch处理批处理能力但其实没大多数人想的那么复杂它本质上就是把你刚才手动操作的流程录制下来然后循环跑。具体做法是在ENVI经典界面里打开Batch Build Batch File菜单新建一个批处理文件然后把你之前做辐射定标和大气校正的流程按顺序加进去。ENVI 5.3.1的批处理不支持直接录制宏所以你要在流程向导里重新选择工具和设置参数。每个工具对应一个节点节点之间的输入输出文件要衔接好即辐射定标的输出文件路径要作为大气校正节点的输入路径填进去。这里我想提醒一个关键点批处理时所有影像的成像时间、中心经纬度、大气模型等参数都会沿用你设置的第一景的参数。但对于不同日期的Landsat 8影像太阳高度角和成像时间是不同的如果你直接用一套参数去跑不同时间的影像大气校正结果会有系统性偏差。我个人的做法是先按成像日期把影像分组同一天的影像用一套参数批处理不同天的分别处理。这样既保留了批处理的高效率又避免了参数不匹配的问题。批处理过程中如果某一景影像因为云量大或者其他原因处理失败Batch Log会记录错误信息但不会中断整个流程。跑完之后把日志文件打开筛选出含有Error或者Warning的行单独对这些失败的影像重新处理。这个工作流我现在几乎每周都在用处理几十景影像也就是一晚上的事非常稳定。我在实际使用中还有一个体会ENVI 5.3.1的批处理对文件路径很敏感所有输入输出路径最好都用英文而且目录层级不要超过三四层。我走过一次弯路把输出目录放在了中文名字的文件夹下面批处理跑到第三景就报错了检查了半天才发现是路径字符编码的问题。换成纯英文路径之后一次跑完整批影像也没有再出过岔子。
返回列表