Clouds are always challenging in remote sensing unless you are especially interested in clouds and want them to appear in your satellite imagery. How about snow? It is also white and in some cases, without further analysis, it might look like a cloud. So how to differentiate snow cover and clouds in a satellite image?

Area of interest

My area of interest is located in the Alps, near Lake Constance in the border of Germany, Switzerland and Austria. A satellite image was acquired on 17 April 2019, when there is still a lot of snow left in the Alps.

Area of interest located near Lake Constance, in the Alps.

I approached this problem with three different methods:

  1. Visual interpretation
  2. NDSI (Normalized Difference Snow Index)
  3. Supervised image classification

Let's start and see what kind of results I got by using each method.

1. Visual interpretation

First, I tried the simplest method, which doesn’t require any calculations. I started with visual interpretation by looking at the textures of white areas. Puffy white clouds and transparent clouds are easy to recognize. Also, the snow area is easy because the snow cover follows the shape of the ground. However, there are a couple of areas where it is difficult to distinguish between clouds and snow.

Visual interpretation

Of course, if I had access to a time series from this area, this task would have been easier as clouds are moving faster than snow cover changes. But in this case, I only had one image, so I continued my studies to the next approach: calculating Normalised Difference Snow Index (NDSI).

2. NDSI (Normalized Difference Snow Index)

NDSI is calculated using the bands of green wavelength and shortwave infrared. As a result, it gives an index between -1 and 1. Values near to 1 are usually representing snow. My first challenge was to find the right threshold for separating the snow cover. By trial and error, I ended up with a pretty good solution. But the major issue here is that NDSI cannot distinguish the difference between snow cover and water areas.

Snow cover maps as a result of NDSI (Normalized Difference Snow Index).

I solved a problem of snow cover and water areas by using knowledge of reflectance properties of these two surfaces. I used near infrared band to find out areas with low reflectance because the snow has high reflectance compared to water. Combining NDSI and near-infrared information created a reasonable result.

Enhanced snow cover map.

Now I have the snow cover map and therefore, I know that the rest of the white areas are most likely clouds. I’m still wondering are the white spots over snow cover clouds…? Visually it is hard to tell.

I would still like to have a map showing both clouds and snow areas in the image. That’s why next I tried supervised image classification.  

3. Supervised image classification

Supervised image classification means that a user selects sample pixels (used as a training data) from the image. Those sample pixels represents the desired classes. I created 7 classes: snow, cloud, transparent cloud, water, shadow, vegetation, no vegetation. I collected 5 samples from each class ending up total of 35 samples.

Then image processing, in this case Orfeo ToolBox, is used to perform the classification. Supervised classification can be performed with different machine learning algorithms. My choices of machine learning classification algorithms were:

  • Random forest
  • Support vector machine
  • k-Nearest neighbors

My main focus was in the classes of snow, cloud and transparent clouds and I show my results using only these classes to make comparison easier.

In general, algorithms were performing quite well. However, all algorithms misinterpreted some white puffy clouds as snow, especially above Lake Constance. Closer analysis revealed that transparent clouds also caused problems. First, some clouds were missed above Lake Constance.  Secondly, some city areas and road network has been classified as transparent clouds. In addition, support vector machine misinterpreted areas next to snow cover as transparent clouds, meaning that the amount of transparent clouds was highly overestimated. I wasn't completely happy with the result, so I added a bonus.


Last, I tried to combine the enhanced snow cover map and supervised image classification. I masked out snow areas using the snow cover map I created previously. Then I modified my training data by leaving out snow class and after that, I performed classification using k-Nearest neighbors.

This result seemed better compared to previous ones. Now white puffy clouds above Lake Constance were classified as clouds. However, still some city areas and road network were misinterpreted as transparent clouds. Also, some areas above snow cover were classified as clouds (Note that snow cover mask wasn't covering those areas). As I wrote earlier I can't be totally sure by looking at the original image whether they are clouds or not, so the result might be right. After all, I'm pleased with my final result.