spectralIndices(img, blue = NULL, green = NULL, red = NULL, nir = NULL, swir1 = NULL, swir2 = NULL, scaleFactor = 1, indices = NULL, index = NULL, coefs = list(L = 0.5, G = 2.5, L_evi = 1, C1 = 6, C2 = 7.5, s = 1, swir2ccc = NULL, swir2coc = NULL), ...)
indices
.spectralIndices
calculates all indices in one go in C++, i.e. one call to raster::calc, which is far more efficient, than calculating each index separately (for large rasters).
By default all indices which can be calculated given the specified indices will be calcultated. If you don't want all indices, use the indices
argument to specify exactly which indices are to be calculated.
See the table bellow for index names and required bands.
Index values outside the valid value ranges (if such a range exists) will be set to NA. For example a pixel with NDVI > 1 will be set to NA.
Index | Description | Source | Bands |
Formula | CTVI | Corrected Transformed Vegetation Index | Perry1984 |
red, nir |
$(NDVI + 0.5)/sqrt(abs(NDVI + 0.5))$ | DVI | Difference Vegetation Index |
Richardson1977 | red, nir |
$s * nir - red$ | EVI |
Enhanced Vegetation Index | Huete1999 | red, nir, blue |
$G * ((nir - red)/(nir + C1 * red - C2 * blue + L_evi))$ |
EVI2 | Two-band Enhanced Vegetation Index | Jiang 2008 | red, nir |
$G * (nir - red)/(nir + 2.4 * red + 1)$ | GEMI | Global Environmental Monitoring Index | Pinty1992 |
red, nir |
$(((nir^2 - red^2) * 2 + (nir * 1.5) + (red * 0.5))/(nir + red + 0.5)) * (1 - ((((nir^2 - red^2) * 2 + (nir * 1.5) + (red * 0.5))/(nir + red + 0.5)) * 0.25)) - ((red - 0.125)/(1 - red))$ | LSWI | Land Surface Water Index |
Xiao2004 | nir, swir1 |
$(nir - swir1)/(nir + swir1)$ | MNDWI |
Modified Normalised Difference Water Index | green, swir1 |
$(green - swir1)/(green + swir1)$ | |
MSAVI | Modified Soil Adjusted Vegetation Index | Qi1994 | red, nir |
$nir + 0.5 - (0.5 * sqrt((2 * nir + 1)^2 - 8 * (nir - (2 * red))))$ | MSAVI2 | Modified Soil Adjusted Vegetation Index 2 | Qi1994 |
red, nir |
$(2 * (nir + 1) - sqrt((2 * nir + 1)^2 - 8 * (nir - red)))/2$ | NBRI | Normalised Burn Ratio Index |
nir, swir2 |
$(nir - swir2)/(nir + swir2)$ | NDVI | |
Normalised Difference Vegetation Index | Rouse1974 | red, nir |
$(nir - red)/(nir + red)$ |
NDVIC | Corrected Normalised Difference Vegetation Index | Nemani1993 | red, nir, swir2 |
$(nir - red)/(nir + red) * (1 - ((swir2 - swir2ccc)/(swir2coc - swir2ccc)))$ | NDWI | Normalised Difference Water Index | Gao1996 |
green, nir |
$(green - nir)/(green + nir)$ | NRVI | Normalised Ratio Vegetation Index |
Baret1991 | red, nir |
$(red/nir - 1)/(red/nir + 1)$ | RVI |
Ratio Vegetation Index | red, nir |
$red/nir$ | |
SATVI | Soil Adjusted Total Vegetation Index | red, swir1, swir2 |
|
$(swir1 - red)/(swir1 + red + L) * (1 + L) - (swir2/2)$ | SAVI | Soil Adjusted Vegetation Index | Huete1988 |
red, nir |
$(nir - red) * (1 + L)/(nir + red + L)$ | SLAVI | Specific Leaf Area Vegetation Index |
Lymburger2000 | red, nir, swir2 |
$nir/(red + swir2)$ | SR |
Simple Ratio Vegetation Index | Birth1968 | red, nir |
$nir/red$ |
TVI | Transformed Vegetation Index | Deering1975 | red, nir |
$sqrt((nir - red)/(nir + red) + 0.5)$ | TTVI | Thiam's Transformed Vegetation Index | Thiam1997 |
red, nir |
$sqrt(abs((nir - red)/(nir + red) + 0.5))$ | Index | Description |
Some indices require additional parameters, such as the slope of the soil line wich are specified via a list to the coefs
argument.
Although the defaults are sensible values, values like the soil brigthness factor L
for SAVI should be adapted depending on the characteristics of the scene.
The coefficients are:
Coefficient | Description |
Affected Indices |
s |
slope of the soil line | DVI, WDVI |
L_evi, C1, C2, G |
various |
EVI |
L |
soil brightness factor | SAVI, SATVI |
swir2ccc |
minimum swir2 value (completely closed forest canopy) |
NDVIC |
swir2coc |
maximum swir2 value (completely open canopy) | NDVIC |
The wavelength band names are defined following Schowengertd 2007, p10 as:
Band | Description | Wavl_min |
Wavl_max | vis | visible |
400 | 700 | nir |
near infra-red | 700 | 1100 |
swir1 | short-wave infra-red | 1100 |
1351 | swir2 | short-wave infra-red |
1400 | 1800 | swir3 |
short-wave infra-red | 2000 | 2500 |
mir1 | mid-wave infra-red | 3000 |
4000 | mir2 | mid-wave infra-red |
45000 | 5000 | tir1 |
thermal infra-red | 8000 | 9500 |
library(ggplot2)
library(raster)
data(lsat)
## Calculate NDVI
ndvi <- spectralIndices(lsat, red = "B3_dn", nir = "B4_dn", indices = "NDVI")
ndvi
ggR(ndvi, geom_raster = TRUE) +
scale_fill_gradientn(colours = c("black", "white"))
## Calculate all possible indices, given the provided bands
## Convert DNs to reflectance (required to calculate EVI and EVI2)
mtlFile <- system.file("external/landsat/LT52240631988227CUB02_MTL.txt", package="RStoolbox")
lsat_ref <- radCor(lsat, mtlFile, method = "apref")
SI <- spectralIndices(lsat_ref, red = "B3_tre", nir = "B4_tre")
plot(SI)
Run the code above in your browser using DataLab