Vegetation Indices in GeoIndexR

Introduction

Vegetation indices exploit the distinct spectral reflectance curve of healthy green canopies: strong absorption in the red chlorophyll band (0.64 - 0.67 um) and high scattering/reflectance in the near-infrared (NIR) plateau (0.85 - 0.88 um).

GeoIndexR provides four primary vegetation indices, each tailored to different canopy densities and atmospheric or soil conditions:

  1. NDVI: Normalized Difference Vegetation Index
  2. SAVI: Soil Adjusted Vegetation Index
  3. EVI: Enhanced Vegetation Index
  4. GNDVI: Green Normalized Difference Vegetation Index

Formulations and Parameters

1. NDVI (Normalized Difference Vegetation Index)

Rouse et al. (1974) formulated the normalized ratio:

\[\text{NDVI} = \frac{\text{NIR} - \text{RED}}{\text{NIR} + \text{RED}}\]

library(GeoIndexR)
img <- get_example_data()

ndvi <- geo_index(img, "NDVI")
index_summary(ndvi)
#> 
#> === GeoIndexR Spectral Summary ===
#> 
#>  index     min    max   mean median     sd     q05     q25    q75    q95 na_pct
#>   NDVI -0.5508 0.9233 0.2963 0.1161 0.4884 -0.3796 -0.0787 0.8546 0.8972      1
#>  total_cells
#>          100

2. SAVI (Soil Adjusted Vegetation Index)

In areas with sparse or intermediate canopy cover (\(< 40\%\)), exposed background soil alters the red and near-infrared reflectance. Huete (1988) introduced the soil adjustment factor \(L\):

\[\text{SAVI} = \frac{\text{NIR} - \text{RED}}{\text{NIR} + \text{RED} + L} \times (1 + L)\]

In GeoIndexR, \(L\) is configurable directly through geo_index() or calc_savi():

savi_standard <- geo_index(img, "SAVI", L = 0.5)
savi_sparse   <- geo_index(img, "SAVI", L = 1.0)

index_summary(c(savi_standard, savi_sparse))
#> 
#> === GeoIndexR Spectral Summary ===
#> 
#>  index     min    max   mean median     sd     q05     q25    q75    q95 na_pct
#>   SAVI -0.1194 0.8802 0.3094 0.0933 0.3727 -0.0594 -0.0209 0.7361 0.8293      1
#>   SAVI -0.1091 0.8601 0.2939 0.0863 0.3518 -0.0430 -0.0148 0.6854 0.8019      1
#>  total_cells
#>          100
#>          100

3. EVI (Enhanced Vegetation Index)

Liu & Huete (1995) designed EVI to decouple the canopy background signal and reduce atmospheric influences through blue band feedback:

\[\text{EVI} = G \times \frac{\text{NIR} - \text{RED}}{\text{NIR} + C_1 \times \text{RED} - C_2 \times \text{BLUE} + L}\]

Default coefficients (standard MODIS/Sentinel-2/Landsat): - \(G = 2.5\) (Gain factor) - \(C_1 = 6.0\) (Aerosol coefficient for red) - \(C_2 = 7.5\) (Aerosol coefficient for blue) - \(L = 1.0\) (Canopy background adjustment)

evi <- geo_index(img, "EVI")
index_summary(evi)
#> 
#> === GeoIndexR Spectral Summary ===
#> 
#>  index     min    max  mean median    sd     q05     q25    q75    q95 na_pct
#>    EVI -0.1012 1.1634 0.373  0.089 0.457 -0.0821 -0.0267 0.8837 1.0352      1
#>  total_cells
#>          100

4. GNDVI (Green NDVI)

Gitelson et al. (1996) substituted the red band with the green band to enhance sensitivity to chlorophyll concentrations in dense canopies where red reflectance becomes saturated:

\[\text{GNDVI} = \frac{\text{NIR} - \text{GREEN}}{\text{NIR} + \text{GREEN}}\]

gndvi <- geo_index(img, "GNDVI")
index_summary(gndvi)
#> 
#> === GeoIndexR Spectral Summary ===
#> 
#>  index     min    max   mean median     sd     q05     q25    q75    q95 na_pct
#>  GNDVI -0.7652 0.8373 0.2001 0.2426 0.5451 -0.6222 -0.4403 0.7482 0.7976      1
#>  total_cells
#>          100

Comparing Vegetation Indices

You can stack all four indices together:

veg_stack <- geo_indices(img, c("NDVI", "SAVI", "EVI", "GNDVI"))
index_summary(veg_stack)
#> 
#> === GeoIndexR Spectral Summary ===
#> 
#>  index     min    max   mean median     sd     q05     q25    q75    q95 na_pct
#>   NDVI -0.5508 0.9233 0.2963 0.1161 0.4884 -0.3796 -0.0787 0.8546 0.8972      1
#>   SAVI -0.1194 0.8802 0.3094 0.0933 0.3727 -0.0594 -0.0209 0.7361 0.8293      1
#>    EVI -0.1012 1.1634 0.3730 0.0890 0.4570 -0.0821 -0.0267 0.8837 1.0352      1
#>  GNDVI -0.7652 0.8373 0.2001 0.2426 0.5451 -0.6222 -0.4403 0.7482 0.7976      1
#>  total_cells
#>          100
#>          100
#>          100
#>          100