跳转至

09c - 卫星推扫成像仿真

LESS 可以把三维地表场景、大气传播和成像仪器连接成一条端到端链路。输出不只是理想辐亮度,还可以包含探测器电子数、量化后的数字量化值(DN)以及逐像元观测位置和时间。

这一功能适合开展传感器方案比较、影像机理分析、算法测试数据生成和数字孪生场景观测。当前实现采用局部平面坐标系描述一段卫星或机载航迹;如果研究需要完整星历、姿态四元数、地球曲率或严格正射校正,应在外部轨道工具中生成观测轨迹,再接入 LESS。

三层设置

一次推扫成像由三部分组成:

层次 作用
观测几何 Pushbroom 高度、航向、幅宽、地速、行频和扫描时间
光谱与传播 OpticalImager 波段、采样质量、大气观测高度和邻接效应
仪器响应 Instrument 口径、积分时间、透过率、量子效率、MTF、噪声和 ADC

最小示例

import less

scene = less.Scene(backend="optix")
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=1024,       # 每条扫描线的像元数
    num_lines=2048,        # 沿轨扫描线数
    altitude=700000,       # 相对参考面的几何高度,m
    swath_width=1000,      # 地面幅宽,m
    heading=180,           # 顺时针自北起算
    ground_speed=7000,     # 地速,m/s
    line_rate=14336,       # 行频,line/s
    start_time=0.0,
)

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

sensor = less.OpticalImager(
    projection=projection,
    bands=less.Sentinel2A(),
    spectral_resolution=5,
    quality=16,
    observation_level="toa",
    adjacency_sigma=1.0,   # 邻接混合尺度,pixel
    instrument=instrument,
)

product = scene.simulate(sensor)

observation_level="toa" 会自动使用 scene.illumination.atmosphere,先把三维场景的出射辐亮度传播到大气层顶,再进入仪器链。用户不需要单独调用大气求解器。

运动和扫描时间

如果同时设置 ground_speedline_rate,LESS 根据扫描线数量自动计算沿轨覆盖长度:

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

也可以直接设置 ground_track_length。显式长度的优先级更高,适合已经知道地面覆盖范围的情况。每条扫描线的时刻为 start_time + line / line_rate

altitude 是三维射线几何使用的相对高度;observation_level="toa" 是大气传播的终点。二者控制不同的物理环节。

仪器计算

对于每个波段,LESS 将辐亮度转换成到达探测器的光子数,再乘以量子效率得到电子数。计算考虑有效带宽、入瞳面积、像元立体角、积分时间和光学透过率。随后依次应用:

  1. PSF、MTF、抖动和沿轨拖影;
  2. 光子散粒噪声、暗电流和读出噪声;
  3. 满阱截断、增益和 ADC 位深量化。

如果波段使用光谱响应函数,LESS 会自动计算等效带宽。为了得到可重复结果,可以固定 seed;如果只检查确定性辐射结果,可设置 noise=False

输出产品

当设置了 instrument,返回值为 InstrumentImageProduct

product.source_radiance  # 大气传播后的入瞳辐亮度
product.radiance         # PSF、MTF、抖动和拖影后的辐亮度
product.electrons        # 探测器电子数
product.dn               # ADC 输出;product.data 与它相同
product.geolocation      # x、y、观测天顶角、方位角和时间
product.save("satellite_product.npz")  # 保存全部中间量
product.save("satellite_dn.tif")       # 保存 DN 与地理定位
product.save("satellite_preview.png", bands=[3, 2, 1])

场景设置投影坐标后,逐像元位置还会包含 eastingnorthingcrs,GeoTIFF 使用地理控制点保存推扫几何:

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

LESS 的局部坐标为 x 向东、y 向南,因此北向坐标由场景原点向南递减。

邻接效应

设置 adjacency_sigma > 0 后,LESS 根据观测路径上的瑞利和气溶胶散射光学厚度,对邻近像元辐亮度进行一阶空间混合。该近似保持均匀场景的辐亮度不变,适合快速评估高反差边界附近的邻接影响。它不是水平非均匀三维大气的替代模型。

运行内置示例

import less
product = less.examples.run(
    "satellite_pushbroom",
    show=False,
    output_dir="satellite_output",
    backend="optix",
)

OptiX、Vulkan 和 Embree 使用同一套用户接口。发布验证 Val25 检查三后端推扫辐亮度的一致性,以及探测器换算、空间响应和地理定位误差。

当前适用范围

当前版本已经覆盖局部航段内的推扫运动、跨轨扫描、逐像元视角、任意观测高度的一维分层大气、地气耦合、邻接近似、光谱响应和探测器成像链。

以下能力尚未包含:完整轨道动力学、地球椭球曲率、姿态时间序列、时间变化场景、云的三维辐射传输、偏振以及基于严格大气点扩散函数的邻接效应。这些限制不影响局部场景和给定航迹条件下的端到端成像试验,但不应把当前输出直接等同于经过几何处理的任务级卫星产品。

相关 API

  • less.Pushbroomless.OpticalImager
  • less.Instrumentless.Sentinel2A
  • less.Atmosphereless.Scene.simulate()
  • less.Product.save()less.Product.geolocation