Short answer

Atmospheric correction converts the radiance a satellite measures at the top of the atmosphere into the surface reflectance of the ground itself, by removing the scattering and absorption the light passed through twice. For geology this is not optional: alteration mapping depends on the shape and depth of narrow absorption features, and the atmosphere adds a wavelength-dependent haze (strongest in the blue) plus gas absorption that distorts exactly those features. The practical path is to use validated Level-2 surface-reflectance products (USGS LaSRC for Landsat, Sen2Cor for Sentinel-2) and fall back to Dark Object Subtraction only for quick looks.

What the atmosphere actually does to your pixels

The signal reaching the sensor is a sum, not just the surface term. In simplified radiative-transfer form the at-sensor reflectance is:

ρ_TOA = ρ_path + (T_down · T_up · ρ_surface) / (1 − s · ρ_surface)
  • ρ_path — additive path radiance from atmospheric scattering. Rayleigh (molecular) scattering goes as ~λ⁻⁴, so it is severe in the blue and weak in the SWIR. Aerosol (Mie) scattering adds a more variable, less wavelength-selective haze.
  • T_down, T_up — two-way transmittance, reduced by gas absorption. Water vapour bites near 0.94, 1.14 and 1.38 µm; ozone in the visible; CO₂ and others in the SWIR.
  • s — spherical albedo of the atmosphere (the adjacency/multiple-scattering term).

The consequences for geology are specific. Path radiance raises the floor of the blue and green bands, which flattens the iron-oxide charge-transfer slope and shrinks ferric-iron ratios. Water-vapour absorption near 1.4 and 1.9 µm sits next to the diagnostic Al-OH (2.2 µm) and Mg-OH (2.33 µm) clay features, so residual vapour distorts continuum-removed band depths. None of this is corrected by simply stretching the image.

TOA, DOS and surface reflectance — three different things

Digital number (DN). Raw quantized counts. Never analyse spectra on DN.

Top-of-atmosphere (TOA) reflectance. DN converted with the sensor's gain/bias and corrected for solar geometry and Earth–Sun distance. Calibrated, comparable across scenes for the sensor, but still includes the full atmosphere. Adequate only for indices that are deliberately robust to it.

Dark Object Subtraction (DOS). An image-based shortcut: assume the darkest pixels (deep shadow, clear water) should be near-zero reflectance, attribute their non-zero value to additive haze, and subtract it per band. Chavez's COST/DOS variants add a transmittance estimate. Fast and needs no ancillary data, but it only removes the additive term, assumes a spatially uniform atmosphere, and is weak where no genuinely dark pixels exist (deserts, snow). In QGIS this is the Semi-Automatic Classification Plugin's "DOS1" option.

Physically based surface reflectance. A radiative-transfer model (6S, MODTRAN) inverts the equation above using aerosol optical thickness, water vapour and a viewing/solar geometry to solve for ρ_surface. The operational products are:

  • Landsat 8/9: LaSRC (Land Surface Reflectance Code), shipped as USGS Collection 2 Level-2.
  • Landsat 4–7: LEDAPS.
  • Sentinel-2: Sen2Cor, which produces Level-2A (also handling the cirrus band 10 and a scene classification layer).

These are validated against AERONET ground stations and, crucially, reproducible — the same input always yields the same output, which matters when a client audits the workflow.

A practical workflow

  1. Start from a Level-2 product where one exists. For Landsat, download Collection 2 Level-2 surface reflectance directly from USGS EarthExplorer or the M2M API — it is already LaSRC-corrected. For Sentinel-2, download Level-2A from the Copernicus Data Space, or run Sen2Cor on a Level-1C scene: L2A_Process --resolution 20 S2A_MSIL1C_<...>.SAFE.
  2. Apply the scale factor. Landsat C2 L2 surface reflectance is stored as integers; convert with reflectance = DN * 0.0000275 − 0.2. Sentinel-2 L2A uses a 10000 scale (and a BOA offset in newer baselines — check the product's BOA_ADD_OFFSET).
  3. Mask before you analyse. Use the QA/SCL band to remove cloud, cirrus, shadow, snow and water (Sentinel-2 SCL classes 3, 8, 9, 10, 11).
  4. Reproject consistently, e.g. gdalwarp -t_srs EPSG:32633 -r bilinear -dstnodata 0 in.tif out.tif.
  5. Then, and only then, compute indices/ratios (NDVI, clay ratio, ferric-iron ratio) on the surface-reflectance bands.
  6. Document the correction method, product version and date in metadata so the result is auditable.

For older or non-standard sensors without an L2 product (some ASTER tiers, airborne data), run 6S explicitly via the Py6S Python wrapper or apply DOS as a documented approximation.

Why ratios do not save you

A common belief is "I use band ratios, so I don't need atmospheric correction because illumination cancels." Illumination (a multiplicative term, T and the cosine of solar zenith) does largely divide out. Path radiance does not — it is additive. Adding different constants to numerator and denominator before dividing changes the ratio non-linearly, and because Rayleigh path radiance differs by band (large in blue, small in SWIR), the bias differs per ratio and per scene. So an uncorrected ferric-iron ratio (red/blue) is especially compromised, and two dates are not comparable. Correction is what makes ratios portable.

BRDF, topographic and adjacency refinements

Surface reflectance is not the end for rugged geological terrain:

  • Topographic correction. Slopes facing toward or away from the sun receive different irradiance. A C-correction or the Sun-Canopy-Sensor (SCS+C) method, driven by a DEM-derived illumination model, normalizes this. Skip it and shaded slopes mimic spectral differences.
  • BRDF normalization. Reflectance varies with view and sun angle; wide-swath or off-nadir scenes (and Sentinel-2's detector geometry) benefit from a BRDF model, especially when mosaicking.
  • Adjacency effects. Light scattered from bright neighbours into a dark pixel — relevant at sharp lithological/vegetation boundaries.

For a single well-exposed arid scene these are second-order; for multi-date mosaics in relief they are not.

Common pitfalls and why they happen

  • Analysing TOA as if it were surface reflectance. TOA is calibrated but still hazy; mineral band depths come out scene-dependent.
  • DOS over a desert or snowfield. No truly dark pixel exists, so the haze estimate is wrong and the correction under- or over-subtracts.
  • Forgetting the L2 scale/offset. Treating stored integers as reflectance gives nonsensical 0–60000 "reflectance" and broken indices.
  • Mixing correction methods across dates. A LaSRC scene and a DOS scene are not on the same radiometric basis; change detection then measures the method, not the ground.
  • Ignoring residual water vapour near 1.4/1.9 µm. It corrupts continuum-removed clay band depths even after a generic correction.

Quality and validation

  • Confirm dark targets (clear deep water, shadow) read near zero after correction.
  • Check that vegetation shows the expected red-edge and NIR plateau and that water reflectance falls toward zero in the NIR/SWIR — a sanity spectrum.
  • Where possible, compare against a pseudo-invariant target or, ideally, a field spectrometer reading.
  • Verify all scenes in a time series used the same product version and scaling.
  • Record method, model parameters and QA masking in the deliverable's metadata.

Bathyl perspective

We standardise on validated Level-2 surface reflectance (LaSRC, Sen2Cor) so every spectral product is reproducible and auditable, and we add topographic correction whenever relief is part of the scene. Atmospheric correction is the unglamorous step that decides whether a clay or iron-oxide map means anything — we treat it as a documented prerequisite, not a checkbox.

Related reading

Sources