30 - Microwave brightness temperature¶
MicrowaveRadiometer computes the polarised brightness temperature of a 3-D scene: microwave emission from soil, crowns and trunks that reaches the sensor through the canopy and the atmosphere. Scenes are built in the same way as for radar (chapter 29), and in addition every part needs a temperature. Brightness temperature, water content and rough-surface models are explained in chapter 28.
The scene¶
import less
from less.distributions import Beta, SinePower
scene = less.Scene()
scene.size = 30.0
scene.repetitive = True
scene.terrain = less.Terrain(property=less.MicrowaveSoil(
sand_fraction=0.3, clay_fraction=0.2, soil_moisture=0.25,
dielectric_model="mironov",
surface_model="hqn", roughness_h=0.6, roughness_nv=-1.0, roughness_nh=0.0,
temperature_surface=291.0, temperature_deep=288.0))
tree = less.Object("tree")
tree.add_component("crown", less.TurbidBoundary(less.asset_path("tutorial_tree.obj"), group="crown"))
tree.add_component("trunk", less.Mesh(less.asset_path("tutorial_tree.obj"), group="trunk"))
tree.set_property("crown", less.MicrowaveVegetation(components=[
less.MicrowaveLeaf(radius=0.025, thickness=0.0002, density=1500.0,
moisture=0.55, dry_density=0.3, temperature=297.0,
orientation=Beta(1.101, 1.930)),
less.MicrowaveBranch(radius=0.015, length=1.0, density=2.0,
moisture=0.45, dry_density=0.4, temperature=297.0,
orientation=SinePower(exponent=2.0)),
]))
tree.set_property("trunk", less.MicrowaveTrunk(moisture=0.45, dry_density=0.45, temperature=294.0))
scene.add(tree, positions=[(8.0, 9.0, 0.0), (21.0, 18.0, 0.0)])
- Soil:
surface_model="hqn"is the H-Q-N roughness model used by SMOS and L-MEB, with parametersroughness_h,polarization_mixing,roughness_nvandroughness_nh. The statistical rough-surface models"small_perturbation","physical_optics"and"geometric_optics"(described byrms_height_cmandcorrelation_length_cm) or the smooth"specular"can also be used. The soil temperaturestemperature_surfaceandtemperature_deepare combined into an effective temperature following Wigneron et al.; - Temperatures: each kind of crown scatterer, each trunk and the soil have their own temperature. A thermal property on a component or per-tree trunk properties replace the temperatures given here;
- Trunks: explicit trunks should have diameters no smaller than the wavelength (21 cm at L band); thinner woody parts are described by
MicrowaveBranchin the crown.
Simulation¶
sensor = less.MicrowaveRadiometer(
geometry=less.Orthographic(image_size=128, view_zenith=40.0),
frequency=1.4e9,
polarization="HV",
quality=32,
scattering_samples=8192,
atmosphere_optical_depth=0.01,
)
product = scene.simulate(sensor)
tb_h, tb_v = product.Tb_H, product.Tb_V # per pixel, K
soil = product.sources["soil"] # (rows, columns, 4)
scattering_samples (default 200 000) is the number of samples for angular integrals over scatterers, and quality the number of samples per pixel; they control different errors.
volume_scattering=True includes vegetation volume scattering by default.
Set it to False for absorption-only transport: scattering extinction and
volume scattering events are removed together, while absorption, thermal
emission, soil reflection and trunk reflection are retained. Scattering loss
is not reclassified as absorption.
absorbing = less.MicrowaveRadiometer(
geometry=less.Orthographic(image_size=32, view_zenith=40),
frequency=1.4e9, volume_scattering=False,
atmosphere_optical_depth=0, quality=64)
product = scene.simulate(absorbing)
polarization sets the channels in product.data: "H", "V", "HV" or "full" (Stokes parameters I, Q, U, V, where I = T_H + T_V and Q = T_H − T_V). Orthographic and perspective projections can be used, including a sensor placed below the canopy looking up.
Where the brightness temperature comes from¶
product.sources gives the contribution of each part:
| Source | Content |
|---|---|
soil |
Soil emission seen through the canopy |
crown |
Emission from crowns |
trunk |
Emission from trunks |
sky |
Atmospheric and cosmic background reflected or scattered into the line of sight |
atmosphere |
Atmosphere between the scene and the sensor |
The sources add up to the total brightness temperature. Each source is a (rows, columns, 4) array in K, ordered as modified Stokes parameters (T_V, T_H, T_U, T_V'): channel 0 sums to Tb_V and channel 1 to Tb_H.
total_v = sum(source[:, :, 0] for source in product.sources.values())
print(abs(total_v - product.Tb_V).max())
atmosphere_optical_depth is the zenith optical depth of the atmosphere. The atmospheric temperature is the scene's air temperature, or the soil surface temperature when no microclimate is set. With 0 only the cosmic background (2.725 K) remains.
Checking sampling noise¶
Run the same scene with the same number of samples and different random seeds (the sensor's seed argument) a few times, and compare the H and V brightness temperatures of each pixel:
runs = [scene.simulate(less.MicrowaveRadiometer(
geometry=less.Orthographic(image_size=32, view_zenith=40.0),
frequency=1.4e9, polarization="HV", quality=32,
scattering_samples=8192, atmosphere_optical_depth=0.01, seed=seed))
for seed in (17, 31, 47, 73)]
import numpy as np
spread = np.std([run.Tb_H for run in runs], axis=0)
print("per-pixel standard deviation of H brightness temperature (K):", spread.mean())
The same seed repeats the same random sequence, so it does not give independent repeats. The mean over the whole image converges much faster than single pixels; when studying single pixels, look at the per-pixel standard deviation. The error of the angular scattering integrals is checked separately by increasing scattering_samples.
Notes¶
- Vegetation multiple scattering is included by default and takes longer at higher frequencies and in denser canopies;
- crowns may overlap and the ground may be sloped; periodic scenes are handled as for radar;
- uniform canopies can be compared with 1-D radiative transfer models when the scatterers, soil and atmosphere are set up consistently.
For an independent smooth-soil analytic comparison, see A9 - Microwave brightness and polarization.