06 - 地形与光学属性¶
本章介绍 LESS 的各种光学属性模型,以及如何为不同的场景元素设置合适的属性。
光学属性概览¶
LESS 提供多种光学属性模型,适用于不同的地表类型:
| 属性类型 | 适用对象 | 特点 |
|---|---|---|
Lambertian |
土壤、人工表面 | 各方向均匀反射,最简单 |
Prospect |
绿色叶片 | 由叶片生化参数计算光谱 |
RPV |
任何非朗伯表面 | 参数化 BRDF 模型 |
SpectrumDB / SpectrumLibrary |
各种表面 | 从内置数据库加载实测光谱 |
Lambertian —— 朗伯体¶
朗伯体是最简单的光学模型:入射光被各方向均匀反射。
标量反射率¶
光谱反射率¶
import numpy as np
# 指定波长和对应的反射率
wavelengths = [400, 500, 600, 700, 800, 900, 1000]
reflectance = [0.03, 0.05, 0.08, 0.10, 0.25, 0.30, 0.32]
soil = less.Lambertian(
reflectance=reflectance,
wavelengths=wavelengths,
)
当模拟的波段不在给定的波长列表中时,LESS 会自动进行线性插值。
透射属性¶
对于叶片等半透明材料,Lambertian 也支持透射率:
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 | 无量纲 |
不同叶片状态¶
# 健康绿叶
green_leaf = less.Prospect(
cab=45, car=10, canth=0, cbrown=0,
cw=0.012, cm=0.008, N=1.5,
)
# 衰老黄叶
yellow_leaf = less.Prospect(
cab=5, car=15, canth=0, cbrown=0.3,
cw=0.008, cm=0.010, N=2.0,
)
# 秋季红叶(高花青素)
red_leaf = less.Prospect(
cab=3, car=5, canth=30, cbrown=0.15,
cw=0.010, cm=0.009, N=1.8,
)
物理意义¶
Prospect 模型的核心思想是将叶片视为多层平行板结构:
- 叶绿素 (cab):吸收红光和蓝光,反射绿光 → 决定叶片的"绿色"程度
- 类胡萝卜素 (car):吸收蓝光 → 保护叶绿素
- 花青素 (canth):吸收绿光 → 产生红紫色
- 水分 (cw):影响近红外到短波红外的吸收
- 结构参数 (N):叶片内部气腔数量 → 影响近红外散射
RPV —— BRDF 模型¶
RPV (Rahman-Pinty-Verstraete) 模型描述非朗伯表面的方向反射特性:
| 参数 | 含义 |
|---|---|
rho0 |
总反射率量级 |
k |
碗形/钟形参数(<1 碗形,>1 钟形) |
theta |
前向/后向散射(<0 后向散射增强,热点效应) |
RPV 模型在 第 10 章 中有更详细的介绍。
SpectrumLibrary —— 内置光谱库¶
LESS 内置了多种实测光谱数据,覆盖常见的自然和人工表面:
lib = less.SpectrumLibrary()
# 列出所有可用光谱
names = lib.list_spectra()
for name in names[:10]:
print(name)
# 查看某个光谱的数据
data = lib.get("birch_leaf_green")
print(f"波长: {data['wavelength'][:5]} ... nm")
print(f"反射率: {data['reflectance'][:5]} ...")
# 直接转为 Property 对象
birch_leaf = lib.as_property("birch_leaf_green")
为物体设置属性¶
单组件物体¶
如果 OBJ 文件只有一个组件(或者您希望所有组件使用相同属性),可以不指定组件名:
maize = less.Object("maize", mesh=less.examples.asset_path("maize.obj"))
maize.set_property(less.Prospect(cab=40, car=8, cw=0.012, cm=0.006, N=1.5))
多组件物体¶
FREX.obj(欧洲白蜡树)有两个组件:leaves 和 stem_branch。可以为它们分别设置不同的属性:
tree = less.Object("ash", mesh=less.examples.asset_path("FREX.obj"))
# 查看组件列表
print(tree.components) # ['leaves', 'stem_branch']
# 叶片:Prospect 模型
tree.set_property("leaves", less.Prospect(cab=40, car=10, cw=0.012, cm=0.008, N=1.5))
# 树干/枝条:低反射率朗伯体
tree.set_property("stem_branch", less.Lambertian(reflectance=0.08))
完整示例:玉米 + 土壤场景¶
import less
import numpy as np
scene = less.Scene()
scene.size = 10.0
# 土壤:偏暗的朗伯体
scene.terrain = less.Terrain(
property=less.Lambertian(reflectance=0.12)
)
# 光照
scene.illumination = less.Illumination(source=less.Sun(zenith=30, azimuth=150), atmosphere=less.NoAtmosphere())
# 玉米
maize = less.Object("maize", mesh=less.examples.asset_path("maize.obj"))
maize.set_property(less.Prospect(cab=45, car=10, cw=0.012, cm=0.006, N=1.55))
# 在场景中放置 9 棵玉米(3×3 网格)
xs = np.linspace(2, 8, 3)
ys = np.linspace(2, 8, 3)
gx, gy = np.meshgrid(xs, ys)
positions = np.column_stack([gx.ravel(), gy.ravel(), np.zeros(9)])
scene.add(maize, positions=positions)
sensor = less.OpticalImager(
less.Orthographic(image_size=512),
bands=[650, 550, 450, 842], # R, G, B, NIR
quality=128,
)
image = scene.simulate(sensor)
image.save("06_maize_grid.png")
# 访问 NIR 波段数据
data = image.data
nir = data[:, :, 3] # 第 4 波段 = 842 nm (NIR)
red = data[:, :, 0] # 第 1 波段 = 650 nm (Red)
# 计算 NDVI
ndvi = (nir - red) / (nir + red + 1e-10)
print(f"NDVI 范围: {ndvi.min():.2f} ~ {ndvi.max():.2f}")
Prospect 参数对光谱的影响¶
理解 Prospect 各参数如何影响光谱,有助于正确设置模拟参数:
| 波段范围 | 主要影响因素 |
|---|---|
| 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(干物质) |
叶绿素
cab几乎只影响 400-750 nm 范围。在近红外波段,叶片的高反射率主要由叶肉结构(N)决定。
下一步¶
相关 API¶
less.Lambertian、less.Prospect、less.RPVless.SpectrumLibraryless.Scene、less.Terrain、less.Objectless.Orthographic、less.OpticalImager