SAR: Seeing Through Clouds with Radar

Every module so far has used optical sensors that record reflected sunlight. But what happens when it's cloudy, dark, or smoky? Those sensors go blind. Here's where Synthetic Aperture Radar (SAR) comes in. SAR sends its own microwave pulses and listens for the echoes, making it the only satellite technology that works day or night, rain or shine.

In this module, we'll learn what SAR is, how to work with Sentinel-1 data in Google Earth Engine, and how to map floods using radar. Let's dive in.

Learning objectives

  • Explain how SAR differs from optical remote sensing (active vs. passive).
  • Load and filter Sentinel-1 GRD imagery in Google Earth Engine.
  • Interpret VV and VH polarization and understand backscatter.
  • Apply speckle filtering to reduce radar noise.
  • Map flood extent using before-after SAR change detection.

Why should we care?

Floods are the world's most costly natural disaster, and they almost always happen under heavy cloud cover. Optical satellites like Landsat and Sentinel-2 can't see through clouds. SAR penetrates clouds, smoke, and darkness, making it indispensable for emergency flood mapping, deforestation monitoring in cloudy tropical regions, oil spill detection, and sea ice tracking.

Key vocabulary

SAR
Synthetic Aperture Radar. An active sensor that emits microwave pulses and records the returning echoes (backscatter) to create images.
Backscatter
The portion of the emitted radar signal that bounces back to the sensor. Measured in decibels (dB). Rough surfaces scatter more; smooth surfaces (like water) scatter less.
Polarization
The orientation of the transmitted and received radar wave. VV = vertical transmit, vertical receive. VH = vertical transmit, horizontal receive. Different polarizations respond differently to surface structure.
Speckle
Grainy "salt-and-pepper" noise inherent in SAR images, caused by constructive and destructive interference of radar waves. Must be filtered before analysis.
GRD
Ground Range Detected. A Sentinel-1 product that has been projected to ground range and is ready for analysis. This is the product we'll use in GEE.
C-band
The microwave frequency band used by Sentinel-1 (~5.4 GHz, ~5.6 cm wavelength). Sensitive to surface roughness, vegetation structure, and moisture.

Your first radar image

Let's load a Sentinel-1 image over Houston, Texas, and see what the world looks like in radar. Fair warning: SAR images are grayscale and look "grainy" because of speckle noise. They won't look like the pretty color composites we're used to, but don't worry, we'll make sense of it.

// Load a Sentinel-1 GRD image over Houston, TX
var houston = ee.Geometry.Point([-95.37, 29.76]);

var s1 = ee.ImageCollection('COPERNICUS/S1_GRD')
  .filterBounds(houston)
  .filterDate('2023-06-01', '2023-06-30')
  .filter(ee.Filter.eq('instrumentMode', 'IW'))
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
  .filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))
  .first();

Map.centerObject(houston, 10);
Map.addLayer(s1.select('VV'), {min: -25, max: 0}, 'VV polarization');
Map.addLayer(s1.select('VH'), {min: -30, max: -5}, 'VH polarization');

What you should see

A grayscale image where cities and forests appear bright (high backscatter from rough surfaces) and water bodies appear very dark (smooth surfaces reflect radar away from the sensor). You'll also notice that characteristic "grainy" speckle texture. That's normal!

What makes SAR different?

Think of it like this. All the sensors we've used so far (Landsat, Sentinel-2, MODIS) are passive sensors. They sit up in space and wait for the Sun to illuminate the ground, then record what bounces back. They only work during the day, and clouds block the signal.

SAR is an active sensor. It brings its own flashlight: a radar transmitter that sends microwave pulses toward the ground. The sensor then records the returning echoes (backscatter). Because microwaves pass right through clouds, SAR works in any weather and at any time of day. That's a game-changer.

Feature Optical (Passive) SAR (Active)
Energy sourceSunOnboard transmitter
WavelengthVisible, NIR, SWIR (0.4 to 2.5 μm)Microwave (cm to m)
Day/NightDay onlyBoth
Cloud penetrationNoYes
What it measuresSurface reflectanceSurface roughness, moisture, structure
Image appearanceColor compositesGrayscale (backscatter intensity)
Noise typeHaze, cloudsSpeckle

The key insight

Optical sensors tell you what color the surface is. SAR tells you how rough and how wet the surface is. They're complementary, not competing. Think of them as two different doctors examining the same patient.

Working with Sentinel-1 in Earth Engine

Sentinel-1 is a constellation of two C-band SAR satellites operated by the European Space Agency (ESA). In GEE, we access it through ee.ImageCollection('COPERNICUS/S1_GRD'). The data comes in decibels (dB), which is a logarithmic scale. Here's how to read it:

  • High values (near 0 dB): Strong backscatter (rough surfaces, buildings, vegetation).
  • Low values (below -20 dB): Weak backscatter (smooth surfaces, calm water).

The filters you always need

Here's something important: unlike Landsat, Sentinel-1 requires several metadata filters to get consistent results. Always apply all of these. Think of it as a checklist before takeoff:

// Standard Sentinel-1 filtering template
var s1Collection = ee.ImageCollection('COPERNICUS/S1_GRD')
  .filterBounds(myPoint)
  .filterDate('2023-01-01', '2023-12-31')
  // IW mode = standard land imaging mode
  .filter(ee.Filter.eq('instrumentMode', 'IW'))
  // Require both VV and VH polarizations
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
  // Pick one orbit direction for consistency
  .filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));

print('Number of images:', s1Collection.size());

Watch out for these

  • Missing instrument mode filter: Sentinel-1 has multiple modes (IW, EW, SM). Always filter to 'IW' for land applications.
  • Mixing orbit directions: Ascending and descending passes view the surface from different angles, producing different backscatter values. Pick one and stick with it.
  • Wrong visualization range: SAR values are in dB (negative numbers). Use {min: -25, max: 0} for VV and {min: -30, max: -5} for VH.

VV vs. VH: what's the difference?

Sentinel-1 transmits radar pulses in the vertical (V) direction and records echoes in both vertical (V) and horizontal (H) directions. This gives us two polarization bands:

  • VV (co-polarization): Transmitted V, received V. Sensitive to surface roughness and soil moisture. Water appears very dark.
  • VH (cross-polarization): Transmitted V, received H. Sensitive to volume scattering (vegetation canopy structure). Forests appear brighter in VH than bare soil.
Surface VV (dB) VH (dB) Why
Calm water-25 to -20-35 to -28Smooth surface reflects radar away (specular reflection)
Urban-5 to 0-15 to -8Buildings create strong corner reflectors
Forest-10 to -5-15 to -10Canopy scatters in multiple directions (volume scattering)
Bare soil-15 to -8-25 to -18Moderate roughness, little volume scattering
Flooded vegetation-5 to 0-12 to -8Double-bounce between water surface and tree trunks

Pro tip: make SAR colorful

Here's a fun trick. We can create a color composite from SAR data by assigning VV to red, VH to green, and the VV/VH ratio to blue. Water shows up dark, urban areas appear bright magenta, and vegetation turns green. Let's see it:

// SAR false-color composite
var vv = s1.select('VV');
var vh = s1.select('VH');
var ratio = vv.divide(vh).rename('VV_VH_ratio');

var sarComposite = vv.addBands(vh).addBands(ratio);
Map.addLayer(sarComposite, {
  min: [-25, -30, 0.3],
  max: [0, -5, 1.5]
}, 'SAR Composite (VV, VH, ratio)');

Dealing with that grainy texture

You've probably noticed that SAR images have a characteristic grainy texture called speckle. Here's the thing: speckle isn't random sensor noise. It's caused by the constructive and destructive interference of radar waves reflecting from many small scatterers within a single pixel. But for most analysis purposes, we need to smooth it out.

The simplest approach is spatial averaging using a focal (neighborhood) filter. Think of it like blurring a photo slightly to remove grain. A common choice is a 3x3 or 5x5 pixel mean or median filter.

// Simple speckle filtering using a focal mean
var vvSmooth = s1.select('VV').focal_mean({
  radius: 50,
  kernelType: 'circle',
  units: 'meters'
});

Map.addLayer(s1.select('VV'), {min: -25, max: 0}, 'VV (original)');
Map.addLayer(vvSmooth, {min: -25, max: 0}, 'VV (speckle filtered)');

Another approach is temporal averaging: take the median of multiple SAR images from the same orbit over several weeks. This reduces speckle without blurring spatial details, which is pretty slick.

// Temporal speckle reduction using multi-image median
var s1Median = s1Collection
  .select(['VV', 'VH'])
  .median();

Map.addLayer(s1Median.select('VV'), {min: -25, max: 0}, 'VV (temporal median)');

Which filter should we use?

  • Focal mean/median (spatial): Quick and easy, but blurs edges.
  • Temporal median: Preserves edges better, but requires multiple images and assumes nothing changed during the time window.
  • For flood mapping (where change IS the signal), use the temporal median for the "before" baseline, but do NOT temporally average the "during flood" image. That's critical.

Mapping floods when clouds won't move

Here's where SAR gets really powerful. Flood mapping is the most widely used SAR application, and the logic is beautifully simple: water is smooth, smooth surfaces produce very low backscatter, so flooded areas appear much darker than surrounding land. By comparing a "before" image with a "during flood" image, we can pinpoint exactly what got inundated.

Case Study: Hurricane Harvey hits Houston

Hurricane Harvey dumped over 60 inches of rain on Houston in August 2017, causing catastrophic flooding. Optical satellites couldn't see a thing through the storm clouds, but Sentinel-1 mapped the flood extent clearly. Let's recreate that analysis:

// Flood mapping: Hurricane Harvey, Houston TX, August 2017
var houston = ee.Geometry.Point([-95.37, 29.76]);

// Standard Sentinel-1 filters
var s1Filters = function(col) {
  return col
    .filter(ee.Filter.eq('instrumentMode', 'IW'))
    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
    .filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));
};

// Before: June 2017 (dry baseline, temporal median to reduce speckle)
var before = s1Filters(ee.ImageCollection('COPERNICUS/S1_GRD')
  .filterBounds(houston)
  .filterDate('2017-06-01', '2017-06-30'))
  .select('VV')
  .median();

// During: August 30, 2017 (peak flooding, single image)
var during = s1Filters(ee.ImageCollection('COPERNICUS/S1_GRD')
  .filterBounds(houston)
  .filterDate('2017-08-29', '2017-09-05'))
  .select('VV')
  .mosaic();

// Change detection: pixels where backscatter dropped significantly
var difference = before.subtract(during);

// Threshold: areas where backscatter dropped by more than 3 dB are flooded
var floodMask = difference.gt(3);

Map.centerObject(houston, 10);
Map.addLayer(before, {min: -25, max: 0}, 'Before (June 2017)');
Map.addLayer(during, {min: -25, max: 0}, 'During flood (Aug 2017)');
Map.addLayer(floodMask.selfMask(), {palette: ['cyan']}, 'Flood extent');

// Calculate flooded area in km²
var floodArea = floodMask.multiply(ee.Image.pixelArea()).reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: houston.buffer(50000),
  scale: 10,
  maxPixels: 1e9
});
var areaKm2 = ee.Number(floodArea.get('VV')).divide(1e6);
print('Estimated flood extent (km²):', areaKm2);

What you should see

The "Before" image shows Houston with bright urban areas and dark water bodies (rivers, reservoirs). The "During flood" image shows large dark areas where neighborhoods and roads were inundated. The flood mask highlights these areas in cyan. Look for extensive flooding along Buffalo Bayou, Addicks and Barker reservoirs, and surrounding residential areas. This is a powerful, sobering result.

What SAR can't do

SAR is powerful, but let's be honest about its limitations. Every tool has trade-offs:

  • Speckle noise: All SAR images require noise reduction before analysis. It's just part of the deal.
  • Geometric distortion: Radar images are acquired at an angle, causing foreshortening, layover, and shadow effects in mountainous terrain.
  • Interpretation takes practice: SAR images look very different from optical images. Bright does not mean "light colored"; it means "rough" or "structured." It takes some getting used to.
  • Wind roughening: Ocean and lake surfaces roughened by wind produce higher backscatter and can be confused with land.
  • No spectral indices: We can't calculate NDVI, NDWI, or other spectral indices from SAR data. SAR and optical data complement each other.

Try it: map a different flood

Find a recent flood event (search "recent floods" in the news). Load Sentinel-1 data for the area using a before date (1 month prior) and a during date (within days of the flood). Apply the same change detection approach with a 3 dB threshold. How does your flood extent compare to news reports?

Quick self-check

  1. Why can SAR see through clouds but optical sensors cannot?
  2. What does low backscatter (dark areas in SAR images) typically indicate?
  3. Name the two polarization bands available from Sentinel-1 in IW mode.
  4. Why do we need to filter Sentinel-1 by instrumentMode and orbitProperties_pass?
  5. In SAR flood mapping, why do we subtract the "during" image from the "before" image?

Going deeper

We've covered the foundations of SAR in this module. For advanced radar techniques, check out:

  • EEFA Book - Chapter F3.1: SAR Basics
  • EEFA Book - Chapter A3.7: Monitoring Floods and Droughts with SAR
  • EEFA Book - Chapter F3.2: Interpreting SAR Images

Next Steps