跳转至

10 - 叶片光学模型

叶片的反射和透射光谱决定了植被在光学影像中的样子,也决定了叶片吸收多少光用于光合作用。LESS 提供三种叶片光学属性:

属性 输入 适用
Prospect 叶片生化参数 一般的光学模拟
Fluspect 生化参数和荧光量子产额 需要模拟叶绿素荧光
MeasuredSpectrum 实测反射率和透射率光谱 有实测叶片光谱

这些属性既可以直接赋给三角网格叶片,也可以作为统计植被(第 12 章)中代表叶片的光学属性。

PROSPECT

PROSPECT 把叶片看作多层平板,由色素、水分和干物质含量计算 400–2500 nm 的反射率和透射率:

import less

leaf = less.Prospect(cab=45, car=10, canth=0, cbrown=0, cw=0.012, cm=0.008, N=1.5)
参数 含义 常见范围 单位
cab 叶绿素 a+b 10–80 μg cm⁻²
car 类胡萝卜素 5–20 μg cm⁻²
canth 花青素 0–40 μg cm⁻²
cbrown 褐色素 0–1 —
cw 等效水厚度 0.005–0.03 cm
cm 干物质 0.003–0.015 g cm⁻²
N 叶肉结构参数 1.0–3.0 —

各参数主要影响的波段:

波段 主要影响参数
400–500 nm cab、car 的强吸收
500–600 nm cab 吸收减弱,形成绿峰
600–700 nm cab;canth 吸收绿光和红光
700–750 nm(红边) cab 与 N 决定红边的位置和斜率
750–1300 nm N 决定叶肉散射,cab 几乎没有影响
1300–2500 nm cw 的水吸收带和 cm

几种典型的叶片状态:

green = less.Prospect(cab=45, car=10, cw=0.012, cm=0.008, N=1.5)
yellow = less.Prospect(cab=5, car=15, cbrown=0.3, cw=0.008, cm=0.010, N=2.0)
red = less.Prospect(cab=3, car=5, canth=30, cbrown=0.15, cw=0.010, cm=0.009, N=1.8)

用 evaluate() 计算并比较它们的光谱:

import numpy as np
import matplotlib.pyplot as plt

wavelengths = np.arange(400, 2501, 5)
fig, ax = plt.subplots(figsize=(7, 4))
for name, model in [("green", green), ("yellow", yellow), ("red", red)]:
    ax.plot(wavelengths, model.evaluate(wavelengths)["reflectance"], label=name)
ax.set_xlabel("Wavelength (nm)")
ax.set_ylabel("Reflectance")
ax.legend()
fig.savefig("leaf_spectra.png", dpi=150, bbox_inches="tight")

FLUSPECT

FLUSPECT 在 PROSPECT 的基础上计算叶片的叶绿素荧光。参数基本相同(花青素写作 can),另外通过 fqe 给出荧光量子产额:

fluorescent_leaf = less.Fluspect(cab=45, car=10, cw=0.012, cm=0.006, N=1.5, fqe=0.012)
print(fluorescent_leaf.evaluate([550, 850]))
  • fqe 为一个数值时,荧光产额固定;
  • fqe=(0.002, 0.01) 分别给出光系统 I 和光系统 II 的产额,可以分开计算两者的荧光;
  • fqe="dynamic" 时,荧光产额由光合作用模型计算。

不需要荧光时,两种模型都可以用于光学模拟。荧光的计算和成像见第 27 章和第 33 章。

实测光谱

有实测的叶片光谱时,使用 MeasuredSpectrum:

measured = less.MeasuredSpectrum(
    wavelengths=[400, 500, 550, 650, 700, 750, 850, 1650, 2200],
    reflectance=[0.05, 0.07, 0.13, 0.07, 0.25, 0.45, 0.48, 0.32, 0.15],
    back_reflectance=[0.07, 0.09, 0.15, 0.09, 0.28, 0.46, 0.49, 0.33, 0.17],
    transmittance=[0.01, 0.04, 0.10, 0.03, 0.20, 0.42, 0.45, 0.35, 0.12],
)
  • reflectance 是叶片正面的反射率,back_reflectance 是背面的反射率,不给出时两面相同;
  • 不给出 transmittance 时,叶片不透光;
  • 光谱按模拟波长线性插值。

正面和背面由三角形的朝向决定(见第 5 章)。

实测光谱本身不包含各种色素分别吸收了多少光。用于光合作用时,可以给出一个色素分区模型,让 LESS 估算叶绿素吸收的部分:

leaf_for_photosynthesis = less.MeasuredSpectrum(
    wavelengths=[400.0, 550.0, 700.0],
    reflectance=[0.08, 0.12, 0.18],
    transmittance=[0.04, 0.08, 0.12],
    absorption_partition=less.ProspectPartition(cab=45.0),
)

光谱库中的叶片

内置光谱库中的叶片光谱可以直接使用:

birch = less.SpectrumDB("birch_leaf_green")
larch = less.SpectrumDB("larch_leaf_green")

在场景中使用

tree = less.Object("ash", mesh=less.asset_path("FREX.obj"))
tree.set_property("leaves", green)
tree.set_property("stem_branch", less.Lambertian(reflectance=0.08))

scene = less.Scene()
scene.size = 20.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.12))
scene.illumination = less.Illumination(
    source=less.Sun(zenith=35, azimuth=150), atmosphere=less.NoAtmosphere())
scene.add(tree, positions=[[10, 10, 0]])

sensor = less.OpticalImager(less.Orthographic(image_size=128),
                            bands=[650, 550, 450], quality=32)
summer = scene.simulate(sensor)

tree.set_property("leaves", red)
autumn = scene.simulate(sensor)

下一步