
简介这份资源围绕哨兵2号Sentinel-2数据的大气校正展开面向从事遥感影像处理的科研人员、测绘与地信专业学生及工程技术人员重点解决L1C大气表观反射率产品在ENVI中难以正确辐射定标、进而无法顺利开展FLAASH大气校正的问题。资源包内共1个docx文档约515KB以图文笔记形式整理了从辐射率定标工具安装、参数设置到大气校正的完整流程并附有原理公式与参数说明。内容涵盖ENVI App Store与手动安装两种方式、10米4波段/20米9波段/60米11波段三种定标方案、Scale Factor与重采样方法等关键参数解释以及ENVI5.3与5.4版本兼容性、数据格式补丁等排错思路便于读者对照操作、快速复现。目前已有9750人学习下载适合需要系统掌握哨兵2大气校正流程、查漏补缺的初、中级遥感用户参考。1. 从一张“灰蒙蒙”的哨兵2影像说起如果你拿到的 Sentinel-2 L1C 数据直接打开大概率会觉得颜色发灰、对比度低植被不够绿、水体不够清——这不是数据坏了而是它还没做大气校正。L1C 是大气顶层反射率TOA传感器收到的信号里混着气溶胶散射、水汽吸收、瑞利散射等“大气噪声”。要把这些干扰剥掉拿到地表反射率BOA就得走大气校正这一步。ENVI 里的 FLAASH 和 QUAC 是两个最常用的模块前者基于 MODTRAN 辐射传输模型精度高但参数多后者是快速经验法适合先看效果。这篇笔记整理的是 Sentinel-2 L1C 在 ENVI 里做大气校正的完整流程从数据准备、波段映射、参数填写到结果验证每一步都给出可复现的操作和参数依据适合刚接触遥感预处理的新手照着走也适合已经用过 ENVI 但总在 FLAASH 参数上翻车的熟手对照排查。2. 数据准备与波段映射为什么不能直接拖进 FLAASH2.1 哨兵2 L1C 的数据结构决定了预处理方式Sentinel-2 L1C 产品在下载后通常是一个 SAFE 文件夹里面包含MTD_MSIL1C.xml、GRANULE子目录、IMG_DATA里的 JP2 格式波段文件以及QI_DATA里的质量波段。ENVI 从 5.3 版本开始支持直接打开 SAFE 文件夹但直接打开后得到的是一个多波段数据集波段顺序和 FLAASH 期望的输入顺序并不一致。FLAASH 要求输入的是辐射亮度数据单位是 μW/(cm²·sr·nm)而 L1C 的 JP2 波段默认是 TOA 反射率整数缩放所以第一步必须做辐射定标把 DN 值转成辐射亮度。常见做法是在 ENVI 里用Radiometric Calibration工具选择 Sentinel-2 的元数据文件它会自动读取增益和偏移量。但这里有个坑ENVI 的自动识别有时会把波段顺序搞乱尤其是当 SAFE 文件夹里同时存在 10m、20m、60m 三种分辨率时。我一般会先手动确认波段列表再决定是否重采样。2.2 用 ENVI 打开 SAFE 并检查波段顺序打开 ENVI选择File Open As Optical Sensors Sentinel-2 Sentinel-2 SAFE定位到解压后的.SAFE文件夹。ENVI 会列出所有波段包括 10m 的 B2、B3、B4、B820m 的 B5、B6、B7、B8A、B11、B12以及 60m 的 B1、B9、B10。注意 B10 是卷云波段FLAASH 不需要它但有些自动流程会把它塞进去导致后续波段映射错位。# 以下为 ENVI 波段顺序检查的伪代码逻辑实际在 ENVI GUI 中操作 # 打开 SAFE 后在 Layer Manager 里查看波段列表 # 期望的 FLAASH 输入波段顺序按波长递增 # B1 (443nm), B2 (490nm), B3 (560nm), B4 (665nm), # B5 (705nm), B6 (740nm), B7 (783nm), B8 (842nm), # B8A (865nm), B9 (945nm), B11 (1610nm), B12 (2190nm) # 注意B10 (1375nm) 卷云波段不参与大气校正逻辑说明FLAASH 需要知道每个波段对应的中心波长如果顺序错了它会把 665nm 的红光当成 842nm 的近红外去算气溶胶结果就是整张影像的植被指数全乱。参数上ENVI 的 Sentinel-2 元数据读取器通常能自动填对波长但如果你用的是手动导入的 JP2 文件就必须在Edit Header里逐个核对Wavelength字段。2.3 辐射定标把 JP2 的整数转成物理量在 ENVI 工具箱里找到Radiometric Correction Radiometric Calibration输入文件选择上一步打开的多波段数据集。在参数面板里Calibration Type选RadianceOutput Interleave选BILFLAASH 对 BIL 支持最好Output Data Type选Float32。缩放因子保持默认的 0.1 或 1.0 都可以关键是输出单位要匹配 FLAASH 的要求。# 如果用 ENVI 的 IDL 命令行批处理等效命令如下 envi_doit, RadiometricCalibration, $ input_raster sentinel2_l1c.dat, $ output_raster_uri sentinel2_radiance.dat, $ calibration_type Radiance, $ output_interleave BIL, $ data_type 4 ; 4 对应 Float32参数说明data_type 4是 ENVI 里 Float32 的枚举值写错会变成整型导致辐射亮度的小数部分被截断。output_interleave BIL是因为 FLAASH 内部按行处理BIL 格式的 I/O 效率最高。定标完成后用Statistics Compute Statistics看一眼直方图正常辐射亮度值应该在 0 到几百之间如果出现大量负值或超过 10000说明增益偏移读错了。3. FLAASH 参数填写每个输入框背后的物理含义3.1 输入辐射亮度数据与波段波长映射打开Radiometric Correction Atmospheric Correction Module FLAASH Atmospheric Correction。Input Radiance Image选上一步定标后的 BIL 文件。接下来会弹出Input Radiance Image的波段映射对话框这里要手动把每个波段和 FLAASH 期望的波长对应起来。ENVI 通常会自动填充但 Sentinel-2 的 B8A 和 B9 经常被漏掉或错位。# FLAASH 波段映射的检查清单在 GUI 中逐项核对 # 波段索引 - 中心波长(nm) - 对应 Sentinel-2 波段名 # 1 - 443 - B1 # 2 - 490 - B2 # 3 - 560 - B3 # 4 - 665 - B4 # 5 - 705 - B5 # 6 - 740 - B6 # 7 - 783 - B7 # 8 - 842 - B8 # 9 - 865 - B8A # 10 - 945 - B9 # 11 - 1610 - B11 # 12 - 2190 - B12逻辑说明FLAASH 用这些波长去查 MODTRAN 的大气透过率和散射查找表。如果 B8A865nm被误标成 842nm水汽吸收带附近的校正就会偏差。参数上Wavelength单位是纳米Full Width Half MaximumFWHM填 Sentinel-2 各波段的光谱带宽通常 ENVI 会自动带出但 B1 和 B9 的 FWHM 较宽手动确认一下更稳妥。3.2 传感器高度、像元大小与飞行日期在 FLAASH 主面板里Sensor Type选UNKNOWN或Sentinel-2取决于 ENVI 版本Sensor Altitude填 786000单位米Sentinel-2 轨道高度约 786km。Ground Elevation填影像区域的平均海拔如果不知道就填 0但山区影像建议用 DEM 算一下否则气溶胶反演会偏。Pixel Size填 10、20 或 60取决于你输入的是哪个分辨率的波段——FLAASH 不支持混合分辨率输入所以定标前最好把 20m 和 60m 波段重采样到 10m或者统一用 20m。# 用 ENVI 的 Layer Stacking 工具统一分辨率 # 选择所有需要的波段Resampling 选 Nearest Neighbor保持光谱值不变 # 输出像元大小设为 10 或 20 envi_doit, LayerStacking, $ input_rasters [b2_10m.dat, b3_10m.dat, b4_10m.dat, b8_10m.dat, $ b5_20m.dat, b6_20m.dat, b7_20m.dat, b8a_20m.dat, $ b11_20m.dat, b12_20m.dat, b1_60m.dat, b9_60m.dat], $ output_raster_uri sentinel2_stacked.dat, $ resampling Nearest Neighbor, $ pixel_size 20.0参数说明Nearest Neighbor不改变原始像元值适合大气校正前的重采样如果用Bilinear或Cubic光谱曲线会被平滑影响 FLAASH 对吸收特征的判断。pixel_size 20.0是折中方案因为 10m 波段只有四个20m 波段有六个统一到 20m 能保留最多波段。3.3 大气模型与气溶胶反演参数Atmospheric Model根据影像的纬度和季节选。常见选项有Mid-Latitude Summer、Mid-Latitude Winter、Tropical、Sub-Arctic Summer等。如果你不确定用Mid-Latitude Summer作为默认值误差通常在可接受范围内。Aerosol Model选Rural或Urban城市区域选Urban植被区选Rural。Aerosol Retrieval选2-Band (K-T)这是最常用的方法需要指定两个波段通常用 660nm 和 2100nm 附近的波段对应 Sentinel-2 的 B4 和 B12。# FLAASH 气溶胶反演的关键参数 # Aerosol Retrieval: 2-Band (K-T) # K-T Upper Band: 2190 nm (对应 B12) # K-T Lower Band: 665 nm (对应 B4) # Initial Visibility: 40 km (默认值清洁天可设 60-80雾霾天设 10-20) # 如果影像里有水体可以勾选 Water Retrieval 来辅助气溶胶估计逻辑说明K-T 方法利用两个波段的地表反射率关系来反演气溶胶光学厚度。B4 和 B12 的组合在植被和裸土上表现稳定但在雪地或亮沙地上容易失效。参数上Initial Visibility只是迭代起点FLAASH 会自动调整但如果影像整体偏暗或偏亮可以手动改一下加速收敛。Water Retrieval对沿海影像有用内陆影像可以关掉。3.4 输出设置与多光谱文件生成在Output面板里Output Reflectance File填一个.dat路径Output Directory for FLAASH Files选一个临时目录FLAASH 会在里面生成中间文件。Output Scaling Factor默认是 10000意思是把反射率乘以 10000 存成 16 位整型方便后续在 ENVI 里显示。如果你要做定量反演建议改成 1.0 并输出 Float32避免缩放带来的精度损失。# FLAASH 输出设置示例 # Output Reflectance File: sentinel2_boa.dat # Output Scaling Factor: 10000 (默认适合目视解译) # 或 1.0 (适合定量分析输出 Float32) # Output Directory for FLAASH Files: /tmp/flaash_work参数说明Output Scaling Factor设成 10000 后反射率 0.5 会存成 5000显示时 ENVI 会自动拉伸。如果设成 1.0反射率就是 0.5直方图范围在 0 到 1 之间更适合做 NDVI 等指数计算。Output Directory要保证有足够磁盘空间FLAASH 的中间文件可能有好几个 GB。4. 避坑与排查FLAASH 报错和结果异常的常见原因4.1 报错 “ACCURACY” 或 “MODTRAN” 相关现象点击运行后ENVI 弹出FLAASH error: ACCURACY not reached或MODTRAN execution failed。原因通常是输入波段数太多或太少或者波长映射里有重复值。FLAASH 要求至少 3 个波段且波长必须严格递增。如果 B8A 和 B8 的波长填成了同一个值MODTRAN 就会报错。解决回到波段映射对话框逐个核对波长确保没有重复且波段数在 3 到 20 之间。4.2 结果影像出现大面积负值或条纹现象大气校正后的反射率影像上出现黑色条纹或负值区域。原因可能是辐射定标时增益偏移读错或者 FLAASH 的气溶胶反演在亮地表上失效。解决先检查定标后的辐射亮度直方图如果最小值远小于 0说明定标参数有问题如果定标正常尝试把Aerosol Retrieval改成None手动指定Visibility或者换用QUAC快速验证。4.3 植被区域反射率曲线异常现象校正后植被在 680nm 附近的吸收谷不明显或者 780nm 附近的反射峰被削平。原因通常是波段映射错位比如把 B4665nm和 B5705nm的顺序搞反了。解决在 ENVI 里用Spectral Profile工具取一个植被像元看光谱曲线是否符合健康植被特征——在 665nm 有低谷在 842nm 有高峰。如果曲线平滑得不像植被就是波段顺序错了。4.4 处理速度极慢或卡死现象FLAASH 运行几个小时没进度或者 ENVI 无响应。原因可能是输入影像太大或者Output Interleave不是 BIL。FLAASH 对 BIL 格式的 I/O 效率最高如果是 BSQ 或 BIP会慢很多。解决在辐射定标时就把输出格式设成 BIL并且把影像裁剪到研究区范围不要整景处理。如果内存不足可以在 ENVI 的Preferences里调大缓存。4.5 校正后影像颜色仍然发灰现象FLAASH 跑完了但影像看起来还是灰蒙蒙的对比度没提升。原因可能是Output Scaling Factor设成了 10000而 ENVI 的显示拉伸没跟上。解决在 Layer Manager 里右键图层选Stretch Type Linear或者手动把直方图范围拉到 0 到 10000。如果还是灰检查一下是不是用了QUAC而不是FLAASH——QUAC 的输出反射率范围通常更窄需要手动拉伸。5. 结果验证与进阶技巧用 NDVI 和光谱曲线判断校正质量5.1 用 NDVI 快速判断大气校正是否有效大气校正的最终目的是让地表反射率更接近真实最直观的验证就是算 NDVI。校正前TOA的 NDVI 通常偏低因为大气散射会压缩植被在近红外的反射峰。校正后健康植被的 NDVI 应该在 0.6 到 0.9 之间水体在 0 以下裸土在 0.1 到 0.3 之间。在 ENVI 里用Band Math输入(float(b4)-float(b3))/(float(b4)float(b3))注意波段索引要对应校正后的 B4 和 B3。# ENVI Band Math 表达式计算 NDVI # 假设校正后影像的波段顺序为 B1,B2,B3,B4,B5,B6,B7,B8,B8A,B9,B11,B12 # B4 是第 4 波段B3 是第 3 波段 ndvi (float(b4) - float(b3)) / (float(b4) float(b3)) # 在 Band Math 里直接输入 # (float(b4)-float(b3))/(float(b4)float(b3))逻辑说明float()强制转换是为了避免整型除法截断。如果校正后 NDVI 仍然大面积低于 0.3说明气溶胶反演可能偏了或者波段映射有误。参数上NDVI 的阈值不是绝对的不同植被类型有差异但健康森林和农田的 NDVI 通常明显高于 0.5。5.2 光谱曲线对比校正前后到底差在哪在 ENVI 里同时打开 TOA 和 BOA 影像用Spectral Profile取同一个植被像元把两条曲线画在一起。校正前的曲线在蓝光波段443nm、490nm明显偏高因为瑞利散射对短波影响最大校正后蓝光反射率会降下来红光吸收谷更深近红外平台更平。如果校正后蓝光反而升高说明气溶胶模型选错了比如在清洁天选了Urban气溶胶。# 用 ENVI 的 Spectral Profile 对比校正前后 # 1. 打开 TOA 影像用 ROI Tool 画一个植被 ROI # 2. 打开 BOA 影像加载同一个 ROI # 3. 在 Spectral Profile 里同时显示两条曲线 # 4. 检查 443nm 和 490nm 处 BOA 是否低于 TOA参数说明ROI 要选在均匀植被区域避免混合像元。如果 BOA 在 443nm 处比 TOA 还高检查Aerosol Model是不是选成了Urban而实际是Rural。另外Initial Visibility设得太低也会导致过度校正。5.3 批量处理用 ENVI Modeler 或 IDL 脚本自动化如果你有几十景 Sentinel-2 要处理手动点 FLAASH 不现实。ENVI Modeler 可以把辐射定标、层堆叠、FLAASH、NDVI 串成一个流程但 FLAASH 的参数在 Modeler 里需要手动映射比较麻烦。更稳的方式是写 IDL 脚本调用envi_doit的FLAASH任务。下面是一个简化框架实际使用时需要根据 ENVI 版本调整参数名。; IDL 批量 FLAASH 处理框架需根据 ENVI 版本调整 pro batch_flaash compile_opt idl2 envi, /restore_base_save_files envi_batch_init, /no_status_window ; 输入文件列表 radiance_files [scene1_rad.dat, scene2_rad.dat] for i 0, n_elements(radiance_files)-1 do begin rad_file radiance_files[i] boa_file boa_ file_basename(rad_file) envi_doit, FLAASH, $ input_raster rad_file, $ output_raster_uri boa_file, $ sensor_type UNKNOWN, $ sensor_altitude 786000.0, $ ground_elevation 0.0, $ pixel_size 20.0, $ atmospheric_model Mid-Latitude Summer, $ aerosol_model Rural, $ aerosol_retrieval 2-Band (K-T), $ kt_upper_band 11, $ ; B12 在堆叠后的索引 kt_lower_band 3, $ ; B4 在堆叠后的索引 output_scaling_factor 10000.0 endfor envi_batch_exit end逻辑说明kt_upper_band和kt_lower_band是波段索引不是波长值所以必须和堆叠后的波段顺序一致。sensor_altitude单位是米pixel_size单位是米。如果报错说参数名不对查一下 ENVI 安装目录下的tasks文件夹里面有针对当前版本的 FLAASH 任务定义。批量处理时建议先跑一景验证参数再放开跑全部否则一错全错后悔药都没得吃。5.4 一个容易被忽略的细节卷云波段和 cirrus correctionSentinel-2 L1C 的 B10 是卷云波段1375nmFLAASH 有一个Cirrus Correction选项可以勾选并指定 B10 作为卷云波段。如果影像上有薄云勾选后能减轻卷云对地表反射率的影响。但 B10 的分辨率是 60m需要重采样到和输入波段一致。我一般会在层堆叠时把 B10 也加进去然后在 FLAASH 里指定它这样薄云区域的校正效果会好很多。不过如果影像完全无云这个选项可以关掉省点计算时间。5.5 最后一点个人习惯我做完大气校正后一定会做两件事一是用 NDVI 直方图看整体分布二是取几个典型地物植被、水体、裸土的光谱曲线和已知的参考曲线比一下。如果 NDVI 直方图出现双峰或者异常拖尾说明校正有问题得回去查参数。这个习惯帮我省了很多返工时间也让我对 FLAASH 的脾气越来越熟。希望帮到你。本文还有配套的精品资源点击获取