Skip to content

Interpolated Look up Tables (iLUTs)

Sam Murphy edited this page Nov 30, 2016 · 4 revisions

Interpolated Look-up Tables

This repo is all about building and using interpolated look-up tables (iLUTs) for atmospheric correction.

Why use iLUTs?

Radiative transfer code (e.g. 6S, MODTRAN) takes a long time to execute. It could take days to correct a single waveband of a Landsat-class sensor. A solution to this problem is to use iLUTs.

What is an iLUT?

First, we start with a standard look-up table (LUT). This is a collection of input values passed to 6S (e.g. water vapour, ozone, etc.) and the corresponding output values that 6S returns (i.e. used for atmospheric correction). A LUT is a set of discrete inputs/outputs. To handle real-world continuous inputs and outputs we interpolate the LUT. It takes in the LUT and creates an interpolant using piecewise linear interpolation.

Note Building an iLUT takes a long time (i.e. hours) but a) you only need to do it once and b) it will allow you to atmospherically correct images in seconds.

How to use an iLUT?

An iLUT is an 'interpolator object'. It takes the following input

  • solar zenith angle (degrees)
  • water vapour column (g/cm^2)
  • ozone column (atm-cm)
  • aerosol optical thickness
  • altitude (km)

and provide the following output

  • direct solar irradiance (Edir)
  • diffuse solar irradiance (Edif)
  • transmissivity from surface to sensor (tau2)
  • path radiance (Lp)

You can use an iLUT in Python like this:

In [1] Edir, Edif, tau2, Lp = iLUT(solar_z,H2O,O3,AOT,alt)

Can I make my own iLUTs?

If you would like to a build a LUT from scratch here is the syntax:

$ python3 LUT_build.py {satellite_sensor} {aerosol_profile} {view_zenith} {--test,--full,--validation}

The options at present are:

  • {satellite_sensor} = LANDSAT_TM, LANDSAT_ETM, LANDSAT_OLI or ASTER

  • {aerosol_profile} = BB, CO, DE, MA, NO or UR

BB = Biomass Burning
CO = Continental
DE = Desert
MA = Maritime
NO = No Aerosols
UR = Urban

..you can find a bit more info on which aerosol profile to pick here

  • {view_zenith} = integer value for view zenith of sensor in degrees (typically = 0)

  • {--flag} = must pick one!

--full = Complete selection of input parameters. Outputs used in atmospheric correction. This might take several hours to execute
--test = NOT for atmospheric correction, just for a 'quick' test
--validation = selects mid-points of 'full' parameter space for validation.

EXAMPLE: To create a lookup tabe not supplied here, e.g. for LANDSAT 8's OLI sensor using a desert aerosol model, you could run the following command:

$ python3 LUT_build.py LANDSAT_OLI DE 0 --test

Interpolating a LUT

The general syntax is:

$ python3 LUT_interpolate.py {satellite_sensor} {aerosol_profile} {view_zenith}

Let's interpolate one of the LUTs supplied with this repo

$ python3 LUT_interpolate.py LANDSAT_OLI MA 0