Formula for Enhanced Vegetation Index (EVI) in Raster Calculator?

22403
14
02-27-2013 03:08 PM
StephenChignell
New Contributor II
Hi everyone,
I'm trying to derive Enhanced Vegetation Index (EVI) from Landsat 5 TM data using the raster calculator and I can't seem to get the output I want. Here is a link to the description and formula for EVI:

http://en.wikipedia.org/wiki/Enhanced_vegetation_index


The output should be a raster with values ranging from -1 to 1, but I get values from like 30-40 which is incorrect.

Right now my formula looks like this:


2.5 * (Float("%Band 4%" - "%Band 3%") / Float("%Band 4%" + 6 * "%Band 3%" - 7.5 *"%Band 1%" + 1))


Does anyone see something in here that doesn't make sense-- or even better--a formula I could copy/paste?

Thanks!
0 Kudos
14 Replies
Luke_Pinner
MVP Regular Contributor
What data type are the bands?  If you have byte or unsigned integer data, you might be getting integer overflows as you're applying the float conversion after the operations. As an example - say you have unsigned 16bit integers, band 4 = 500 and band 43 = 750.
Float(500 - 750) will return 65286 but Float(500) - 750 will return -250.0.

Try:

2.5 * ((Float("%Band 4%") - "%Band 3%")) / (Float("%Band 4%") + 6 * "%Band 3%" - 7.5 *"%Band 1%" + 1))
0 Kudos
curtvprice
MVP Esteemed Contributor

I'm trying to derive Enhanced Vegetation Index (EVI) from Landsat 5 TM data using the raster calculator and I can't seem to get the output I want. Here is a link to the description and formula for EVI:

http://en.wikipedia.org/wiki/Enhanced_vegetation_index

The output should be a raster with values ranging from -1 to 1, but I get values from like 30-40 which is incorrect.


The coefficients you are using are hard-coded for MODIS data sets (as stated in the wikipedia article). Additionally, the values required are not raw Landsat dataset DN values (0-255) but instead must be atmospherically-corrected reflectance values.

Here's a journal article that discusses the processing involved.
http://southwestnwrsnatresources.files.wordpress.com/2011/12/sesnie-et-al-2011.pdf
0 Kudos
StephenChignell
New Contributor II
The coefficients you are using are hard-coded for MODIS data sets (as stated in the wikipedia article). Additionally, the values required are not raw Landsat dataset DN values (0-255) but instead must be atmospherically-corrected reflectance values.

Here's a journal article that discusses the processing involved.
http://southwestnwrsnatresources.files.wordpress.com/2011/12/sesnie-et-al-2011.pdf


Hi Curt,
Thanks for the advice--I do plan on using atmospherically corrected imagery in my eventual run--I forgot to mention that.

Thanks too for the article, it was very informative. However, do you know if EVI correction factors have been developed for TM data? I can't seem to find anything that suggests anyone has derived EVI from Landsat.

Thanks again,
Steve
0 Kudos
StephenChignell
New Contributor II
What data type are the bands?  If you have byte or unsigned integer data, you might be getting integer overflows as you're applying the float conversion after the operations. As an example - say you have unsigned 16bit integers, band 4 = 500 and band 43 = 750.
Float(500 - 750) will return 65286 but Float(500) - 750 will return -250.0.

Try:

2.5 * ((Float("%Band 4%") - "%Band 3%")) / (Float("%Band 4%") + 6 * "%Band 3%" - 7.5 *"%Band 1%" + 1))



Thanks Luke,
I'll give this code a try once (if) I've resolved the issues with my actual correction coefficients...

Cheers,
Steve
0 Kudos
MeganMcSherry
New Contributor
What data type are the bands?  If you have byte or unsigned integer data, you might be getting integer overflows as you're applying the float conversion after the operations. As an example - say you have unsigned 16bit integers, band 4 = 500 and band 43 = 750.
Float(500 - 750) will return 65286 but Float(500) - 750 will return -250.0.

Try:

2.5 * ((Float("%Band 4%") - "%Band 3%")) / (Float("%Band 4%") + 6 * "%Band 3%" - 7.5 *"%Band 1%" + 1))


Hi lpinner,

I am having a similar problem in creating the formula for EVI using MODIS bands. No matter which way I enter it (with the float conversion in various positions), I still get an index from -10405 to 9610. All of the bands I am using are 32-bit unsigned integers. Any tips on how to enter the EVI equation using these MODIS bands?

Thanks very much.
0 Kudos
Luke_Pinner
MVP Regular Contributor
What MODIS product are you using?
0 Kudos
curtvprice
MVP Esteemed Contributor
I strongly suggest extracting some pixel values and doing the calculation by hand before doing battle with arcpy on this.
0 Kudos
MeganMcSherry
New Contributor
What MODIS product are you using?


I am using MYD09A1 images.
0 Kudos
Luke_Pinner
MVP Regular Contributor

Are you applying the MYD09A1 scale factor of 0.0001?

2.5 * (("%Band 4%" * 0.0001 - "%Band 3%" * 0.0001)) / (("%Band 4%" * 0.0001) + 6 * ("%Band 3%" * 0.0001) - 7.5 * ("%Band 1%" * 0.0001) + 1))
0 Kudos