27 - 荧光成像¶
植物吸收的光有一小部分以叶绿素荧光的形式重新发出,波段在 650–850 nm,峰值约在 687 nm 和 740 nm。日光诱导叶绿素荧光(SIF)与光合作用密切相关。荧光成像分两步:
- 计算每片叶子发出多少荧光,称为荧光源项;
- 用
SIFImager观测,荧光在冠层中传播、被叶片和土壤散射和吸收后到达传感器。
本章使用固定的荧光量子产额。荧光随光合作用变化的情形见第 33 章。
场景¶
叶片必须使用 FLUSPECT(第 10 章),它给出叶片的反射、透射、吸收和荧光光谱,fqe 是荧光量子产额:
import less
scene = less.Scene()
scene.size = 6.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.15))
scene.illumination = less.Illumination(
source=less.Sun(zenith=30, azimuth=150), atmosphere=less.NoAtmosphere())
plant = less.Object("plant")
plant.add_component("leaves", less.Mesh(less.asset_path("tutorial_tree.obj"), group="leaves"))
plant.set_property("leaves", less.Fluspect(N=1.5, cab=45, car=10, cw=0.012, cm=0.006, fqe=0.012))
scene.add(plant, positions=[(3, 3, 0)])
荧光源项与影像¶
source = scene.simulate(less.SIFProcess(mode="static", quality="high"))
image = scene.simulate(less.SIFImager(
less.Orthographic(image_size=64),
bands=[687.0, 740.0, 760.0],
quality=32,
sif_result=source,
))
image.save("sif.tif")
print(image.data.mean(axis=(0, 1))) # W m⁻² sr⁻¹ nm⁻¹
SIFProcess(mode="static") 用 Fluspect.fqe 计算荧光源项,不需要温度和光合作用参数。结果是传感器观测到的荧光辐亮度,单位 W m⁻² sr⁻¹ nm⁻¹,不包括反射的太阳光。
受光叶片和阴影叶片¶
每片叶子有两份荧光源:阴影部分只由天空光和多次散射激发,受光部分还加上太阳直射的激发。成像时,观测光线落在叶面上的那一点能否看到太阳,决定它发出哪一份荧光。因此同一片叶子上的光斑和阴影会保留在影像中,叶片网格不需要为此细分。
两个光系统¶
给出两个光系统各自的量子产额,可以分别得到光系统 I 和光系统 II 的荧光影像,两者相加等于总荧光:
plant.set_property("leaves", less.Fluspect(N=1.5, cab=45, car=10, cw=0.012, cm=0.006,
fqe=(0.002, 0.01))) # (PSI, PSII)
split = scene.simulate(less.SIFProcess(mode="static", quality="high"))
psii = scene.simulate(less.SIFImager(
less.Orthographic(image_size=64), bands=[687.0, 740.0],
sif_result=split, photosystem="PSII"))
psi = scene.simulate(less.SIFImager(
less.Orthographic(image_size=64), bands=[687.0, 740.0],
sif_result=split, photosystem="PSI"))
只给出一个产额时,两个光系统的荧光合在一起,不能再分开。
大气与观测高度¶
使用 less.Atmosphere 时,可以给出大气层顶或某一高度的荧光辐亮度,荧光沿观测路径的大气透过率会被计入:
scene.illumination = less.Illumination(
source=less.Sun(zenith=30, azimuth=150),
atmosphere=less.Atmosphere.standard("us76", aot550=0.1))
airborne_source = scene.simulate(less.SIFProcess(mode="static", quality="high"))
airborne = scene.simulate(less.SIFImager(
less.Orthographic(image_size=64), bands=[687.0, 740.0], quality=32,
sif_result=airborne_source, observation_altitude_km=3.0))
光照或场景改变后要重新计算荧光源项,旧的源项不能用于新的场景状态。