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.
Moderate resolution satellite images like from MODIS 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:
- compensates the strongest atmospheric influences reasonably well for the purpose of earth renders.
- does not require further high resolution data (in particular no additional infrared data channels).
- is suited for practical application on large data sets.
- is robust and does not depend on a particular kind of surface (like vegetation).
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):
TOA_Color(x,y)
and the elevation at the same location:
Height(x,y)
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 GLFC site.
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 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 |
The reasons why it does not work so well seem to be that:
- the elevation data is much lower resolution than the image. To get a reasonable compensation for example at mountain ridges the geometry data probably has to be at least the same resolution as the image.
- while the assumption of a lambertian reflection is reasonable for the directly sunlit areas shadows and areas with only streaking lighting are not correctly handled. Their brightness depends on a lot of factors apart from the sun direction which can not be easily estimated.
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 |
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 |
Another example from the alps:
without compensations | with compensations |
Several renders using the described technique can also be now found on the Views of the Earth site: