i.vi(1grass)

πŸ’– i.vi β€” the grass manual but make it cute πŸ’–

okay bestie, so this is i.vi from the GRASS User's Manual, and it's genuinely one of the most iconic ones because it's all about vegetation indices 🌱✨. Like, plant vibes, quantified. Let's get into it, no skips, no skimming, we're doing the whole thing.


✨ NAME ✨

i.vi β€” bestie it calculates different types of vegetation indices. That's the whole job, that's the main character energy right there.

It uses the red and nir bands mostly (nir = near infrared, iykyk), and honestly some of the indices need extra bands too, so don't come at it with just two bands and expect every single one to work. The module is very "come prepared" about it.


πŸŽ€ KEYWORDS πŸŽ€

  • imagery
  • vegetation index
  • biophysical parameters
  • NDVI

🌈 SYNOPSIS 🌈

okay here's the vibe, exactly as it goes:

i.vi
i.vi --help
i.vi output=name viname=type  [red=name]   [nir=name]   [green=name]
[blue=name]   [band5=name]   [band7=name]   [soil_line_slope=float]
[soil_line_intercept=float]   [soil_noise_reduction=float]
[storage_bit=integer]   [--overwrite]  [--help]  [--verbose]  [--quiet]
[--ui]

note that output and viname are the only ones doing the absolute most without brackets β€” they're required, everything else in square brackets is optional πŸ’…


🫢 Flags 🫢

  • --overwrite β€” lets your output files just bulldoze whatever existing files are in the way. Yes, it overwrites them. Be so careful with this one, bestie, it does not ask twice.
  • --help β€” prints the usage summary. If you're lost, she'll catch you up πŸ’œ
  • --verbose β€” verbose module output, aka the module yaps at you about what it's doing. Some of us love that.
  • --quiet β€” quiet module output. The opposite. Silence. Peace. πŸ¦‹
  • --ui β€” forces the GUI dialog to launch, so you can click around instead of typing.

🌸 Parameters 🌸

  • output=name [required] β€” the name for your output raster map. This one is mandatory, no exceptions, she needs to know where to put the goods.
  • viname=type [required] β€” the parameter, honestly. This is the type of vegetation index you want.

Options: arvi, ci, dvi, evi, evi2, gvi, gari, gemi, ipvi, msavi, msavi2, ndvi, ndwi, pvi, savi, sr, vari, wdvi

Default: ndvi

And here's the full roster with what each one actually is, because I'm not gatekeeping:

  • arvi: Atmospherically Resistant Vegetation Index
  • ci: Crust Index
  • dvi: Difference Vegetation Index
  • evi: Enhanced Vegetation Index
  • evi2: Enhanced Vegetation Index 2
  • gvi: Green Vegetation Index
  • gari: Green Atmospherically Resistant Vegetation Index
  • gemi: Global Environmental Monitoring Index
  • ipvi: Infrared Percentage Vegetation Index
  • msavi: Modified Soil Adjusted Vegetation Index
  • msavi2: second Modified Soil Adjusted Vegetation Index
  • ndvi: Normalized Difference Vegetation Index
  • ndwi: Normalized Difference Water Index
  • pvi: Perpendicular Vegetation Index
  • savi: Soil Adjusted Vegetation Index
  • sr: Simple Ratio
  • vari: Visible Atmospherically Resistant Index
  • wdvi: Weighted Difference Vegetation Index
  • red=name β€” name of the input red channel surface reflectance map. Range: [0.0;1.0] β€” keep it in that range, she checks.
  • nir=name β€” name of the input nir channel surface reflectance map. Range: [0.0;1.0]. This is the one most indices are obsessed with.
  • green=name β€” name of the input green channel surface reflectance map. Range: [0.0;1.0].
  • blue=name β€” name of the input blue channel surface reflectance map. Range: [0.0;1.0].
  • band5=name β€” name of the input 5th channel surface reflectance map. Range: [0.0;1.0].
  • band7=name β€” name of the input 7th channel surface reflectance map. Range: [0.0;1.0].
  • soil_line_slope=float β€” the value of the slope of the soil line. Only used by MSAVI and PVI, so if you're not running those, this is just sitting there.
  • soil_line_intercept=float β€” the value of the intercept of the soil line. MSAVI only bestie, don't waste it elsewhere.
  • soil_noise_reduction=float β€” the value of the factor of reduction of soil noise. MSAVI only again. Soil is loud, this turns it down.
  • storage_bit=integer β€” maximum bits for digital numbers.

And here's the important bit: if your data is in Digital Numbers (i.e. integer type), give the max bits β€” like 8 for Landsat, which maps to [0-255].

Options: 7, 8, 10, 16

Default: 8

not me being the responsible one but fr fr, read the parameter list properly before you run her. half the confusion people have with i.vi is just picking viname and then not supplying the bands that index actually needs πŸ™ˆ

πŸ’– DESCRIPTION πŸ’–

okay so bestie, i.vi is the module that calculates vegetation indices based on biophysical parameters. that's the whole job. it's giving calculator but make it earth-observation. 🌱

here's the full roster of indices it can do for you:

  • ARVI: Atmospherically Resistant Vegetation Index
  • CI: Crust Index
  • DVI: Difference Vegetation Index
  • EVI: Enhanced Vegetation Index
  • EVI2: Enhanced Vegetation Index 2
  • GARI: Green atmospherically resistant vegetation index
  • GEMI: Global Environmental Monitoring Index
  • GVI: Green Vegetation Index
  • IPVI: Infrared Percentage Vegetation Index
  • MSAVI2: second Modified Soil Adjusted Vegetation Index
  • MSAVI: Modified Soil Adjusted Vegetation Index
  • NDVI: Normalized Difference Vegetation Index
  • NDWI: Normalized Difference Water Index
  • PVI: Perpendicular Vegetation Index
  • RVI: ratio vegetation index
  • SAVI: Soil Adjusted Vegetation Index
  • SR: Simple Vegetation ratio
  • WDVI: Weighted Difference Vegetation Index

🌍 Background for users new to remote sensing πŸ›°οΈ

Vegetation Indices are often considered the entry point of remote sensing for Earth land monitoring, bestie. and honestly? they are suffering from their success, in terms that often people tend to harvest satellite images from online sources and use them directly in this module. 😭 like ma'am. please.

From Digital number to Radiance ✨

Satellite imagery is commonly stored in Digital Number (DN) for storage purposes; e.g., Landsat5 data is stored in 8bit values (ranging from 0 to 255), other satellites maybe stored in 10 or 16 bits. If the data is provided in DN, this implies that this imagery is "uncorrected". What this means is that the image is what the satellite sees at its position and altitude in space (stored in DN). This is not the signal at ground yet. We call this data at-satellite or at-sensor. Encoded in the 8bits (or more) is the amount of energy sensed by the sensor inside the satellite platform. This energy is called radiance-at-sensor.

Generally, satellites image providers encode the radiance-at-sensor into 8bit (or more) through an affine transform equation (y=ax+b). In case of using Landsat imagery, look at the i.landsat.toar for an easy way to transform DN to radiance-at-sensor. If using Aster data, try the i.aster.toar module. πŸŽ€

From Radiance to Reflectance 🌈

Finally, once having obtained the radiance at sensor values, still the atmosphere is between sensor and Earth's surface. This fact needs to be corrected to account for the atmospheric interaction with the sun energy that the vegetation reflects back into space. This can be done in two ways for Landsat:

  • the simple way is through i.landsat.toar, use e.g. the DOS correction
  • the more accurate way is by using i.atcorr (which works for many satellite sensors) πŸ‘‘

Once the atmospheric correction has been applied to the satellite data, data vales are called surface reflectance. Surface reflectance is ranging from 0.0 to 1.0 theoretically (and absolutely). This level of data correction is the proper level of correction to use with i.vi. periodt. πŸ’…


🌿 Vegetation Indices 🌿

ARVI: Atmospheric Resistant Vegetation Index πŸƒ

ARVI is resistant to atmospheric effects (in comparison to the NDVI) and is accomplished by a self correcting process for the atmospheric effect in the red channel, using the difference in the radiance between the blue and the red channels (Kaufman and Tanre 1996).

arvi( redchan, nirchan, bluechan )
ARVI = (nirchan - (2.0*redchan - bluechan)) /
       ( nirchan + (2.0*redchan - bluechan))

CI: Crust Index 🦠

Advantage is taken of a unique spectral feature of soil biogenic crust containing cyanobacteria. It has been shown that the special phycobilin pigment in cyanobacteria contributes in producing a relatively higher reflectance in the blue spectral region than the same type of substrate without the biogenic crust. The spectral crust index (CI) is based on the normalized difference between the RED and the BLUE spectral values (Karnieli, 1997, DOI: 10.1080/014311697218368).

ci ( bluechan, redchan )
CI = 1 - (redchan - bluechan) /
       (redchan + bluechan)

DVI: Difference Vegetation Index βž–

dvi( redchan, nirchan )
DVI = ( nirchan - redchan )

EVI: Enhanced Vegetation Index πŸ’š

The enhanced vegetation index (EVI) is an optimized index designed to enhance the vegetation signal with improved sensitivity in high biomass regions and improved vegetation monitoring through a de-coupling of the canopy background signal and a reduction in atmosphere influences (Huete A.R., Liu H.Q., Batchily K., van Leeuwen W. (1997). A comparison of vegetation indices global set of TM images for EOS-MODIS. Remote Sensing of Environment, 59:440-451).

evi( bluechan, redchan, nirchan )
EVI = 2.5 * ( nirchan - redchan ) /
      ( nirchan + 6.0 * redchan - 7.5 * bluechan + 1.0 )

EVI2: Enhanced Vegetation Index 2 πŸ’šπŸ’š

A 2-band EVI (EVI2), without a blue band, which has the best similarity with the 3-band EVI, particularly when atmospheric effects are insignificant and data quality is good (Zhangyan Jiang ; Alfredo R. Huete ; Youngwook Kim and Kamel Didan 2-band enhanced vegetation index without a blue band and its application to AVHRR data. Proc. SPIE 6679, Remote Sensing and Modeling of Ecosystems for Sustainability IV, 667905 (october 09, 2007) doi:10.1117/12.734933).

evi2( redchan, nirchan )
EVI2 = 2.5 * ( nirchan - redchan ) /
       ( nirchan + 2.4 * redchan + 1.0 )

GARI: green atmospherically resistant vegetation index 🟒

The formula was actually defined: Gitelson, Anatoly A.; Kaufman, Yoram J.; Merzlyak, Mark N. (1996) Use of a green channel in remote sensing of global vegetation from EOS- MODIS, Remote Sensing of Environment 58 (3), 289-298. doi:10.1016/s0034-4257(96)00072-7

gari( redchan, nirchan, bluechan, greenchan )
GARI = ( nirchan - (greenchan - (bluechan - redchan))) /
       ( nirchan + (greenchan - (bluechan - redchan)))

GEMI: Global Environmental Monitoring Index 🌎

gemi( redchan, nirchan )
GEMI = (( (2*((nirchan * nirchan)-(redchan * redchan)) +
       1.5*nirchan+0.5*redchan) / (nirchan + redchan + 0.5)) *
       (1 - 0.25 * (2*((nirchan * nirchan)-(redchan * redchan)) +
       1.5*nirchan+0.5*redchan) / (nirchan + redchan + 0.5))) -
       ( (redchan - 0.125) / (1 - redchan))

GVI: Green Vegetation Index 🌲

gvi( bluechan, greenchan, redchan, nirchan, chan5chan, chan7chan)
GVI = ( -0.2848 * bluechan - 0.2435 * greenchan -
      0.5436 * redchan + 0.7243 * nirchan + 0.0840 * chan5chan-
      0.1800 * chan7chan)

IPVI: Infrared Percentage Vegetation Index πŸŸ₯

ipvi( redchan, nirchan )
IPVI = nirchan/(nirchan+redchan)

MSAVI2: second Modified Soil Adjusted Vegetation Index πŸͺ¨

msavi2( redchan, nirchan )
MSAVI2 = (1/2)*(2*NIR+1-sqrt((2*NIR+1)^2-8*(NIR-red)))

MSAVI: Modified Soil Adjusted Vegetation Index πŸͺ¨βœŒοΈ

msavi( redchan, nirchan )
MSAVI = s(NIR-s*red-a) / (a*NIR+red-a*s+X*(1+s*s))

where a is the soil line intercept, s is the soil line slope, and X is an adjustment factor which is set to minimize soil noise (0.08 in original papers).

NDVI: Normalized Difference Vegetation Index πŸ‘‘

ndvi( redchan, nirchan )
Satellite specific band numbers ([NIR, Red]):
  MSS Bands        = [ 7,  5]
  TM1-5,7 Bands    = [ 4,  3]
  TM8 Bands        = [ 5,  4]
  Sentinel-2 Bands = [ 8,  4]
  AVHRR Bands      = [ 2,  1]
  SPOT XS Bands    = [ 3,  2]
  AVIRIS Bands     = [51, 29]
NDVI = (NIR - Red) / (NIR + Red)

NDWI: Normalized Difference Water Index (after McFeeters, 1996) πŸ’§

This index is suitable to detect water bodies. 🌊

ndwi( greenchan, nirchan )
NDWI = (green - NIR) / (green + NIR)

The water content of leaves can be estimated with another NDWI (after Gao, 1996):

ndwi( greenchan, nirchan )
NDWI = (NIR - SWIR) / (NIR + SWIR)
This index is important for monitoring vegetation health (not implemented).

PVI: Perpendicular Vegetation Index πŸ“

pvi( redchan, nirchan, soil_line_slope )
PVI = sin(a)NIR-cos(a)red

SAVI: Soil Adjusted Vegetation Index πŸͺ¨πŸŒ±

savi( redchan, nirchan )
SAVI = ((1.0+0.5)*(nirchan - redchan)) / (nirchan + redchan +0.5)

SR: Simple Vegetation ratio βž—

sr( redchan, nirchan )
SR = (nirchan/redchan)

VARI: Visible Atmospherically Resistant Index 🎨

VARI was designed to introduce an atmospheric self-correction (Gitelson A.A., Kaufman Y.J., Stark R., Rundquist D., 2002. Novel algorithms for estimation of vegetation fraction Remote Sensing of Environment (80), pp76-87.)

vari = ( bluechan, greenchan, redchan )
VARI = (green - red ) / (green + red - blue)

WDVI: Weighted Difference Vegetation Index βš–οΈ

wdvi( redchan, nirchan, soil_line_weight )
WDVI = nirchan - a * redchan
if(soil_weight_line == None):
   a = 1.0   #slope of soil line

πŸ”₯ EXAMPLES πŸ”₯

okay bestie this is the part where it gets real ✨ all the vibes, all the actual runnable stuff. let's go πŸ’…

πŸ“ Calculation of DVI

the way you get DVI out of your reflectance values is literally this:

g.region raster=band.1 -p
i.vi blue=band.1 red=band.3 nir=band.4 viname=dvi output=dvi
r.univar -e dvi

πŸ“ Calculation of EVI

and EVI? same energy, different index:

g.region raster=band.1 -p
i.vi blue=band.1 red=band.3 nir=band.4 viname=evi output=evi
r.univar -e evi

πŸ“ Calculation of EVI2

EVI2, she's lowkey the simpler sister πŸ’–:

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 viname=evi2 output=evi2
r.univar -e evi2

πŸ“ Calculation of GARI

GARI time, and yes she needs blue + green + red + nir, the whole squad fr:

g.region raster=band.1 -p
i.vi blue=band.1 green=band.2 red=band.3 nir=band.4 viname=gari output=gari
r.univar -e gari

πŸ“ Calculation of GEMI

GEMI, no blue needed, she's chill:

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 viname=gemi output=gemi
r.univar -e gemi

πŸ“ Calculation of GVI

GVI β€” aka the Green Vegetation Index, Tasseled Cap edition πŸ‘‘ β€” comes outta your reflectance values like so:

g.region raster=band.3 -p
# assuming Landsat-7
i.vi blue=band.1 green=band.2 red=band.3 nir=band.4 band5=band.5 band7=band.7 viname=gvi output=gvi
r.univar -e gvi

(that little comment in there is doing the heavy lifting ngl, she's assuming Landsat-7 🫢)


πŸ“ Calculation of IPVI

IPVI bestie, so simple:

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 viname=ipvi output=ipvi
r.univar -e ipvi

πŸ“ Calculation of MSAVI

MSAVI, the soil-adjusted icon:

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 viname=msavi output=msavi
r.univar -e msavi

πŸ“ Calculation of NDVI

NDVI. the main character. the moment. πŸ’…

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 viname=ndvi output=ndvi
r.univar -e ndvi

πŸ“ Calculation of NDWI

NDWI needs green + nir, and here we're also slapping a colour table on it because we're extra:

g.region raster=band.2 -p
i.vi green=band.2 nir=band.4 viname=ndwi output=ndwi
r.colors ndwi color=byg -n
r.univar -e ndwi

πŸ“ Calculation of PVI

PVI! note the soil_line_slope=0.45, she's got a slope parameter bestie:

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 soil_line_slope=0.45 viname=pvi output=pvi
r.univar -e pvi

πŸ“ Calculation of SAVI

SAVI serving soil-adjusted realness:

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 viname=savi output=savi
r.univar -e savi

πŸ“ Calculation of SR

SR, the simplest ratio lil baby 🌸:

g.region raster=band.3 -p
i.vi red=band.3 nir=band.4 viname=sr output=sr
r.univar -e sr

πŸ“ Calculation of VARI

VARI, and heads up bestie, look at those band numbers πŸ‘€ they go blue=band.2 green=band.3 red=band.4 β€” she's numbered differently, don't @ me:

g.region raster=band.3 -p
i.vi blue=band.2 green=band.3 red=band.4 viname=vari output=vari
r.univar -e vari

🌈 Landsat TM7 example 🌈

these next ones are all based on a LANDSAT TM7 scene that lives inside the North Carolina sample dataset πŸ¦‹

🧚 Preparation: DN to reflectance

so step one, step ONE, is that those raw DN (digital number) pixel values must get converted to reflectance using i.landsat.toar. and to do that we make a copy (or you can rename the channels, dealer's choice) so the names match what i.landsat.toar wants as input β€” its input scheme, iykyk:

g.copy raster=lsat7_2002_10,lsat7_2002.1
g.copy raster=lsat7_2002_20,lsat7_2002.2
g.copy raster=lsat7_2002_30,lsat7_2002.3
g.copy raster=lsat7_2002_40,lsat7_2002.4
g.copy raster=lsat7_2002_50,lsat7_2002.5
g.copy raster=lsat7_2002_61,lsat7_2002.61
g.copy raster=lsat7_2002_62,lsat7_2002.62
g.copy raster=lsat7_2002_70,lsat7_2002.7
g.copy raster=lsat7_2002_80,lsat7_2002.8

then we calculate the reflectance values from DN using DOS1 (metadata obtained from p016r035_7x20020524.met.gz, periodt):

i.landsat.toar input=lsat7_2002. output=lsat7_2002_toar. sensor=tm7 \
  method=dos1 date=2002-05-24 sun_elevation=64.7730999 \
  product_date=2004-02-12 gain=HHHLHLHHL

and the resulting Landsat channels get named lsat7_2002_toar.1 .. lsat7_2002_toar.8. slay ✨

🧚 Calculation of NDVI

calculating NDVI from those reflectance values, here's the whole ritual:

g.region raster=lsat7_2002_toar.3 -p
i.vi red=lsat7_2002_toar.3 nir=lsat7_2002_toar.4 viname=ndvi \
     output=lsat7_2002.ndvi
r.colors lsat7_2002.ndvi color=ndvi
d.mon wx0
d.rast.leg lsat7_2002.ndvi

North Carolina dataset: NDVI

🧚 Calculation of ARVI

ARVI from the reflectance values, same vibe, ARVI edition:

g.region raster=lsat7_2002_toar.3 -p
i.vi blue=lsat7_2002_toar.1 red=lsat7_2002_toar.3 nir=lsat7_2002_toar.4 \
     viname=arvi output=lsat7_2002.arvi
d.mon wx0
d.rast.leg lsat7_2002.arvi

North Carolina dataset: ARVI

🧚 Calculation of GARI

and GARI from the reflectance values, she wants all four bands:

g.region raster=lsat7_2002_toar.3 -p
i.vi blue=lsat7_2002_toar.1 green=lsat7_2002_toar.2 red=lsat7_2002_toar.3 \
     nir=lsat7_2002_toar.4 viname=gari output=lsat7_2002.gari
d.mon wx0
d.rast.leg lsat7_2002.gari

North Carolina dataset: GARI


πŸ“ NOTES πŸ“

this module originally came from kepler.gps.caltech.edu (an FAQ), and here's the whole citation because we give credit in this house 🫢:

A FAQ on Vegetation in Remote Sensing Written by Terrill W. Ray, Div. of Geological and Planetary Sciences, California Institute of Technology, email: terrill@mars1.gps.caltech.edu Snail Mail: Terrill Ray Division of Geological and Planetary Sciences Caltech, Mail Code 170-25 Pasadena, CA 91125

πŸ“š REFERENCES πŸ“š

AVHRR, Landsat TM5:

  • Bastiaanssen, W.G.M., 1995. Regionalization of surface flux densities and moisture indicators in composite terrain; a remote sensing approach under clear skies in mediterranean climates. PhD thesis, Wageningen Agricultural Univ., The Netherland, 271 pp. (PDF)
  • Index DataBase: List of available Indices

πŸ‘€ SEE ALSO πŸ‘€

i.albedo, i.aster.toar, i.landsat.toar, i.atcorr, i.tasscap

like, go read those too bestie, they're the whole ecosystem πŸ’–


πŸ‘‘ AUTHORS πŸ‘‘

  • Baburao Kamble, Asian Institute of Technology, Thailand
  • Yann Chemin, Asian Institute of Technology, Thailand

πŸ’» SOURCE CODE πŸ’»

Available at: i.vi source code (history)

Latest change: Saturday Feb 15 00:20:39 2025 in commit: ea58114c806f4f003104995f3d1798d8e7aceb8a

Main index | Imagery index | Topics index | Keywords index | Graphical index | Full index

Β© 2003-2026 GRASS Development Team, GRASS 8.5.0 Reference Manual


anyway that's the whole page bestie, you ate πŸ’…βœ¨ this was the GRASS 8.5.0 reference manual page for i.vi(1grass) β€” go forth and compute vegetation indices, you gorgeous nerd πŸ¦‹πŸ’–

πŸ“¦ where this page comes from