资讯详情

资讯详情

国产卫星遥感影像定标系数与光谱响应函数处理指南

简介面向卫星遥感数据处理、GIS应用与生态环境监测人员这份资源集成了国产高分GF与资源ZY系列多颗卫星的绝对辐射定标系数和光谱响应函数为传感器DN值转辐射亮度/地表反射率、大气校正及地表参数反演提供关键参数。包内共94个文件、约1.85MBtxt和json记录各载荷的定标系数与光谱响应参数xls/xlsx存放光谱响应函数表doc/pdf整理历年定标系数说明jpg为元数据示例整体按“1定标系数”“2光谱响应函数”分类组织便于快速定位。内容覆盖GF-1/2/4/6、ZY-3、ZY1-02C、HJ-1A/B等主流国产卫星含2011—2019年多期外场定标系数JSON格式可直接融入现有处理流程和6S辐射传输模型常用于农业、林业、环保等遥感应用研究。已有156人学习下载适合遥感科研人员、开发者和学生开展辐射定标、反射率反演与遥感应用系统搭建。1. 定标系数和光谱响应函数处理国产遥感影像绕不开的第一道坎前阵子帮人处理一批 GF-1 WFV1 影像做地表反射率反演结果算出来整体比实测低了差不多 0.04。一开始以为是大气校正参数选错了折腾了两天才发现问题出在定标系数用错了年代。这种乌龙在国产卫星数据处理里太常见了——影像大家都会下载真正决定结果上限的反而是这些几百 KB 的定标系数和光谱响应函数。这份资料把 GF、ZY、HJ 系列从 2011 到 2019 年的绝对辐射定标系数文档以及对应 MSS、WFV、PMS、IRS、AHSI 等传感器的光谱响应函数文件集中整理到了一起还给一部分关键参数做了 JSON 格式的机器可读版本。对做大气校正、6S 模型模拟、多传感器交叉定标的从业者来说把这两类参数理清楚能省下大量翻文档、猜参数的时间。2. 物理链路与参数含义从 DN 到辐射亮度的定标与光谱响应遥感影像在用户手里是 DN 值而科学分析需要的是物理量。定标系数负责把 DN 变成辐射亮度光谱响应函数则描述传感器在不同波长上的敏感程度。这两者配合得好后续反演才有可信度。2.1 定标的物理链路传感器 DN 值到辐射亮度的线性变换传感器输出的数字量化值DN与入瞳辐射亮度之间工程上通常用线性模型近似L Gain × DN Offset其中 L 是辐射亮度单位是 W/(m²·sr·μm)Gain 是定标增益Offset 是偏置。有些官方文档里会写成 L DN / a b 的形式a 和 b 就是另一个写法下的增益与偏置换算时注意别直接把 a 当 Gain 用——这个坑我见过不止一次。国产陆地观测卫星的定标系数是定期在轨定标的产物。卫星发射后传感器响应会随着时间缓慢衰减光学系统污染、探测器老化都会改变 Gain 和 Offset。所以官方每年或每几年会发布一组新的绝对辐射定标系数用敦煌等地面定标场的高精度地表反射率数据结合大气辐射传输模型反推。这就是为什么资源包里 2011 到 2019 年每年都有一份独立文档而不是只有一个固定参数。不同传感器的 Gain 量级差异很大大致可以参考下表传感器类型典型增益范围备注多光谱MSS/WFV0.05 ~ 0.3波段宽度较窄单波段入瞳辐亮度偏低全色PAN0.02 ~ 0.1波段范围宽入瞳辐亮度集中增益相对小红外IRS量级因波长区间差异大热红外通道常另用亮度温度表达需分开处理这个范围不是精确值不同相机实测会有出入但可以作为数据合理性检查的参考。如果从 JSON 里读出来的 Gain 是 2.5 或者 0.0001先别急着用多半是单位换算或者文件本身有问题。定标系数的年份匹配直接影响反演精度。以 GF-1 WFV 为例同一相机 2013 年与 2017 年的系数之间反射率结果可能差 3% 到 5%。对于需要做长时序分析的场景混用年份等于人为引入噪声而且这种噪声无法通过后续滤波消除。2.2 光谱响应函数传感器的光谱指纹不只是波段范围光谱响应函数描述的是传感器在某个波长上对入射辐射的响应权重。很多人会把它简单理解成波段范围比如蓝光 0.45–0.52 μm但实际上传感器的响应不是矩形函数——波段边缘的响应是逐渐衰减的中心波长附近响应最强边缘可能只有峰值的 20% 甚至更低。这个包里的 SRF 文件比如 GF-1 16m 多光谱相机 1 的 xls 文件打开后是一张两列或多列的表格一列是波长一列是归一化响应值。归一化指的是整条曲线最大值设为 1其余波长的响应值按比例缩小通常在 0 到 1 之间。GF-1 WFV 的四个波段分别覆盖蓝、绿、红、近红外区间波段重叠区域很小但边缘仍然是非理想响应。用矩形波段近似代替真实 SRF在 6S 模拟和波段等效太阳辐照度计算中会带来系统性偏差尤其是在气溶胶反演这类对光谱敏感的任务里。SRF 的主要用途有三类第一类是 6S 模型输入。大气校正时6S 需要知道传感器每个波段的实际光谱响应才能算出该波段的大气透过率和路径辐射。第二类是波段等效太阳辐照度计算。把太阳光谱如 MODTRAN 太阳谱与 SRF 逐波长相乘再积分得到每个波段的等效 ESUN这是 DN 转表观反射率的关键参数。第三类是传感器交叉定标与波段匹配。GF-1 和 GF-6 的 WFV 中心波长不完全一致做多源数据融合时用 SRF 做光谱匹配比直接拿两个波段硬套可靠得多。2.3 资源的组织方式历年文档、JSON 派生数据与 SRF 表格的配合整套资源按官方文档 派生 JSON SRF 表格三层组织。官方 doc/pdf 是源头覆盖 2011 年到 2019 年每个文件对应一个或多个卫星的年度定标结果例如 2013 年高分一号 WFV 相机定标系数、2014 年 9 月到 2015 年 8 月的 GF-2 定标结果。JSON 文件则是有人按传感器维度拆好整理过的比如 GF1_MSS1.json、GF2_PAN1.json、ZY3_01_MSS.json命名规则是卫星型号_传感器编号。SRF 文件同时有 txt 和 xls 两种格式。txt 适合脚本直接读取xls 适合人工翻阅和绘图。比如 HJ1A-CCD1-光谱响应函数.txt、ZY3-02-PMS-光谱响应函数.txt、GF-6 WFV1-光谱响应函数.xlsx 都是典型文件。还有一部分传感器只提供了定标系数 JSON没有单独拆 SRF如 GF5_AHSI.txt 同时存在需要使用时先确认目标文件是否齐备。这种组织方式对工程落地比较友好程序批量处理走 JSON人工核对翻官方文档光谱计算读 SRF 表格。唯一要留心的是 JSON 是人工整理的二次产物不能保证和原始文档逐位一致后面避坑章节会展开说。3. 资源包结构拆解JSON、txt、表格三类格式怎么配合使用拿到压缩包后第一件事不是急着跑模型而是把文件分类看清楚。这个包里三种格式的文件扮演不同角色用对了能省时间用错了反而添乱。3.1 JSON 格式批量处理时效率最高的形态定标系数的 JSON 文件是按传感器拆分的文件名直接对应物理相机。以 GF1_WFV1.json 为例内容结构大致是传感器编号、波段列表、每个波段的定标参数import json with open(GF1_WFV1.json, r, encodingutf-8) as f: calib json.load(f) print(传感器:, calib[sensor_id]) print(波段数:, len(calib[bands])) for band in calib[bands]: print(f波段 {band[band_id]}: fgain{band[gain]:.4f}, offset{band[offset]:.4f})读取逻辑很简单json.load 把文件转成 Python 字典然后按 key 访问。gain 是定标增益offset 是偏置band_id 是波段编号。频段数量因传感器而异——WFV 通常 4 波段PMS 可能含全色加多光谱IRS 波段数更少但波段宽度更大。注意 JSON 的字段名是整理者自定义的实际文件里可能叫 gain、coeff、a、b也可能叫 calibration_coefficient。建议拿到文件后先用 keys() 看一眼键名再写业务逻辑。一个通用的做法是先打印一个文件的完整结构确认字段再批量。with open(GF2_PAN1.json, r, encodingutf-8) as f: sample json.load(f) print(json.dumps(sample, ensure_asciiFalse, indent2))这一步输出的完整结构就是你的字段字典。JSON 相比 txt 的最大优势在于不需要按分隔符解析嵌套结构天然表达传感器-波段-参数的层级关系尤其适合在 Python 里直接做循环批处理。3.2 txt 格式光谱响应函数最常见的文本载体txt 格式的光谱响应函数通常是两列数据第一列波长第二列响应值。比如 HJ1A-CCD1-光谱响应函数.txt 打开后每一行是一个采样点。读取方式最直接的是 NumPyimport numpy as np data np.loadtxt(HJ1A_CCD1.txt, comments#) wavelength data[:, 0] response data[:, 1] print(采样点数:, len(wavelength)) print(波长范围:, wavelength.min(), -, wavelength.max(), nm) print(响应值范围:, response.min(), -, response.max())这段代码把第二列当作响应值。但有个细节必须确认波长单位是微米还是纳米。看波长范围就能判断——第一列如果是 0.4 到 0.9那是微米如果是 400 到 900那是纳米。两种单位都出现过不统一。批量处理之前先检查最好在读取时统一转成纳米避免后续计算混用。响应值范围也能透露信息正常 SRF 的最大值应该接近 1归一化如果最大响应只有 0.5说明文件可能是未归一化的原始数据需要用最大值归一化一下再参与计算。3.3 xls 与 doc查错时回退的原始档案xls/xlsx 文件主要用于 SRF 的原始表格doc/pdf 主要用于年度定标系数文档。这两类文件不适合直接进程序但价值恰恰在原始上——JSON 和 txt 都是整理过的整理过程中可能截断精度、改过字段名、甚至录错数字。遇到可疑结果时打开原始 xls 或者年度 doc 对一下是最后的验证手段。格式代表文件内容适用场景JSONGF1_MSS1.json、ZY3_01_MSS.json定标增益/偏置按传感器拆分Python 批处理、入库、自动化流程txtGF1_PAN1.txt、ZY-3 多光谱相机 SRF定标参数或光谱响应曲线快速查看、脚本读取、简易绘图xls/xlsxGF-1-16m 多光谱相机 1-光谱响应函数.xls光谱响应函数原始表格人工核对、绘图、追溯异常doc/pdf2014 年 GF-1 定标系数.doc、2019 年外场定标.pdf年度官方定标结果确认年份、单位、传感器说明实际工作中的建议是批处理流程走 JSON 和 txt但定期抽几个文件和原始 doc/pdf 交叉验证。这个包里的免费技术咨询和联系方式.txt文件如果在使用中遇到参数无法确认的情况也可以作为辅助渠道去咨询整理者。4. 落地 6S 大气校正定标与 SRF 的程序化串接定标系数和 SRF 不是拿来欣赏的最终要进到辐射传输模型或者大气校正流程里。6SSecond Simulation of a Satellite Signal in the Solar Spectrum是当前应用最广的辐射传输模型之一把这份资源里的参数正确喂给 6S才算真正落地。4.1 6S 模型需要哪些输入6S 模型的核心是模拟太阳辐射在大气中的传输过程输入参数大体分五类观测几何、大气模式、气溶胶模式与光学厚度、传感器光谱特性、目标与地面高度。其中传感器光谱特性直接依赖本资源中的 SRF而 DN 转表观反射率的预处理则需要定标系数。参数类别具体参数数据来源观测几何太阳天顶角、方位角、观测天顶角、相对方位角影像元数据 Header大气模式中纬度夏季、中纬度冬季、热带等按成像时间和纬度选择气溶胶类型大陆型/海洋型/城市型、光学厚度 AOD实测或默认值传感器光谱各波段 SRF本资源 SRF 文件地表参数地面海拔高度DEM 或默认 0.03 km定标系数不在这个表里因为 6S 的输入是反射率而不是 DN 值。所以整个流程分两步先用定标系数把 DN 转成表观反射率再用表观反射率和 6S 的模拟结果做大气校正。这一步顺序颠倒是最常见的错误。4.2 从定标 JSON 到表观反射率假设影像 DN 值已经读入 NumPy 数组用 JSON 里的定标参数做线性变换import numpy as np dn np.array([[108, 121, 96], [132, 117, 104]], dtypenp.float64) gain calib[bands][0][gain] offset calib[bands][0][offset] L gain * dn offset d 1.0 # 日地距离天文单位约等于1 esun 188.5 # 示例值单位 W/(m²·μm)由SRF加权计算 sza 30.0 # 太阳天顶角度 rho_toa np.pi * L * d * d / (esun * np.cos(np.deg2rad(sza)))这段代码先把 DN 变成辐亮度 L再算出表观反射率 rho_toa。参数说明如下gain 和 offset 来自 JSON 定标系数单位决定了 L 的量级esun 是波段等效太阳辐照度这个值不要随便从网上抄用 SRF 和太阳光谱积分计算更可靠d 是日地距离修正因子单位是天文单位AU一年中变化约 ±3.4%精度要求高的场景需要按成像日期查表或计算。如果输出结果明显超出 0 到 1 的范围多半是 esun 单位不匹配比如用了 W/m²/μm 但实际需要 W/m²/sr/μm 的系数或者是 gain 正负搞反了。可以先打印中间变量检查量级。4.3 把 SRF 重采样成 6S 可用的光谱文件txt 格式的 SRF 采样间隔不一定均匀而 6S 输入往往要求固定波长步长。常见做法是把 SRF 线性插值到 5nm 或 1nm 间隔并归一化。写一个通用重采样函数def resample_srf(wavelength_nm, response, step5.0): wl_min np.ceil(wavelength_nm.min() / step) * step wl_max np.floor(wavelength_nm.max() / step) * step wl_new np.arange(wl_min, wl_max step, step) resp_new np.interp(wl_new, wavelength_nm, response) resp_new resp_new / resp_new.max() return wl_new, resp_newnp.interp 做线性插值对新网格上的每个点取原曲线对应位置的线性组合值归一化保证峰值响应为 1避免能量量纲差异影响 6S 计算。参数 step 可按需求调整做精细模拟用 1nm文件大但精度高批量处理用 5nm 足够计算量小得多。插值后还要检查一个细节新网格的波长范围是否完全覆盖原 SRF 的有效区间。如果原文件波长范围是 450–890nm而你插值到 400–900nm边缘全是补出来的假数据必须截断到原范围内。这一步不做6S 会多算一段根本不存在的响应。5. 避坑指南年份、相机编号、单位与精度四类高频问题这套资源是三个人手工整理的质量总体不错但使用过程中踩过的坑也不少。下面按现象 → 原因 → 解决写几条高频问题基本覆盖了新手最容易翻车的场景。5.1 GF-1 的 MSS1 和 MSS2 参数混用现象同一批 GF-1 影像有人用 GF1_MSS1.json 处理 WFV 数据或者把 MSS1 和 MSS2 的定标系数混着用做完后发现部分波段反射率偏高且没有固定规律。原因GF-1 上 MSS 相机有两台编号 MSS1 和 MSS2两台相机的光电响应特性不完全一致定标系数有差异。文件名只差一个数字很容易复制错。解决使用前先看影像元数据里的相机标识一般写在 ProductID 或 SensorID 字段里确认是 MSS1 还是 MSS2再选择对应的 JSON 文件。不要根据成像时间推测——同一天可能两颗相机都在工作。5.2 用 2013 年的定标系数处理 2017 年的影像现象表观反射率结果整体偏低约 3%但单波段比例不一致蓝波段偏差最大。原因传感器在轨衰减导致响应度逐年下降旧定标系数不再适用。2017 年的影像用了 2013 年的 Gain值偏大算出来的辐射亮度偏小。解决优先使用与成像日期最接近的定标文档而不是哪个文件顺眼用哪个。资源包里有 2011 到 2019 各年度的文件处理前先列出成像年份再选对应的年度文档或对应 JSON。如果 JSON 没标注生效年份回原始 doc 看封面说明。5.3 把 SRF 波长单位搞混导致波段错位现象读取某个 SRF txt 文件后代码里一直没有做单位判断结果 6S 给出的透过率和预期差一大截或插值后的曲线形状完全不对。原因包内部分 txt 波长单位是微米0.45–0.89部分是纳米450–890。直接代入统一公式时数值相差 1000 倍波段位置自然错乱。解决写一个单位检测逻辑波长最小值小于 10判定为微米乘以 1000 转成纳米最小值大于 100判定为纳米保持不变。并统一在预处理阶段将单位转成 nm 后再进入计算流程。def normalize_wavelength(wl): if np.nanmin(wl) 10: return wl * 1000.0 return wl.copy()5.4 ZY3-02 早期任务找不到定标文件现象处理 2014 年 ZY3-02 影像时发现包内对应文件解析失败或文件不存在有人直接拿 ZY3-01 的系数顶上。原因资源三号 02 星与 01 星传感器参数不同定标结果也不同。01 星的定标文件不能直接用于 02 星而 2014 年早期的资料可能并未收录 02 星的文件。解决处理数据前先确认卫星型号和传感器类型再用对应文件。如果包内没有对应年份/型号优先查官方定标文档而不是跨型号替代。5.5 JSON 数值与原始 txt 文档有精度偏差现象用 JSON 文件处理的影像结果和用原始 xls 手工计算的参考值之间存在微小差异比如某个波段的 Gain 相差 0.001。原因人工整理 JSON 时可能存在四舍五入或截断原始文档保留的有效位更多。JSON 方便但不能完全替代原始文件。解决关键结果在发布前选一个波段用原始文档复算一遍。如果差异在可接受范围内一般 0.1% 以内JSON 可以放心用于批处理如果偏差较大手动修正 JSON 中的对应值。6. 进阶用脚本批量质检定标参数入库前先排雷上面几个坑其实可以用一个小脚本提前抓出来。我一般拿到任何一批定标参数第一件事不是直接跑校正而是遍历全部 JSON 和 SRF做一轮基本合法性检查。import json, os, numpy as np problems [] for fname in sorted(os.listdir(radiance_json)): if not fname.endswith(.json): continue with open(os.path.join(radiance_json, fname), r, encodingutf-8) as f: data json.load(f) for band in data.get(bands, []): gain band.get(gain, 0) offset band.get(offset, 0) if not (0.001 gain 1.0): problems.append(f{fname} 波段{band.get(band_id)} Gain异常: {gain}) if abs(offset) 1.0: problems.append(f{fname} 波段{band.get(band_id)} Offset异常: {offset}) srf data.get(srf) if srf: wl np.array(srf[wavelength]) resp np.array(srf[response]) if np.nanmax(resp) 0.9: problems.append(f{fname} SRF未归一化) print(\n.join(problems) if problems else 全部通过共检查 %d 个文件 % len(os.listdir(radiance_json)))这段脚本做了三件事检查增益是否落在物理合理的量级区间、偏置是否在正常范围、SRF 是否完成归一化。检查的阈值不是绝对标准比如 Gain 上限 1.0 对某些热红外传感器可能偏低但作为第一道筛子足够有效。跑完检查后再对照原始文档抽检两个文件确认 JSON 与 txt 的数值一致就可以放心批量入库了。从那以后我每次拿到新的定标参数都强制走一遍这个检查流程再也没出现过因为参数错误反推半个月的憋屈事。希望这份整理好的定标系数和光谱响应函数资源也能让你的国产卫星数据处理少走这些弯路。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →