跳转至

20 - 卫星推扫成像

推扫成像把三维场景、大气和成像仪器连成一条完整的链路。结果除了辐亮度,还有探测器上的电子数、模数转换后的数字量(DN),以及每个像元的观测位置和时间。可用于比较传感器设计、分析影像形成过程或生成算法测试数据。

推扫成像在一个局部平面坐标系中描述一段航迹,适合局部场景。需要完整轨道、地球曲率或严格几何校正时,可以先用轨道工具生成观测几何。

三个组成部分

部分 类 内容
观测几何 Pushbroom 高度、航向、幅宽、地速、行频、扫描时间
光谱与大气 OpticalImager 波段、采样数、观测高度、邻近效应
仪器 Instrument 口径、积分时间、光学透过率、量子效率、调制传递函数、噪声、模数转换

示例

import less

scene = less.Scene()
scene.size = 1000.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.20))
scene.illumination = less.Illumination(
    source=less.Sun(zenith=30, azimuth=150),
    atmosphere=less.Atmosphere.standard(
        "midlatitude_summer", aerosol="continental", aot550=0.10, sky_mode="anisotropic"),
)

projection = less.Pushbroom(
    resolution=64,        # 每条扫描线的像元数
    num_lines=64,         # 沿轨扫描线数
    altitude=700000,      # 高度(m)
    swath_width=1000,     # 幅宽(m)
    heading=180,          # 航向,从北顺时针
    ground_speed=7000,    # 地速(m/s)
    line_rate=441,        # 行频(行/秒)
    start_time=0.0,
)

instrument = less.Instrument(
    aperture_diameter=0.20,     # m
    integration_time=0.001,     # s
    optical_transmission=0.70,
    quantum_efficiency=0.75,
    read_noise=4.0,             # 电子
    dark_current=20.0,          # 电子/秒
    full_well=80000,            # 电子
    gain=5.0,                   # 电子/DN
    bit_depth=14,
    mtf_nyquist=0.30,
    smear=0.2,                  # 沿轨拖影(像元)
    seed=42,
)

sensor = less.OpticalImager(
    projection=projection,
    bands=less.Sentinel2A(),
    spectral_resolution=20,
    quality=16,
    observation_level="toa",
    adjacency_sigma=1.0,
    instrument=instrument,
)
product = scene.simulate(sensor)

observation_level="toa" 使用场景的大气模型,把地表出射的辐亮度传到大气层顶,再送入仪器。

扫描时间与覆盖范围

同时给出 ground_speed 和 line_rate 时,沿轨覆盖长度为

\[ L = v\,\frac{N_{\mathrm{line}}-1}{f_{\mathrm{line}}}, \]

其中 v 是地速,N 是扫描线数,f 是行频。也可以直接用 ground_track_length 给出覆盖长度,此时以它为准。第 k 条扫描线的时刻为 start_time + k / line_rate。

altitude 只决定光线的几何起点;大气传输的终点由 observation_level 或 observation_altitude_km 决定。

仪器模型

每个波段的辐亮度先根据有效带宽、入瞳面积、像元立体角、积分时间和光学透过率换算为到达探测器的光子数,乘以量子效率得到电子数。然后依次加入:

  1. 点扩散函数、调制传递函数、抖动和沿轨拖影;
  2. 光子散粒噪声、暗电流和读出噪声;
  3. 满阱截断、增益和模数转换的量化。

使用光谱响应函数时自动计算有效带宽。固定 seed 可以得到可重复的噪声;设置 noise=False 只看不含噪声的结果。

结果

product.source_radiance   # 入瞳辐亮度
product.radiance          # 经过空间响应后的辐亮度
product.electrons         # 电子数
product.dn                # 数字量,与 product.data 相同
product.geolocation       # 每个像元的 x、y、观测天顶角、方位角和时间

product.save("satellite_product.npz")                    # 保存所有中间量
product.save("satellite_dn.tif")                         # 数字量和地理定位
product.save("satellite_preview.png", bands=[3, 2, 1])

为场景设置地图坐标后,每个像元的位置还包含东坐标、北坐标和坐标系,GeoTIFF 用地面控制点记录推扫几何:

scene.georeference = {"crs": "EPSG:32650", "origin": (500000.0, 4001000.0)}   # 场景西北角

场景的 y 轴指向南,因此北坐标从原点向南递减。

邻近效应

adjacency_sigma(像元)大于 0 时,根据观测路径上分子和气溶胶散射的光学厚度,把相邻像元的辐亮度按比例混合。这种近似不改变均匀场景的辐亮度,可用于快速估计明暗边界附近的邻近效应。

内置示例

python -m less.examples satellite_pushbroom

适用范围

推扫成像包含局部航段内的平台运动、跨轨扫描、逐像元观测角、任意观测高度的一维分层大气、地气耦合、邻近效应近似、光谱响应和探测器链路。它不包含轨道动力学、地球曲率、姿态时间序列、随时间变化的场景、云的三维辐射传输和偏振,结果不等同于经过几何处理的业务卫星产品。

下一步