22 - 四分量分类¶
FourComponentImager 把传感器看到的场景逐像元分为四类:光照叶片、阴影叶片、光照土壤和阴影土壤,并给出各类的可见面积。四分量常用于热红外混合像元分解、组分温度反演和方向亮温建模。
分类方法¶
每个像元发出若干条观测光线。每条光线到达场景后判断两件事:
- 落在地面还是叶片上;
- 该点能否直接看到太阳:从该点向太阳方向发一条光线,被挡住就是阴影。
两两组合得到四类。像元的标签取多数,同时保留四类各自所占的比例,混合像元的信息不会丢失。
| 标签 | 分量 | 含义 |
|---|---|---|
| 0 | background | 没有落到任何物体上 |
| 1 | sunlit_soil | 光照土壤 |
| 2 | sunlit_leaf | 光照叶片 |
| 3 | shaded_soil | 阴影土壤 |
| 4 | shaded_leaf | 阴影叶片 |
对于统计植被,光线进入冠层边界即记为叶片。
示例¶
import less
scene = less.Scene()
scene.size = 30.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.15))
scene.illumination = less.Illumination(
source=less.Sun(zenith=35, azimuth=180), atmosphere=less.NoAtmosphere())
maize = less.Object("maize", mesh=less.asset_path("maize.obj"))
maize.set_property(less.Lambertian(reflectance=0.45, transmittance=0.05))
scene.add(maize, positions=[(x, y, 0.0) for x in range(6, 25, 3) for y in range(6, 25, 3)])
sensor = less.FourComponentImager(
less.Orthographic(image_size=256, extent=20.0, center=(15.0, 15.0)),
num_samples=64)
product = scene.simulate(sensor)
print(product.summary())
product.save_classification("four_component.png")
四分量分类只能使用正射投影,这样分量面积才有明确的几何意义。num_samples 是每个像元的观测光线数,决定比例的精度。
结果¶
| 属性或方法 | 形状 | 含义 |
|---|---|---|
product.labels |
(行, 列),uint8 | 每个像元的多数类标签 |
product.fractions |
(行, 列, 4) | 四类的比例,顺序为光照土壤、光照叶片、阴影土壤、阴影叶片 |
product.pixel_area_m2 |
数值 | 一个像元对应的地面面积 |
product.summary() |
字典 | 各分量的可见面积(m²) |
product.area(name) |
数值 | 某一分量的可见面积 |
product.save_classification(path) |
— | 保存彩色分类图 |
分量面积按比例累加:
\[A_c = \sum_{\text{像元}} f_c \, A_{\text{像元}}\]
其中 f 是该分量在像元中的比例。四个分量的面积之和等于成像范围的面积,上例中为 20 m × 20 m = 400 m²,可以用来检查结果:
areas = product.summary()
print(sum(areas[name] for name in ("sunlit_soil", "sunlit_leaf", "shaded_soil", "shaded_leaf")))
成像范围超出地面时,差额会出现在 background 中。
周期场景¶
开启周期边界后,观测光线和阴影光线都会穿过场景边界继续追踪。太阳天顶角较大时,长长的阴影可以从场景另一侧落回来,阴影土壤的面积会明显增加,而土壤的总面积不变: