Skip to main content

Spectral Indices

Per-pixel computations from two or more spectral bands. All normalized-difference indices output values in [-1, 1] as f32.

Normalized Difference

The building block for NDVI, NDWI, NBR, and NDSI:

ND(a,b)=aba+b\text{ND}(a, b) = \frac{a - b}{a + b}

Returns 0.0 when both bands are zero.

Index Reference

IndexFormulaBandsMeasuresReference
NDVIND(NIR, Red)NIR (~0.86 um), Red (~0.66 um)Vegetation healthRouse et al. (1974)
NDWIND(Green, NIR)Green (~0.56 um), NIR (~0.86 um)Open waterMcFeeters (1996)
NBRND(NIR, SWIR)NIR (~0.86 um), SWIR (~2.2 um)Burn severityKey & Benson (2006)
dNBRNBR_pre - NBR_post(derived)Burn changeKey & Benson (2006)
NDSIND(Green, SWIR)Green (~0.56 um), SWIR (~1.6 um)Snow/ice coverHall et al. (1995)
EVI2.5(NIR - Red) / (NIR + 6Red - 7.5Blue + 1)NIR, Red, BlueVegetation (high-biomass)Huete et al. (2002)
SAVI(1 + L)(NIR - Red) / (NIR + Red + L)NIR, RedVegetation (sparse, soil-corrected)Huete (1988)

Typical Thresholds

IndexValueInterpretation
NDVI > 0.6Dense green vegetation
NDVI 0.2 -- 0.6Moderate vegetation
NDVI < 0.1Bare soil, water, or cloud
NDWI > 0.0Water
NBR < -0.25High burn severity
dNBR > 0.66High burn severity
dNBR 0.27 -- 0.66Moderate burn severity
NDSI > 0.4Snow
EVI > 0.2Vegetation present
SAVI > 0.5Dense vegetation (L = 0.5)

Batch Processing

compute_index applies any two-band index function across parallel slices of pixel values. threshold converts an index image into a binary mask at a given cutoff.

let mut ndvi_img = [0.0f32; 1024];
compute_index(&nir_band, &red_band, &mut ndvi_img, ndvi);

let mut veg_mask = [false; 1024];
threshold(&ndvi_img, 0.3, &mut veg_mask);