资讯动态

哨兵2 L1C 大气校正实战:FLAASH 数据准备与参数设置全流程

发布时间:2026/10/20 9:00:57 来源:尧图企业网站定制
简介面向遥感数据处理初学者与Sentinel-2影像使用者这份资料整理了一套经实测可用的ENVI大气校正完整流程覆盖从哨兵2 L1C数据打开、辐射定标到FLAASH大气校正的关键环节。资源包共1个docx文档约515KB以图文步骤说明为主适合按流程查阅和对照操作。目前已有9753人学习/下载被广泛用于哨兵2数据预处理的参考。内容详细讲解了Sentinel-2 L1C辐射率定标工具的基本原理、安装方式ENVI App Store与手动安装及参数含义包括10m/20m/60m波段输出方案、缩放系数、重采样方法与输出命名规则等并针对ENVI 5.3/5.4不同版本的使用差异和常见问题给出排错思路同时补充了60m数据FLAASH关键参数设置示例亲测可用能帮助读者少走弯路独立完成大气校正并提升数据精度。1. 哨兵2大气校正不是玄学先搞清楚 FLAASH 在等什么数据哨兵2大气校正这件事卡住大多数人的从来不是 ENVI 界面而是不知道先把 L1C 数据整理成 FLAASH 想要的样子。L1C 是大气顶部反射率里面混着大气散射和吸收信号直接拿去做 NDVI 或地物分类结果会随着成像日期和天气状况漂移。FLAASH 用辐射传输模型把这层大气干扰剥离掉输出才是能跨影像比较的地表反射率。这篇整理把完整流程拆成六步原理确认、波段合并、归一化、裁剪、FLAASH 参数表、结果验证每步都是亲测可用的操作特别适合用 ENVI 处理哨兵2 L1C 的学生和一线从业者直接照着抄。2. 原理先行L1C、L2A 与 FLAASH 的三条工作前提2.1 L1C 与 L2A 的本质区别很多人下载哨兵2数据时只看到 L1C 和 L2A 两个选项以为差一个字母只是处理程度的区别实际差了一整套大气剥离流程。L1C 是辐射定标后的表观反射率像元值范围在 0 到 10000 之间代表的是传感器在大气顶部接收到的信号里面同时包含地表反射、大气分子散射、气溶胶散射和水汽吸收的叠加。L2A 则是已经完成大气校正的地表反射率产品像元值范围同样是 0 到 10000但物理含义已经是地面真实反射特性直接用即可。为什么不能用 L1C 直接算 NDVI我拿一个典型场景说明夏季晴空下气溶胶会把可见光波段的大气路径辐射抬高导致红波段反射率虚高NDVI 被压低而水汽吸收又会让近红外波段偏暗NDVI 被抬高。两个误差方向不一致最终算出来的植被指数在不同日期之间没有可比性。做单景目视解译影响不大一旦要做多时相变化监测或跨区域对比误差就变成系统性偏差。对比项L1CL2A数据级别大气顶部表观反射率地表反射率像元值范围0~10000对应反射率 0~100%0~10000对应反射率 0~100%是否可直接做定量分析不可以受大气干扰明显可以对用户的意义需要自己做大气校正开箱即用网上有些教程让 L2A 再跑一遍 FLAASH这是典型的重复劳动还会把本来正确的地表反射率二次污染千万别跟。2.2 FLAASH 的工作原理与输入约束FLAASH 是基于辐射传输模型的大气校正模块它不是简单做减法而是根据成像日期、经纬度、大气模型、气溶胶模型等参数先模拟出光在大气中传播时的散射和吸收过程再反推出地表反射率。这个思路决定了它有严格的输入偏好第一数据必须按波长升序排列第二像元值必须是浮点反射率单位是 0 到 1 或 0 到 100 的区间不能是整型第三文件排列方式最好是 BIL 格式这样读取速度最快错误也最少。我见过不少人直接把 ENVI 读出来的 L1C 原始文件往 FLAASH 里丢结果模块要么拒绝识别要么输出结果整体偏灰。原因很简单原始 L1C 是 UInt16 整型数FLAASH 拿到手的第一件事是按浮点数解析整型数据的位数会让它误判为辐射亮度输出的反射率自然失真。2.3 FLAASH 需要的三项前提信息在动手准备数据之前有三个信息必须先拿到后面每一步参数设置都依赖它们。第一是中心经纬度FLAASH 需要它确定太阳角度和大气路径长度第二是成像时刻精确到小时分钟秒而且必须是 GMT 时间第三是地面平均高程如果是山地复杂地形最好带一个 DEM 文件进去。这三个信息在哨兵2 L1C 产品包里都能找到位置分散但格式统一。中心经纬度可以在 ENVI 打开数据后通过 Raster Metadata 看到成像时间藏在 MTD_MSIL1C.xml 文件里地面高程可以用 ENVI 自带的高程数据填。后面第 5 章会给一段提取时间的小脚本手动抄时间容易抄错用脚本最稳。3. 数据准备三步走波段合并、归一化与数据类型转换3.1 选哪些波段B10 卷云波段剔除与波长顺序哨兵2 MSI 传感器一共 13 个波段但不是每个波段都适合参与 FLAASH 大气校正。B1 是 60 米分辨率的 coastal aerosol 波段B9 是水汽反演波段B10 是 60 米分辨率的卷云波段中心波长在 1375 纳米附近这个位置水汽吸收极强地表信号基本被淹没是专门用来识别高空卷云的。把 B10 放进 FLAASH 会让辐射传输模型在短波红外段出现异常拟合输出波段会出现明显条带噪声所以处理的第一步就是剔除它。参与大气校正的波段建议按下表取舍顺序严格按照波长升序排列波段中心波长纳米原始分辨率是否参与校正B249010 米参与B356010 米参与B466510 米参与B570520 米参与B674020 米参与B778320 米参与B884210 米参与B8A86520 米参与B11161020 米参与B12219020 米参与B144360 米一般不参与B994560 米暂不参与B10137560 米必须剔除常见的误操作是把 B8A 和 B8 搞混顺序它们中心波长只差 23 纳米但 FLAASH 按波长建模时会把错误波长的光谱响应套到对应波段上结果近红外平台形态异常。所以合并前一定要检查波段顺序别凭感觉排。3.2 用 Layer Stacking 合并波段检查完波段清单后先把 20 米波段的影像重采样到 10 米再统一做 Layer Stacking。这个顺序很重要如果先合并再重采样ENVI 的 Resize Data 会对整个多波段文件做重采样两套网格的定位误差会被放大到波段之间造成空间错位。重采样在 ENVI 里用 Raster Management 菜单下的 Resize Data设置输出像元尺寸为 10 米重采样方法选最近邻。最近邻不会生成新的像元值曲线最大程度保留原始光谱统计特性适合后续做定量大气校正。之后打开 Raster Management 下的 Layer Stacking把 B2、B3、B4、B5、B6、B7、B8、B8A、B11、B12 按这个顺序逐个加进去。输出时注意把 Interleave 设为 BIL数据类型先保持默认后面归一化时会统一处理。Layer Stacking 做完后可以用 ENVI 的数据管理器查看波段序列表确认当前波段顺序和上表一致再继续。3.3 反射率归一化Band Math 一行表达式L1C 的像元值范围是 0 到 10000FLAASH 需要的是 0 到 1 或 0 到 100 的浮点反射率。这一步直接用 Band Math 做除法表达式如下float(b1) * 0.0001用 Band Math 对话框打开合并后的多波段文件把上面的表达式填进去点击 OK 后输出文件名带 _refl 后缀数据类型在输出选项里选 Float Single。这里有一个非常关键的细节表达式里必须有 float(b1)不能直接写 b1 * 0.0001。因为 L1C 原始数据类型是 UInt16 整型Band Math 对整型输入做浮点乘除后如果没显式声明浮点类型输出会被强制取整结果整个文件所有波段全部变成 0什么信息都看不到。我一开始也踩过这个坑折腾了大半天才发现是 float 括号的问题。; 错误写法输出全是 0 b1 * 0.0001 ; 正确写法输出为浮点反射率 float(b1) * 0.0001归一化完成后用 ENVI 的 Quick Stats 工具随便检查一个波段统计值应该在 0 到 1 之间均值大约在 0.03 到 0.15 这个量级。如果最大值大于 1说明原始数据里可能有云或雪等亮目标这属于正常情况FLAASH 会在辐射传输计算里自动处理不需要手动裁剪。4. 裁剪与像元总量控制别让 FLAASH 在等待中卡死4.1 为什么全幅 10 米数据不能直接丢进 FLAASH哨兵2 L1C 产品一个分幅大约覆盖 290 公里宽的条带即使不考虑重叠区全幅 10 米分辨率处理下来也有上亿个像元。FLAASH 在处理时需要为每个像元都保存辐射传输模型的计算中间量像元数一旦超过几千万量级内存占用会翻倍增长轻则处理到一半弹出内存不足重则直接卡死需要强制结束进程。我的经验是把参与校正的单景像元总数控制在 3000 万左右超过这个量级先做裁剪。不要觉得裁剪会丢失信息大气校正本身是逐像元的光谱运算和邻近像元无关只要裁剪框覆盖完整的研究区就行。在动手之前可以先用一段小脚本估算一下文件体积做到心里有数rows 15000 # 裁剪后的行数 cols 15000 # 裁剪后的列数 bands 10 # 参与校正的波段数 pixels rows * cols bytes_per_pixel 4 # float32 单精度 per_band_mb pixels * bytes_per_pixel / (1024 * 1024) print(f总像元数: {pixels:,}) print(f单波段体积: {per_band_mb:.0f} MB) print(f10 波段总体积: {per_band_mb * bands / 1024:.1f} GB)这段脚本只做体积估算像元数超过 3000 万的时候单波段 float32 数据大约是 120 MB10 个波段加起来 1.2 GB 左右FLAASH 处理这种量级勉强能跑再往上就很容易出问题。4.2 用 Subset Data 裁剪研究区裁剪的操作路径在 ENVI 里是 Raster Management 下的 Subset Data。打开归一化后的 _refl 文件Subset Data 面板会显示整幅影像的行列数直接在 Spatial Subset 里输入研究区的行列范围或者用鼠标在预览图上框选。框选时注意给研究区留出至少 200 米的外扩缓冲这样大气校正边缘的像元不会因为地形或云影产生太大的边界效应。如果研究区形状不规则可以先用 ROI Tool 画矢量范围通过 Subset Data via ROI 裁剪。我习惯保留矩形范围因为 FLAASH 对非矩形的 ROI 数据支持不如矩形稳定某些版本会报维度不匹配的错误。裁剪输出时保持 Interleave 为 BIL数据类型已经在上一步变成了 float32这里不需要再改。4.3 十米与二十米波段的统一策略在第 3 章里提到重采样要在合并前完成这里再展开说一下参数。20 米波段的 B5、B6、B7、B8A、B11、B12 要重采样到 10 米在 Resize Data 面板里需要设置两个关键值输出像元尺寸 x 和 y 都设为 10 米重采样方法选 Nearest Neighbor。有人为了追求平滑用双线性内插这个选择在目视上好看但会改变原始像元的光谱值分布对后续定量反演不友好。最近邻重采样不产生新数值只是把像元网格对齐到 10 米分辨率上这才是大气校正该用的策略。还有一点是关于 B8A 和 B8 的几何对齐这两个波段虽然一个来自 20 米目录一个来自 10 米目录但经过重采样后它们应该在同一个网格原点。Layer Stacking 完成后可以在 Display 工具里叠加显示两个波段如果出现错位说明之前重采样时输出坐标系的投影参数不一致需要回到 Resize Data 检查输出坐标系是否与原始数据一致常见做法是保持系统默认的 UTM WGS84 投影参数不变。5. FLAASH 参数设置翻车现场传感器、时间与模型参数逐项对表5.1 传感器类型识别与光谱响应文件FLAASH 的初始界面第一个要填的就是 Input Radiance Image选择裁剪好的 _refl 文件。随后界面会要求选择传感器类型较新版本的 ENVI 里可以直接找到 Sentinel-2 MSI 选项选上之后它会自动带出中心波长和光谱响应数据。如果手里是旧版本没有这个选项不要慌选 Generic Multispectral在 Spectral 选项卡里手动填入每个波段的中心波长和半波宽。中心波长按第 3 章的表格填半波宽可以从哨兵2 的官方波段定义文档里查到填完保存成谱段文件下次导入直接用。我见过有人直接用 ENVI 自带的 Landsat 8 响应文件替代这是严重错误哨兵2 的波段位置和带宽跟 Landsat 差异很大输出结果的红边光谱会明显失真。5.2 成像日期、GMT 时间与中心经纬度用 XML 脚本代替肉眼抄写FLAASH 界面里日期和时间的格式敏感度很高日期填错了太阳高度角算错大气校正的结果偏亮或偏暗而且这类错误非常隐蔽不容易看出来。手动在 MTD_MSIL1C.xml 大文件里翻时间很容易看错行我用一段小脚本自动提取直接转换成 FLAASH 需要的格式。import xml.etree.ElementTree as ET from datetime import datetime xml_path rD:\s2\MTD_MSIL1C.xml root ET.parse(xml_path).getroot() start stop None for elem in root.iter(): tag elem.tag.rsplit(}, 1)[-1] if tag PRODUCT_START_TIME: start elem.text elif tag PRODUCT_STOP_TIME: stop elem.text print(start:, start) print(stop :, stop) fmt %Y-%m-%dT%H:%M:%S.%fZ t1 datetime.strptime(start, fmt) t2 datetime.strptime(stop, fmt) mid t1 (t2 - t1) / 2 print(flight date:, mid.strftime(%Y/%m/%d)) print(flight time GMT:, mid.strftime(%H:%M:%S))脚本遍历 XML 里所有标签忽略命名空间前缀找到起止时间后取中间时刻作为 FLAASH 的飞行时间。这个中间时刻的逻辑是哨兵2 L1C 产品记录的是整条条带的扫描起止影像中心像元的实际成像时间约等于起止时刻的中点用中点时间做太阳角度计算误差最小。中心经纬度在 ENVI 里查看更加直接打开裁剪前的原始数据在 Raster Metadata 里能看到中心点的经纬度坐标单位是十进制度直接填进 FLAASH 的 Lat/Lon 输入框。注意经纬度的正负号规则北纬东经为正南纬西经为负填反了整个辐射传输计算的方向全错。5.3 大气模型与气溶胶模型怎么选大气模型的选择依据是成像时的纬度和月份不需要把诗词里那套四季理解放进来直接按下面的对应关系选纬度范围月份推荐大气模型0°~30°全年Tropical30°~60°5 月~9 月Mid-Latitude Summer30°~60°其他月份Mid-Latitude Winter大于 60°夏季Mid-Latitude Summer大于 60°冬季Sub-Arctic Winter气溶胶模型则按研究区的地表类型选城市及工业区选 Urban农业区或自然植被区选 Rural干旱荒漠区域选 Desert沿海区域选 Maritime。拿不准的时候选 Rural它对应中纬度陆地最普遍的气溶胶组分误差相对可控。5.4 水汽反演、初始能见度与高级设置水汽反演一栏我大多数场景下选 None。哨兵2 虽然有 B9 水汽波段但它是 60 米分辨率参与 FLAASH 水汽反演时需要额外的重采样和掩膜处理如果只是做地表反射率水汽反演对可见光和近红外波段的结果影响有限反而会增加计算时长。初始能见度的默认值是 40 公里对应比较晴朗的大气状况。如果影像上有明显雾霾或薄云把能见度调到 20 到 30 公里之间校正后的反射率会更合理。这个参数可以多试两次第一次看输出结果如果整体偏低就把能见度调低它是 FLAASH 里最需要人工干预的参数。高级设置里把 Tiled Processing 打开Tile Size 设成 1024这个设置能把大影像拆成小块分步计算避免内存溢出。Multiscatter Model 用 DISORT精度更高虽然会慢一些但结果更可靠。Spectral Polishing 可以勾上它会做相邻波段的平滑去噪不过要注意它会削弱细小的光谱吸收特征如果之后要做矿物填图或叶绿素荧光分析这个选项要关闭。5.5 常见问题排查现象、原因、解决现象一FLAASH 跑完输出文件全是 0。原因是 Band Math 归一化时少了 float()UInt16 数据被取整所有反射率变成 0。解决方法是回到第 3.3 节用 float(b1) * 0.0001 重新归一化。现象二处理到一半内存不足或直接卡死。原因是没裁剪像元总数超出 FLAASH 能承载的量级。解决方法是按第 4 章裁剪到 3000 万像元以内同时打开 Tiled Processing。现象三输出结果整体偏灰反射率普遍偏低。原因是初始能见度设置过高模型认为大气太干净把实际较浑浊的大气散射全部当成了地表信号反射率被压低。解决方法是把 Initial Visibility 从 40 调到 25 左右重新运行对比两次结果选择更合理的。现象四输出影像出现明显条带短波红外波段最严重。原因是把 B10 卷云波段参与了大 气校正水汽吸收段的反演结果不稳定。解决方法是回到第 3 章把 B10 从波段清单里剔除后再做 Layer Stacking。现象五20 米波段与 10 米波段在同一位置出现重影或模糊。原因是 20 米波段没有先重采样到 10 米就直接合并两套像元网格没有对齐。解决方法是回到第 3.2 节用最近邻法重采样后再合并。6. 结果验证技巧用光谱剖面和官方 L2A 对照校准FLAASH 跑完不是终点输出影像能不能直接用于定量分析要先过验证这一关。我习惯用两个方法第一个是看光谱剖面形态第二个是对比官方 L2A 数据。打开校正前的 L1C 影像和校正后的 _refl 影像在 ENVI 里同时显示用 Spectral Profile 工具在同样的植被区域取一个点。校正前的曲线在红边位置过渡平缓近红外平台偏低红波段吸收谷不明显校正后植被的典型特征是绿光波段有一个小反射峰红波段深度吸收红边快速抬升近红外波段保持高平台。如果校正后的曲线还是平缓无起伏说明大气校正根本没有把散射路径辐射去除干净。定量对比用官方 L2A 产品更直接。L1C 和 L2A 地理范围一致直接在同一坐标位置读取反射率值做差。我一般取三个典型地物植被、裸土、水体每个采样点读一个 3×3 像元均值对比结果控制在反射率差小于 0.02 基本可以接受。如果差值超过 0.05优先检查成像时间和大气模型是否匹配这两个参数是误差的最大来源。做完验证还有一个习惯值得长期保留把这次用到的所有参数截图或保存成模板包括大气模型、气溶胶模型、能见度、传感器类型下次处理同区域同季相的数据时直接套用只需要更新成像时间和经纬度。从那以后我每次跑完 FLAASH 都强制走一遍这个流程先看 XML 里的时间、先重采样、先归一化、先裁剪最后再开 FLAASH再没出过方向性错误。希望这套完整流程也能帮你少走几次弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑