Function calculates a variety of hyperspectral vegetation indices


vegindex(x, index, returnHCR = "auto", L = 0.5, 
         weighted = TRUE, ...)



Object of class Speclib


Character string. Name or definition of index or vector with names/definitions of indices to calculate. See Details section for further information.


If TRUE, the result will be of class HyperSpecRaster, otherwise it is a data frame. If "auto", the class is automatically determined by passed Speclib.


Factor for SAVI index. Unused for other indices.


Logical indicating if reflectance values should be interpolated to fit wavelength position. If FALSE the reflectance values of nearest neighbour to passed position are returned. See get_reflectance for further explanation.


Further arguments passed to derivative functions. Only used for indices requiring derivations.


Index must be a charater vector containing pre-defined indices (selected by their name) or self defined indices or any combination of pre- and self-defined indices.

Pre-defined indices

The following indices are available:

Name Formula Reference*
Boochs D_{703} Boochs et al. (1990)
Boochs2 D_{720} Boochs et al. (1990)
CAI 0.5*(R_{2000}+R_{2200})-R_{2100} Nagler et al. (2003)
CARI a = (R_{700}-R_{550}) / 150 Kim et al. (1994)
b = R_{550}-(a*550)
Carter R_{695}/R_{420} Carter (1994)
Carter2 R_{695}/R_{760} Carter (1994)
Carter3 R_{605}/R_{760} Carter (1994)
Carter4 R_{710}/R_{760} Carter (1994)
Carter5 R_{695}/R_{670} Carter (1994)
Carter6 R_{550} Carter (1994)
CI R_{675}*R_{690}/R_{683}^2 Zarco-Tejada et al.
CI2 R_{760}/R_{700}-1 Gitelson et al. (2003)
ClAInt \int_{600 nm}^{735 nm} R Oppelt and Mauser
CRI1 1/R_{515}-1/R_{550} Gitelson et al. (2003)
CRI2 1/R_{515}-1/R_{770} Gitelson et al. (2003)
CRI3 1/R_{515}-1/R_{550}*R_{770} Gitelson et al. (2003)
CRI4 1/R_{515}-1/R_{700}*R_{770} Gitelson et al. (2003)
D1 D_{730}/D_{706} Zarco-Tejada et al.
D2 D_{705}/D_{722} Zarco-Tejada et al.
Datt (R_{850}-R_{710})/(R_{850}-R_{680}) Datt (1999b)
Datt2 R_{850}/R_{710} Datt (1999b)
Datt3 D_{754}/D_{704} Datt (1999b)
Datt4 R_{672}/(R_{550}*R_{708}) Datt (1998)
Datt5 R_{672}/R_{550} Datt (1998)
Datt6 (R_{860})/(R_{550}*R_{708}) Datt (1998)
Datt7 (R_{860} - R_{2218})/(R_{860} - R_{1928}) Datt (1999a)
Datt8 (R_{860} - R_{1788})/(R_{860} - R_{1928}) Datt (1999a)
DD (R_{749}-R_{720})-(R_{701}-R_{672}) le Maire et al. (2004)
DDn 2*(R_{710}-R_{660}-R_{760}) le Maire et al. (2008)
DPI (D_{688}*D_{710})/D_{697}^2 Zarco-Tejada et al.
DWSI1 R_{800}/R_{1660} Apan et al. (2004)
DWSI2 R_{1660}/R_{550} Apan et al. (2004)
DWSI3 R_{1660}/R_{680} Apan et al. (2004)
DWSI4 R_{550}/R_{680} Apan et al. (2004)
DWSI5 (R_{800} + R_{550})/(R_{1660} + R_{680}) Apan et al. (2004)
EGFN (\max(D_{650:750})-\max(D_{500:550}))/ Penuelas et al.
(\max(D_{650:750})+\max(D_{500:550})) (1994)
EGFR \max(D_{650:750})/\max(D_{500:550}) Penuelas et al. (1994)
EVI 2.5*((R_{800}-R_{670})/ Huete et al. (1997)
GDVI (R_{800}^n-R_{680}^n) / (R_{800}^n+R_{680}^n)** Wu (2014)
GI R_{554}/R_{677} Smith et al. (1995)
Gitelson 1/R_{700} Gitelson et al. (1999)
Gitelson2 (R_{750}-R_{800}/R_{695}-R_{740})-1 Gitelson et al. (2003)
GMI1 R_{750}/R_{550} Gitelson et al. (2003)
GMI2 R_{750}/R_{700} Gitelson et al. (2003)
Green NDVI (R_{800}-R_{550})/(R_{800}+R_{550}) Gitelson et al. (1996)
LWVI_1 (R_{1094}-R_{983}) / (R_{1094}+R_{983}) Galvao et al. (2005)
LWVI_2 (R_{1094}-R_{1205}) / (R_{1094}+R_{1205}) Galvao et al. (2005)
Maccioni (R_{780}-R_{710})/(R_{780}-R_{680}) Maccioni et al. (2001)
MCARI ((R_{700}-R_{670})-0.2*(R_{700}-R_{550}))* Daughtry et al. (2000)
MCARI/OSAVI Daughtry et al. (2000)
MCARI2 ((R_{750}-R_{705})-0.2*(R_{750}-R_{550}))* Wu et al. (2008)
MCARI2/OSAVI2 Wu et al. (2008)
mND705 (R_{750}-R_{705})/(R_{750}+R_{705}-2*R_{445}) Sims and Gamon (2002)
mNDVI (R_{800}-R_{680})/(R_{800}+R_{680}-2*R_{445}) Sims and Gamon (2002)
MPRI (R_{515}-R_{530})/(R_{515}+R_{530}) Hernandez-Clemente et al.
mREIP Red-edge inflection point using Gaussain fit Miller et al. (1990)
MSAVI 0.5*(2*R_{800}+1- Qi et al. (1994)
MSI R_{1600}/ R_{817} Hunt and Rock (1989)
mSR (R_{800}-R_{445})/(R_{680}-R_{445}) Sims and Gamon (2002)
mSR2 (R_{750}/R_{705})-1/(R_{750}/R_{705}+1)^{0.5} Chen (1996)
mSR705 (R_{750}-R_{445})/(R_{705}-R_{445}) Sims and Gamon (2002)
MTCI (R_{754}-R_{709})/(R_{709}-R_{681}) Dash and Curran (2004)
MTVI 1.2*(1.2*(R_{800}-R_{550})- Haboudane et al.
2.5* (R_{670}-R_{550})) (2004)
NDLI (log(1/R_{1754}) - log(1/R_{1680}))/ Serrano et al. (2002)
(log(1/R_{1754}) + log(1/R_{1680}))
NDNI (log(1/R_{1510}) - log(1/R_{1680}))/ Serrano et al. (2002)
(log(1/R_{1510}) + log(1/R_{1680}))
NDVI (R_{800}-R_{680}) / (R_{800}+R_{680}) Tucker (1979)
NDVI2 (R_{750}-R_{705})/(R_{750}+R_{705}) Gitelson and Merzlyak
NDVI3 (R_{682}-R_{553})/(R_{682}+R_{553}) Gandia et al. (2004)
NDWI (R_{860}-R_{1240}) / (R_{860}+R_{1240}) Gao (1996)
NPCI (R_{680}-R_{430})/(R_{680}+R_{430}) Penuelas et al. (1994)
OSAVI (1+0.16)*(R_{800}-R_{670})/ Rondeaux et al.
(R_{800}+R_{670}+0.16) (1996)
OSAVI2 (1+0.16)*(R_{750}-R_{705})/ Wu et al. (2008)
PARS R_{746}/R_{513} Chappelle et al. (1992)
PRI (R_{531}-R_{570})/(R_{531}+R_{570}) Gamon et al. (1992)
PRI_norm PRI*(-1)/(RDVI*R_{700}/R_{670}) Zarco-Tejada et al.
PRI*CI2 PRI*CI2 Garrity et al. (2011)
PSRI (R_{678}-R_{500}/R_{750} Merzlyak et al. (1999)
PSSR R_{800}/R_{635} Blackburn (1998)
PSND (R_{800}-R_{470})/(R_{800}-R_{470}) Blackburn (1998)
PWI R_{970}/R_{900} Penuelas et al. (1997)
RDVI (R_{800}-R_{670})/√{R_{800}+R_{670}} Roujean and Breon (1995)
REP_LE Red-edge position through linear extrapolation. Cho and Skidmore (2006)
REP_Li R_{re}=(R_{670}+R_{780})/2 Guyot and Baret (1988)
700 + 40*((R_{re} -R_{700})/(R_{740}-R_{700}))
SAVI (1+L)*(R_{800}-R_{670})/(R_{800}+R_{670}+L) Huete (1988)
SIPI (R_{800}-R_{445})/(R_{800}-R_{680}) Penuelas et al. (1995),
Penuelas et al. (1995a)
SPVI 0.4*3.7*(R_{800}-R_{670})-1.2* Vincini et al. (2006)
SR R_{800}/R_{680} Jordan (1969)
SR1 R_{750}/R_{700} Gitelson and Merzlyak
SR2 R_{752}/R_{690} Gitelson and Merzlyak
SR3 R_{750}/R_{550} Gitelson and Merzlyak
SR4 R_{700}/R_{670} McMurtey et al. (1994)
SR5 R_{675}/R_{700} Chappelle et al. (1992)
SR6 R_{750}/R_{710} Zarco-Tejada and Miller
SR7 R_{440}/R_{690} Lichtenthaler et al. (1996)
SR8 R_{515}/R_{550} Hernandez-Clemente et al.
SRPI R_{430}/R_{680} Penuelas et al. (1995)
SRWI R_{850}/R_{1240} Zarco-Tejada et al.
Sum_Dr1 ∑_{i=626}^{795} D1_i Elvidge and Chen (1995)
Sum_Dr2 ∑_{i=680}^{780} D1_i Filella and Penuelas
SWIR FI R_{2133}^2/(R_{2225} \cdot R_{2209}^3 Levin et al. (2007)
SWIR LI 3.87 \cdot (R_{2210} - R_{2090}) - Lobell et al. (2001)
27.51 \cdot (R_{2280} - R_{2090}) - 0.2
SWIR SI -41.59 \cdot (R_{2210} - R_{2090}) + Lobell et al. (2001)
1.24 \cdot (R_{2280} - R_{2090}) + 0.64
SWIR VI 37.72 \cdot (R_{2210} - R_{2090}) + Lobell et al. (2001)
26.27 \cdot (R_{2280} - R_{2090}) + 0.57
TCARI 3*((R_{700}-R_{670})-0.2*R_{700}-R_{550})* Haboudane et al. (2002)
TCARI/OSAVI TCARI/OSAVI Haboudane et al. (2002)
TCARI2 3*((R_{750}-R_{705})-0.2*(R_{750}-R_{550})* Wu et al. (2008)
TCARI2/OSAVI2 TCARI2/OSAVI2 Wu et al. (2008)
TGI -0.5 (190 (R_{670} - R_{550} ) - 120 (R_{670} - R_{480} )) Hunt et al. (2013)
TVI 0.5*(120*(R_{750}-R_{550})- Broge and Leblanc
200*(R_{670}-R_{550})) (2000)
Vogelmann R_{740}/R_{720} Vogelmann et al. (1993)
Vogelmann2 (R_{734}-R_{747})/(R_{715}+R_{726}) Vogelmann et al. (1993)
Vogelmann3 D_{715}/D_{705} Vogelmann et al. (1993)
Vogelmann4 (R_{734}-R_{747})/(R_{715}+R_{720}) Vogelmann et al. (1993)

* For references please type: hsdardocs("References.pdf").
** For GDVI n must be defined appending an underscore and the intended exponent to the index name. E.g., for n = 2, the correct index name would be "GDVI_2". Note that GDVI-indices with n = 2, 3, 4 will be derived if all available indices are calculated.

Self-defining indices

Self-defined indices may be passed using the following syntax:

  • Rxxx: Reflectance at wavelength 'xxx'. Note that R must be upper case.

  • Dxxx: First derivation of reflectance values at wavelength 'xxx'. Note that D must be upper case.

Using this syntax, complex indices can be easily defined. Note that the entire definition of the index must be passed as one character string. Consequently, the NDVI would be written as


A vector containing indices values. If index is a vector with length > 1, a data frame with ncol = length(index) and nrow = number of spectra in x is returned.

If function is called without any arguments, return value will be a vector containing all available indices in alphabetical order.


Hanna Meyer and Lukas Lehnert


See hsdardocs("References.pdf")

See Also

soilindex, derivative.speclib, rededge, get_reflectance


## Example calculating NDVI
ndvi <- vegindex(spectral_data, "NDVI")

## Example calculating all available indices
## Get available indices
avl <- vegindex()
vi <- vegindex(spectral_data, avl)

## Self-defined indices
vi <- vegindex(spectral_data, "(R800-R680)/(R800+R680)")
vi <- vegindex(spectral_data, 
               "(log(1/R1510) - log(1/R1680))/(log(1/R1510) + log(1/R1680))")
## D1
vi <- vegindex(spectral_data, "D730/D706")

Want to suggest features or report bugs for Use the GitHub issue tracker. Vote for new features on Trello.

comments powered by Disqus