NDVI at low cost


NDVI (see >Wikipedia introduction) is quite popular, but I found surprisingly little material on how to create NDVI images in detail without spending much money. Here is my approach: NDVI at low cost.

Camera and filters

The camera must be able to produce linear images (calibrated raw images) and there must be no IR block filter. I use a QHY5 compatible monochrome astronomy camera with a M42 RMC Tokina 28mm 1:2.8 lens for this purpose.

Searching for the exact wavelengths, there are frequent referals to the NOAA AVHRRR satellite camera, but different sources give different specifications. That's because it's a family of satellites, not just one. From the numbers, many people refer to the channels 1 and 2 of >AVHRR/3, which use 580-680 nm and 725-1000 nm. The range around 700 nm is clearly excluded, because that's where the reflectance of plants changes.

Most common red filters start the transmission somewhere in the red range and continue to NIR. Only quite expensive astronomical filters show a band pass behaviour. For that reason, I combined a B+W UV-IR-CUT filter with a B+W dark red 8X filter (both used from Ebay). The result is more narrow, but has shown to work fine. The NIR filter is a Neewer IR760 filter (new from Ebay). Luckily a friend measured the transmission curves for both to avoid surprises:

Many red pass and UV-IR block filters probably work well, but this combination has a high total transmission, which indicates B+W used anti reflex coating. B+W does not even advertise this on the box, so they believe it should be common. I agree, but I almost any other filter I own has no AR coating.

IR pass filters vary greatly and I recommend to use exactly that model from Neewer unless you can determine the transmission curve. The quality does not appear to be related to the price.

After I got the filters, I could acquire both the red and NIR image, but in order to get a NDVI image, they need to be calibrated. Despite knowing the transmission curves and the camera quantum efficiency (using a scientific camera is an advantage here), I can't tell the spectral light distribution, which changes depending on the season, sky and time of the day.


Besides absolute pre-launch calibration, the satellite detectors use specific areas of the earth for calibration and they know their position to the sun and obviously need clear sky. I want to acquire images in my back yard whenever I feel like it, so I need a calibration plate to compensate for the current lighting. Such plates can be bought for amazing prices. A low cost approach is to browse through the >USGS Spectral Library Version 7 Data to find something with equal reflectance in both red and NIR. Thanks a lot to the people spending so much time to create this database and to the USA to offer it worldwide. I ended up with two candidates that are easy to obtain: Basalt and light gray concrete.

This diagram shows the effective sensor quantum efficiency using the filters and the reflectance of both materials:

As you can see, the reflectance only varies a little in the given bands with concrete being slightly better than basalt. I waited until sunset and used a clear sky in absence of direct sunlight to verify if this matches my samples by taking images of both samples and the sky, using the sky to normalize the brightness to 1.0 for obtaining the reflectance. I figured a diffuse sky should be the dominant source of light outside and easy to take images of, whereas direct sunlight would burn the camera. ImageJ was used to determine the mean brightness:


Normalized this yields:


The reflectance values about match and indeed concrete performs slightly better. I also like it more for being more bright, which yields a better SNR in images. By having the calibration plate visible in all images, only two images are required for both calibration and NDVI.


I do not particularly like ImageJ strange GUI or its macro language, but it does get the job done. This script automates the creation of a NDVI image: >ndvi.ijm. After asking for both images, you need to select a rectangle in the calibration plate. The script normalizes the NIR image to the calibrated brightness of the red image and computes the NDVI image:

$$\text"NDVI" = { \text"NIR" - \text"Red" } / { \text"NIR" + \text"Red" }$$

It is expected that the calibration plate ends up around 0, because $\text"NIR"$ and $\text"Red"$ should be equal there.

The contrast in the red image appears to be strong, because this is a linear image (no gamma encoding). I usually develop raw images into FITS floating point images, which are nice to work with in ImageJ and other software. Note the concrete calibration plate at the bottom. Red image:

The NIR image already shows a high reflectance of the tree and the lawn:

I was surprised to see high values for the branches, not only for the leaves, and much lower values for the sunny side of the apples. The low values for the wooden post are to be expected. Unfortunately, there is no standard NDVI palette, so I used "Fire" from ImageJ, which delivers good contrast. NDVI image:

That's how it looks like on a regular camera:


A cheap astronomical camera, some filters from Ebay and a piece of concrete suffice to create NDVI images at low cost. This kind of tree is said to get sick easily, but right now it looks very healty.