Satellite imagery
Bands, reflectance, cloud masks and composites — turning scenes into an array you can trust.
A satellite scene is an array per band with a footprint and a timestamp, and the work is nearly always the same shape: find the scenes that cover your area and date, decide which pixels you trust, and reduce the rest to something you can compare across time.
Two things reliably go wrong. The first is the processing level: an index computed on top-of-atmosphere reflectance is not a slightly worse version of one computed on surface reflectance, it is a different quantity, and the file will not stop you. The second is cloud. A scene-level cloud percentage tells you nothing about your own ten-kilometre window, cloud shadow is far harder to detect than cloud, and an unmasked shadow depresses a vegetation index rather than obviously ruining it.
Below: the concepts cover bands, reflectance, indices and masks; the how-to guides search catalogues, mask, composite and export; and the fixes are the scenes and arrays that come back wrong.
🧭 Start with the concepts
The ideas the how-to guides below assume you already have.
- Spectral Bands Explained: What Satellite Imagery Actually Measures
- Radiometric Levels Explained: DN, TOA and Surface Reflectance
- Sentinel-2 or Landsat? Choosing a Satellite Imagery Source
- Spectral Indices Explained: NDVI, NDWI and What They Assume
- Cloud Masking Explained: QA Bands, Scene Classification and What They Miss
- Vegetation indices explained: NDVI, EVI, NDRE and when each fails
Show every concept in this topic
- Crop phenology and growing seasons explained
- SAR imagery explained: what radar measures and why it sees through cloud
- SAR polarisation explained: VV, VH and what each responds to
- Speckle explained: why radar images look grainy
- Burn severity explained: NBR, dNBR and what the classes mean
- Satellite NO2 Explained
- Global Forest Change Explained
- Forest Definitions Explained
- Land Cover Products Explained
- Land Surface Temperature Explained
- Surface Urban Heat Island Explained
- Landsat Thermal Data Explained
- Emissivity Explained
- Snow Cover and NDSI Explained: How Satellites Map Snow
- Dual-Polarisation Radar Explained: ZDR, ρhv and ΦDP
- Weather Radar Reflectivity Explained: dBZ, Tilts and Beam Height
- Radar Rainfall vs Rain Gauges Explained: Why They Disagree
- Active Fire Detection From Satellites Explained
- Land Cover Map Accuracy Explained
- Land Cover Change Explained
- Sea Surface Temperature Explained
⚙️ Then do the task
Step-by-step walkthroughs with code you can copy and adapt.
- How to Load Sentinel-2 Bands into Python as an Analysis-Ready Array
- How to Resample Satellite Bands to a Common Grid
- How to Calculate NDVI from Sentinel-2 in Python
- How to Mask Clouds in Sentinel-2 Imagery with Python
- How to Build a Cloud-Free Composite from Many Satellite Scenes
- How to Extract a Vegetation Index Time Series for a Polygon
Show every how-to guide in this topic
- How to Detect Change Between Two Satellite Images in Python
- How to Classify Land Cover from Satellite Imagery in Python
- How to Turn a STAC Search into an xarray Data Cube
- How to delineate field boundaries from imagery in Python
- How to extract phenology metrics from an NDVI time series
- How to detect change between two Sentinel-1 images
- How to make a Sentinel-1 composite over a period
- How to map burn severity with dNBR in Python
- How to Map Sentinel-5P NO2 in Python
- How to Compare Land Cover Products for Forest in Python
- How to Detect New Forest Clearing with Sentinel-2 in Python
- How to Read Landsat Surface Temperature in Python
- How to Build a Summer Land Surface Temperature Composite in Python
- How to Calculate Surface Urban Heat Island Intensity in Python
- How to Relate Land Surface Temperature to Vegetation in Python
- How to Make a MODIS Snow Cover Time Series in Python
- How to Measure Glacier Retreat with Outlines and Sentinel-2 in Python
- How to Map Snow Cover from Sentinel-2 in Python
- How to Estimate Rainfall from Radar Reflectivity in Python
- How to Make a GOES Satellite Loop in Python
- How to Make a Before-and-After Swipe Map in Python
- How to Track a Wildfire with GOES Satellite Fire Detections in Python
- How to Map a Wildfire's Daily Progression from Satellite Detections in Python
- How to Calculate Fire Radiative Energy From GOES in Python
🔧 When it breaks
The errors this topic produces, with the cause explained rather than just the command.
- Satellite Bands Have Different Shapes or Do Not Align
- NDVI Values Are Above 1 or Below −1: How to Fix It
- My Composite Has Holes, Stripes or Grey Patches
- NDVI stops responding in a dense canopy
- dNBR shows burn severity outside the fire perimeter
- Satellite NO2 Map Mostly Empty
Show every fix in this topic
- Forest Threshold Changes Everything
- Forest Loss and Gain Misread
- Forest Loss Trend Not Comparable Over Time
- Clouds Show as Cold Spots in LST
- SUHI Rural Reference Gives the Wrong Answer
- LST Scenes Are Not Comparable
- LST Resolution Misread
- NDSI Snow Is Confused with Cloud or Water
- Radar Rainfall Map Has Spokes and Hot Spots: Beam Blockage and Clutter
- Radar Rainfall Too High: Hail and the Bright Band
- Why Are the Timestamps in My Map Animation Wrong?
- Why Is My Burned Area From GOES Fire Pixels Wrong?
Learning paths through this topic
A curated route rather than a list — the guides in the order that builds on itself.
Related topics
Subjects that keep coming up alongside this one, most overlap first.