跳转至

06 - 地形与光学属性

本章介绍 LESS 的各种光学属性模型,以及如何为不同的场景元素设置合适的属性。

光学属性概览

LESS 提供多种光学属性模型,适用于不同的地表类型:

属性类型 适用对象 特点
Lambertian 土壤、人工表面 各方向均匀反射,最简单
Prospect 绿色叶片 由叶片生化参数计算光谱
RPV 任何非朗伯表面 参数化 BRDF 模型
SpectrumDB / SpectrumLibrary 各种表面 从内置数据库加载实测光谱

Lambertian —— 朗伯体

朗伯体是最简单的光学模型:入射光被各方向均匀反射。

标量反射率

import less

# 恒定反射率(所有波长相同)
soil = less.Lambertian(reflectance=0.15)

光谱反射率

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 更精确)
simple_leaf = less.Lambertian(
    reflectance=0.1,
    transmittance=0.05,
)

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) 模型描述非朗伯表面的方向反射特性:

# 典型森林冠层 BRDF
forest_brdf = less.RPV(rho0=0.05, k=0.7, theta=-0.1)
参数 含义
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(欧洲白蜡树)有两个组件:leavesstem_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}")

配套脚本:scripts/06_terrain_properties.py

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.Lambertianless.Prospectless.RPV
  • less.SpectrumLibrary
  • less.Sceneless.Terrainless.Object
  • less.Orthographicless.OpticalImager