国产卫星定标系数与光谱响应函数:从DN值到辐亮度的关键处理

发布时间:2026/10/19 14:42:02
国产卫星定标系数与光谱响应函数:从DN值到辐亮度的关键处理
简介面向遥感数据处理、地理信息系统与地球观测应用开发者这份数据包系统整理了高分系列GF-1、GF-2、GF-4、GF-6与资源系列ZY-3、ZY-1 02C等国产卫星的辐射定标系数和光谱响应函数并提供了JSON格式参数配置便于直接嵌入遥感软件或结合6S辐射传输模型开展大气校正、地表反射率反演等定量分析可有效弥补传感器标定参数不足带来的精度损失。压缩包共94个文件总大小约1.85MB内容分为2011—2019年逐年发布的绝对辐射定标系数文档doc/pdf/xls/xlsx与各传感器光谱响应函数文本txt及JSON参数另有少量元数据图片和说明文件目录按定标系数、光谱响应函数及卫星型号归类检索方便。目前已有156人学习下载适合需要国产卫星基础标定参数的科研人员、算法开发者和工程师帮助快速完成参数查阅与集成减少重复整理工作提升遥感建模与数据处理效率。1. 定标系数和光谱响应函数为什么一份参数表能决定整条遥感处理链的精度定标系数和光谱响应函数这两个词在遥感处理流水线里常常被当成“查表项”一笔带过输入一个DN值乘个增益就输出了辐亮度。可一旦你真去处理一份国产卫星影像就会发现这套表远没有想象中那么简单——它不是一组固定数字而是按卫星、按相机、按年份排列的参数集合同一颗星2013年和2015年的增益能差好几个百分点不同相机的光谱响应曲线形状更是各不一样。这份覆盖2012年至2019年的国产卫星定标系数与光谱响应函数整理包把GF、ZY、HJ系列多个载荷的参数以JSON、txt、xls形式汇总在一起要解决的是遥感数据从“能看”到“能算”的第一公里问题。为什么值得搞懂因为整条大气校正链路的误差预算里定标系数和光谱响应函数是相乘关系这两步没扣准后面做再多精细处理都是白忙。2. 绝对辐射定标同一颗卫星为什么各年份的增益系数不能混用2.1 从DN到辐亮度线性模型背后的物理假设绝对辐射定标的目标是把传感器输出的无量纲数字DN换算成传感器入瞳处的辐亮度。绝大多数国产光学载荷交付的定标模型都是线性形式L_λ gain × DN offsetgain的单位是W·m⁻²·sr⁻¹·μm⁻¹·DN⁻¹它决定了每个DN计数对应多少物理辐射能量offset则对应暗电流和噪声底。文件包里GF1_MSS1.json、GF2_PAN1.json这类JSON按遥感处理社区最常见的整理思路内部就是按波段组织这组参数——每个波段对象里带band_id、gain、offset、center_wavelength以及指向对应光谱响应函数文件的路径。有些文件的offset写成0并不是漏填而是实验室定标阶段已经把暗电流扣除交付时就简化成单增益形式。用一段Python就能把这件事做得很直观。下面这段按“波段数组”的常见JSON结构读取gain并把一个16bit的DN值转成辐亮度import json with open(GF1_MSS1.json, r, encodingutf-8) as f: cal json.load(f) band cal[bands][0] # 取第一个波段 gain float(band[gain]) # 单位W·m⁻²·sr⁻¹·μm⁻¹·DN⁻¹ offset float(band[offset]) dn 4096 # 假设影像里某个像元的DN值 radiance gain * dn offset print(band[band_id], radiance)这里的关键不是那行乘法和加法而是模型的适用范围gain是传感器在某个增益档位、某个工作温度范围内的平均值不是全动态范围都严格成立的物理常数。载荷研制方在交付前会把探测器响应做线性化校正使残差控制在测量噪声水平附近所以才敢用一条直线来近似整条响应曲线。量化级也要注意——GF-1的多光谱和全色是16bitDN范围0到65535而有些热红外载荷输出12bit或14bit同样的DN值对应的物理辐亮度完全不同这也是“不能跨载荷套gain”的最直接原因。2.2 外场定标系数是怎么测出来的定标系数不是实验室里算一次就一劳永逸的。卫星入轨后元器件衰减、光学镜头污染、焦面温度波动都会改变传感器响应所以需要定期做外场绝对定标。所谓外场定标核心思路是找一块大面积均匀、反射率稳定、太阳高度角合适的自然场地卫星过顶的同时地面同步测量目标反射率和大气参数再用辐射传输模型6S或MODTRAN把地面反射率换算成卫星入瞳处的等效辐亮度最后和同时刻的卫星DN值做线性回归回归斜率就是增益截距就是offset。这个流程听起来是“标准动作”实际执行起来非常磨人。测量车要在卫星过顶前后几十分钟内完成光谱仪测量、太阳光度计观测、气溶胶光学厚度和水汽反演时间对不上数据就作废场地选得不均匀地面一个像元和一个像元反射率不一样回归结果就被噪声拉偏。很多人以为定标系数是某种玄学其实它就是一组带日期、带场地、带大气状态的回归结果。这份资源里2011年到2019年每年一份的定标系数doc/pdf正是历次外场定标的结果存档。文件名括号里列的卫星越多说明当年实验覆盖的载荷越全比如2017年那份覆盖了GF-1、GF-2、GF-4、ZY-301/02星、ZY-1 02C、CBERS-04、HJ-1A/B。为什么必须按年发布因为外场定标不是一次性行为传感器衰减趋势要靠年度重复测量来跟踪。实际使用策略也很明确影像获取日期落在哪一年就优先用那一年发布的增益跨年度数据看趋势或就近年份取值。2.3 文件命名里的载荷与型号信息文件包里的命名本身就是一张信息表。GF1_MSS1和GF1_MSS2是高分一号卫星上两台独立的多光谱相机GF1_WFV1到GF1_WFV4是四台宽视场相机——它们靠视场拼接覆盖大幅宽但光学系统各自独立增益必须分别定标所以JSON和txt按1到4编号分开存放。ZY3_01_MSS和ZY3_02_MSS对应资源三号01星和02星HJ1A_CCD1、HJ1A_CCD2是环境一号A星的两台CCD相机GF1D_MSS、GF1C_MSS、GF1B_MSS则代表同一平台后续型号或不同代际载荷。处理影像时第一步永远是看元数据里的载荷ID和相机号再决定用哪个JSON。这套包里文件前缀长得太像GF1_MSS1和GF1_MSS2之间只差一个数字但两台相机的增益差异能到几个百分点。一个实用的交叉检查是记住同一相机不同年份的系数差异在低个位数百分比不同相机之间的差异可能更大——如果一次对比跳出了这个量级多半是文件选错了。3. 光谱响应函数每个非理想波段背后都有一张“响应指纹”3.1 非理想波段每个波长的响应权重不同教科书里习惯把一个波段画成矩形蓝波段0.45到0.52μm好像波段内所有波长都被等权接收。真实传感器不这样——滤光片的透过率曲线在边缘滚降探测器的量子效率随波长起伏整机装配后的响应曲线可能是平顶、带裙边、甚至带次级峰的。光谱响应函数SRF就是把这种非理想特性量化出来的结果它告诉你波段内每个波长对DN值的贡献权重。GF-1的16m多光谱相机1到4各有独立的xls文件这四个相机的SRF都是装星前逐台实测的。同一套设计不同相机之间也会有数纳米到十几纳米的不一致对窄波段反演来说已经不能忽略。GF-6的WFV1和WFV2分开存放ZY-3、ZY02C、HJ-1A/B各自存储都是同一个道理——SRF是每台相机独有的“响应指纹”用别人的指纹来识别你这台相机波段等效计算从一开始就是偏的。3.2 SRF如何参与计算加权积分与等效波段给定SRF(λ)波段等效参数一律是加权平均的形式。比如太阳反射区波段的等效反射率ρ_band ∫ρ(λ)·SRF(λ)dλ / ∫SRF(λ)dλ积分区间就是这个波段的真实响应范围。只有先做归一化让∫SRF(λ)dλ1公式才简化成直接积分的形式。这份资源里的txt文件一般是两列波长、响应值有的波长用纳米有的用微米用之前一定先看数值范围。下面这段代码演示了完整的归一化和积分流程import numpy as np data np.loadtxt(HJ1A_CCD1_srf.txt) # 假设两列波长、响应值 wavelength, response data[:, 0], data[:, 1] # 单位粗判数值范围在0.3~2.5之间视为微米300~2500视为纳米 if np.nanmax(wavelength) 10: wavelength wavelength * 1000 # 统一转成纳米 # 归一化让积分面积等于1 norm_factor np.trapz(response, wavelength) response_norm response / norm_factor # 等效中心波长 center np.trapz(wavelength * response_norm, wavelength) print(等效中心波长: %.1f nm % center)这段代码里np.trapz做的是梯形积分适用于txt里不等距采样的散点先归一化再算等效波长顺序不能反。为什么要强调这一步因为当波段通带内有大气吸收线或地表反射率剧烈变化时直接用中心波长代替整段SRF会引入系统性偏差尤其在红边和水分吸收区SRF形状不同反演出来的植被指数差异非常可观。3.3 txt、xls与JSON三种格式的三位一体这套包里同一份SRF有时同时存在txt和xls两个版本甚至JSON里还存了一份路径索引。三者的分工非常典型txt是程序最友好的格式两列纯数字不依赖Excel环境numpy.loadtxt一行就能读这也是6S、MODTRAN这类模型批量读SRF的标准做法xls是给人核对和归档用的带表头、带sheet说明、带单位描述Excel里画个图就能确认曲线形状是否合理JSON则把SRF的关键信息——等效中心波长、对应文件路径——和定标系数放进同一个对象供自动化流水线调度。SRF.txt这个不带卫星前缀的文件名更像是一个汇总用的标准输入文件很多模型在band mode下就是读这类散点文件做逐波长模拟的。另外这份资源是三个人手工整理出来的少量文件存在单位不统一、列顺序不一致的瑕疵遇到拿不准的先翻包内的技术咨询说明比自己在网上猜效率高得多。4. 从txt到JSON定标参数如何变成程序直接消费的数据结构4.1 JSON字段设计的常见思路原始文档没有逐字段定义JSON内部结构但按遥感处理社区最常见的整理方式一个JSON对象至少包含卫星标识、传感器标识和波段数组每个波段里有band_id、gain、offset、calibration_date、center_wavelength以及指向SRF文件的路径。大致形态如下{ satellite: GF-1, sensor: MSS1, bands: [ { band_id: 1, gain: 0.1567, offset: 0.0, calibration_date: 2014-01-01, center_wavelength: 485, srf_file: GF1_MSS1_srf.txt } ] }为什么选JSON而不是继续用纯txt因为一个载荷往往有多个波段增益和SRF必须一一对应嵌套数组比平铺文本更不容易错配Python里json.load之后直接按band_id索引不用自己维护txt文件之间的对应关系。JSON对版本控制友好加一个字段、改一个数值在diff里一目了然这对逐年更新的定标系数来说非常重要。相比ENVI头文件或老式.dat格式JSON更接近现代自动化处理管线的习惯。4.2 文件名映射一个前缀对应一个真实相机文件包里的命名前缀和真实载荷的对应关系是处理前必须建立的映射表。常见对应关系如下文件前缀对应载荷GF1_MSS1 / GF1_MSS2高分一号多光谱相机1、2GF1_WFV1 ~ WFV4高分一号宽视场相机1至4ZY3_01_MSS / ZY3_02_MSS资源三号01星、02星多光谱相机HJ1A_CCD1 / HJ1A_CCD2环境一号A星CCD相机1、2GF4_PMS / GF4_IRS高分四号全色多光谱、红外扫描仪GF5_AHSI高分五号高光谱成像仪处理影像时建议先做一步强制映射读影像元数据里的载荷ID和相机号生成一个“元数据到JSON前缀”的dict再用这个dict去选择定标文件而不是凭文件名肉眼匹配。这一步能挡掉第5章里讲的很多低级事故。4.3 与6S模型的整合定标系数和SRF处在数据链的什么位置完整的数据流是这样的DN → 定标系数gain/offset → 辐亮度L → 表观反射率ρ_TOA → 6S大气校正SRF加权模拟透过率、散射、吸收→ 地表反射率定标系数负责“把数字变成物理量”SRF负责“让物理量对得上这台传感器的眼睛”。两者用错任何一个最终地表反射率都是错的而且误差会沿整条链路非线性传播。用6S做波段平均时输入的波长范围和SRF散点必须和定标系数来自同一个波段来源否则就像“左手定标、右手用别人的光谱”是这套参数最常见的翻车现场。# 生成6S波段平均输入示意 import json with open(GF1_WFV1.json, r, encodingutf-8) as f: cal json.load(f) for band in cal[bands]: srf np.loadtxt(band[srf_file]) print(f波段{band[band_id]}: f波长范围 {srf[:,0].min():.2f} ~ {srf[:,0].max():.2f} μm, f增益 {band[gain]})这段代码只是把6S需要的两个输入并排列出来波段范围来自SRF增益来自定标JSON。两者必须从同一个JSON对象里取不能在另一份文件里另找一套参数。实际跑6S时band mode下还要按模型要求的采样间隔把SRF重采样成固定步长这一步也需要记下原始txt的波长单位统一后再传给模型。5. 实战排查处理这套参数时最容易翻车的五个细节点这套参数最大的特点是文件多、命名近、格式混。翻车往往不是算法问题而是“拿错了参数”。下面五条是处理同类资源最常见的踩坑记录每条按现象、原因、解决的顺序展开都是血泪经验。5.1 相机ID混用MSS1的系数套到MSS2影像上现象用GF1_MSS1.json处理MSS2相机的影像辐亮度整体偏高3%到5%图像“看起来正常”肉眼很难发现异常。原因同一颗星上多台相机独立定标增益不同文件名只差一个数字不核对元数据就容易错。解决处理前读影像元数据里的载荷ID和相机号和JSON里的sensor字段强制比对。条件允许时用两个相机的系数各算一遍同一景影像看输出差异是否落在该载荷历史差异范围内。5.2 年份错配拿2013年系数处理2016年影像现象用2013年定标系数处理2016年影像NDVI均值系统性偏低单景看不出来一统计就露馅。原因增益随在轨时间漂移年度系数差异来自传感器衰减和定标条件变化。2013年标定的绝对量值和2016年在轨状态不完全一致。解决按影像获取时间就近选择年度定标文件。2017年之后的pdf版报告会写明有效周期和使用建议优先读它再决定用哪一年系数。5.3 SRF未归一化积分结果反射率大于1现象用SRF做加权积分波段等效反射率算出大于1的不物理值。原因txt里存的是相对响应值不是归一化权重。直接拿去积分等于把权重总量放大了。解决积分前先做归一化——响应值除以∫SRF(λ)dλ或者除以峰值并再验证积分面积约等于1。归一化条件很明确∫SRF1。5.4 波长单位混用nm和μm差出1000倍现象中心波长填错6S输入波长范围偏出真实通带大气校正后地表反射率出现偏色。原因同一批SRF文件有的波长列是纳米有的是微米表头不一定会写。解决先看数值范围粗判——0.4、0.55、0.85附近是微米400、550、850是纳米同一列里最大值和最小值之间跨度不超过一个量级统一单位后再参与任何计算。包内的xls一般带单位txt却未必以xls为参照逐一核对。5.5 JSON字段类型字符串当数值直接乘现象Python里json[bands][0][gain]直接乘DN要么报TypeError要么算出的结果明显离谱。原因JSON解析后数值字段被读成了字符串或者gain字段实际是一个数组[gain, offset]结构和你预期的不一致。解决加载后先做类型检查和结构检查再进流水线import json with open(GF2_PAN1.json, r, encodingutf-8) as f: cal json.load(f) for band in cal[bands]: assert isinstance(band[gain], (int, float)), gain不是数值 assert isinstance(band[offset], (int, float)), offset不是数值 # 如果是字符串就强制转换 gain float(band[gain]) offset float(band[offset])这一步不费事但能把最隐蔽的一类错误挡在计算之前。记住一个原则任何来自文件的外部参数进公式前都要过一遍类型和取值范围检查尤其是这种跨年份、跨格式手工整理的资源。6. 设计取舍为什么线性定标模型用了十几年仍是主流这份资源横跨2012到2019年核心定标模型始终是线性gain/offset不是技术停滞而是工程上最划算的选择。探测器非线性响应真实存在但在轨光照条件下非线性残差往往小于定标场实验本身的测量不确定度。线性模型把误差压在大气校正之前可承受的范围内而非线性模型需要给每个波段建立完整的辐射响应曲线标定成本成倍上升对最终地表反射率精度的提升却很有限。对用户来说线性模型还有一个好处算错时容易发现——把DN代进去辐亮度量级对不对一眼能判断。为什么年年做外场定标而不是完全依赖星上定标灯星上定标监视的是短期相对变化外场绝对定标锚定的是长期绝对量值两者互补。这套资源以年度外场定标为主、多年归档为辅的组织方式正好体现了“变化跟踪靠时间序列、绝对量值靠场地实验”的原则。JSON、txt、doc/xls三种格式并存的局面也值得说两句。机器要效率和确定性人要追溯和复核。一个科学参数包如果只有纯二进制没法追溯历史如果只有纯文档没法喂给自动化流程。txt喂模型、JSON喂流程、doc/xls喂人这个混合结构看起来“不够统一”实际却是这类资源最稳定的形态。三个人用手工整理做到这个程度是工程上很务实的取舍。拿到这套参数后可以做一步不依赖地面测量的交叉定标自检用GF-1 WFV1和ZY-3多光谱相机对同一时期、同一均匀目标的影像分别用自己的系数做定标并反演表观反射率两者差异在2%以内说明系数自洽再和MODIS窄波段的SRF加权结果对比还能检验绝对量级。从那以后我每换一个国产卫星数据集都强制走一遍“载荷ID→获取时间→SRF归一化→JSON类型检查”四步再开跑流水线再没在这种基础参数上栽过跟头。希望帮到你。本文还有配套的精品资源点击获取