10 - 叶片光学模型¶
叶片的反射和透射光谱决定了植被在光学影像中的样子,也决定了叶片吸收多少光用于光合作用。LESS 提供三种叶片光学属性:
| 属性 | 输入 | 适用 |
|---|---|---|
Prospect |
叶片生化参数 | 一般的光学模拟 |
Fluspect |
生化参数和荧光量子产额 | 需要模拟叶绿素荧光 |
MeasuredSpectrum |
实测反射率和透射率光谱 | 有实测叶片光谱 |
这些属性既可以直接赋给三角网格叶片,也可以作为统计植被(第 12 章)中代表叶片的光学属性。
PROSPECT¶
PROSPECT 把叶片看作多层平板,由色素、水分和干物质含量计算 400–2500 nm 的反射率和透射率:
| 参数 | 含义 | 常见范围 | 单位 |
|---|---|---|---|
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),
)
光谱库中的叶片¶
内置光谱库中的叶片光谱可以直接使用:
在场景中使用¶
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)