Atmosphere and shading compensation of satellite images

Since satellite images are made from above the atmosphere they don't give direct information on the actual color of the earth surface but contain effects from everything between the surface and the satellite, most important dust, water vapor and other influences of the earth atmosphere. These effects are undesirable when doing renders of the earth surface.

Atmosphere influence depending on altitude

Moderate resolution satellite images like from external linkMODIS are routinely corrected for various atmospheric influences using non-visible spectral data and other information. Some of these methods can also be used for high resolution images but in a lot of cases the required information for this is not available or the algorithms are poorly documented and don't scale well with increased resolution.

I tried to develop a compensation technique for practical application on Landsat images for earth renders which fulfills the following criteria:

Since the compensation has to be applied on a per-scene basis anyway and for combining several scenes further adjustments are necessary it is not required for it to perform an absolute correction. Instead it should just ensure the same actual surface color at different places in the scene results in the about same color in the image.

The most important factor that influences the amount of atmosphere influence on the image color is the thickness of the atmosphere above every point. The technique i developed therefore uses a digital elevation model (in the examples based on the SRTM 3 arc second data) to calculate this thickness and uses it to correct the color of every point in the image.

Of course the altitude is not the only factor that influences the color in a satellite image. Local weather conditions are ignored (or better: simply assumed to be the same in the whole scene). Therefore not even thin clouds are compensated in any way.

The algorithm in detail

The correction algorithm is completely local, the information used for estimating the actual surface color at every point of the image is the color in the original satellite image (the top-of-atmosphere reflection):


and the elevation at the same location:


The fact that the elevation data has a lower resolution than the image is not a problem here - the atmosphere influence is only changing very gradually. From the surface altitude a relative atmosphere thickness

HRel(x,y) = (HRef-Height(x,y))/HRef

is calculated with the reference height HRef where corrention is zero. In addition a influence factor Weight is used to adjust the correction intensity. This factor has to depend on the color channel since the atmosphere influence is strongest in the blue color. The Exponent allows to vary the compensation between purely multiplicative (1) and additive (0) The complete formula for estimating the actual surface color is:

Surface_Color(x,y) = TOA_Color(x,y) - pow(TOA_Color(x,y),Exponent)*Weight*HRel(x,y)

Note this is no way a physically accurate compensation - but it can reasonably compensate the strongest parts of atmosphere effects. Experiments with more accurate models for the atmosphere influence based on its thickness might be worth trying but since all influences except the altitude are neglected here it does not make sense to exaggerate this.

Compensating the shading

For rendering purposes the shading in the satellite images resulting from the sunlight hitting the surface at different angles is a handicap. Since the digital elevation model is already used for the atmosphere compensation i tested if the shading could be compensated as well. Based on the elevation model the normal vector is calculated:

Normal = <dh/dx, dh/dy, 1>
and from the angle between the normal and the sun direction (which can be found in the scene metadata) and assuming a lambertian reflection characteristic the apparent brightness of the surface due to sun light can be estimated:

Brighness = cos(Angle(Normal, Sun_Direction))

And based on that the surface color is corrected:

Surface_Color_Flat(x,y) = Surface_Color(x,y)*(1+(0.5-Brighness))*Adjust

where Adjust is again a color channel dependant adjustment factor.

I also put up a reference implementation of the algorithm.

Application examples

To test this technique i used a Landsat scene from Southern India which shows quite strong atmosphere effects. The original scene can be found on the external linkGLFC site.

original Landsat scene SRTM based DEM of the same area
original Landsat scene SRTM based DEM of the same area

As well visible the higher mountain regions are much darker than the lower parts which are covered by blue-grayish dust and fog. Applying the described compensation with the following parameters:

Weight = { 0.11, 0.1, 0.14 }
Exponent = 0.5
HRef = 3021m
Adjust = { 0.5, 0.5, 0.3 }

results in the image below on the left. The image on the right shows the scene with further overall color adjustments.

with atmosphere compensation with further adjustments
with atmosphere and shading compensation with further adjustments

The atmosphere correction is working quite reasonably in this case. The shading compensation however is only partially successful - see the magnified area below.

original image with compensations
original image with compensations

The reasons why it does not work so well seem to be that:

The images below show a part of the Grand Canyon with the same technique applied using higher resolution elevation data. The correction of small terrain features works much better but the shadows at very steep parts in the canyons are still not sufficiently brightened.

original image with compensations
original image with compensations

Using the images in earth renders

Here is a sample view of the region in southern India used in the above example:

without compensations with compensations
without compensations with compensations

Another example from the alps:

without compensations with compensations
without compensations with compensations

Several renders using the described technique can also be now found on the Views of the Earth site: