- Home
- Documentation
- API reference
- Corrections
- hyperproc.correct.kernels
hyperproc.correct.kernels¶
Source-derived reference
Generated from the current hyperproc 0.1.2 checkout.
Implementation: hyperproc/correct/kernels.py. Signatures, defaults, docstrings, and expandable source are extracted statically; the module is not imported or executed. Names beginning with _ are implementation details, not a stable public API.
Use the function signature as the authority for individual parameter defaults and return annotations. Original docstrings sometimes group parameter names or wrap return descriptions across lines; these descriptions are preserved rather than inferred or rewritten.
BRDF kernels: Ross (volume scattering) and Li (geometric-optical) families.
Written from the equations, not ported from another implementation:
- Ross-thick / Ross-thin - Roujean et al. (1992) after Ross (1981), in the form used by the MODIS BRDF/albedo algorithm (Wanner, Li & Strahler 1995; Lucht, Schaaf & Strahler 2000, eqs 38-39).
- Li-sparse / Li-dense and their reciprocal variants - Wanner et al. (1995) eqs 32-34, with the reciprocal forms of Lucht et al. (2000) eq 40-41. The "R" kernels are symmetric in the two zenith angles and are what MODIS and FlexBRDF (Queally et al. 2022) use.
Conventions, chosen to match the rest of hyperproc:
- All angles in radians. Zenith angles are measured from the vertical.
raais the relative azimuthvaa - saa. Every kernel depends on it only throughcos(raa)andsin^2(raa), so its sign and any multiple of 2 pi are irrelevant -hyperprocreaders'raa(mod 360, in degrees) can be passed straight throughnp.radians.b_randh_bare the Li-kernel crown shape ratios:b/r(vertical to horizontal crown radius) andh/b(crown centre height to vertical radius). MODIS usesb_r = 1, h_b = 2(spherical crowns). Published NEON processing usedb_r = 2.5; that is a modelling choice, not a default this module makes for you.
Every kernel is exactly zero for an overhead sun and nadir view, which is the first thing the tests check.
VOLUME_KERNELS = ('ross_thick', 'ross_thin')
module-attribute
¶
GEOMETRIC_KERNELS = ('li_sparse', 'li_dense', 'li_sparse_r', 'li_dense_r')
module-attribute
¶
phase_angle(sza, vza, raa)
¶
Scattering phase angle xi between the sun and view directions.
ross_thick(sza, vza, raa)
¶
Ross-thick kernel (dense leaf canopy), Lucht et al. 2000 eq 38.
ross_thin(sza, vza, raa)
¶
Ross-thin kernel (sparse leaf canopy), Wanner et al. 1995 eq 29.
volume_kernel(kind, sza, vza, raa)
¶
Dispatch by name: "ross_thick" or "ross_thin".
Source code in hyperproc/correct/kernels.py
_li_terms(sza, vza, raa, b_r, h_b)
¶
The shared pieces of every Li kernel, Wanner et al. 1995 eqs 43-47.
The crown shape enters twice: b_r rescales both zenith angles to the
equivalent spherical-crown geometry (eq 47), h_b sets the height at
which the two shadows overlap (eq 44). cos t is clipped to [-1, 1] -
beyond that the shadows do not overlap at all and the overlap term is 0.
Source code in hyperproc/correct/kernels.py
li_sparse(sza, vza, raa, b_r=1.0, h_b=2.0)
¶
Li-sparse kernel, Wanner et al. 1995 eq 32 (not reciprocal).
li_sparse_r(sza, vza, raa, b_r=1.0, h_b=2.0)
¶
Li-sparse-reciprocal kernel, Lucht et al. 2000 eq 40 (MODIS).
Source code in hyperproc/correct/kernels.py
li_dense(sza, vza, raa, b_r=1.0, h_b=2.0)
¶
Li-dense kernel, Wanner et al. 1995 eq 33 (not reciprocal).
li_dense_r(sza, vza, raa, b_r=1.0, h_b=2.0)
¶
Li-dense-reciprocal kernel, Lucht et al. 2000 eq 41 (FlexBRDF default).
Source code in hyperproc/correct/kernels.py
geometric_kernel(kind, sza, vza, raa, b_r=1.0, h_b=2.0)
¶
Dispatch by name over :data:GEOMETRIC_KERNELS.
Source code in hyperproc/correct/kernels.py
kernel_pair(sza, vza, raa, volume='ross_thick', geometric='li_dense_r', b_r=1.0, h_b=2.0)
¶
Both kernels at once, as (k_vol, k_geo). Angles in radians.
Source code in hyperproc/correct/kernels.py
reference_kernels(sza_ref, volume='ross_thick', geometric='li_dense_r', b_r=1.0, h_b=2.0)
¶
Kernels for the normalisation target: nadir view under solar zenith sza_ref.
This is what a BRDF-normalised ("NBAR-like") reflectance is expressed at.
With vza = 0 the relative azimuth is irrelevant; 0 is passed.