Sentinel-2 Atmospheric Correction: DOS vs Sen2Cor vs ACOLITE
Choosing the wrong atmospheric correction method can silently bias every NDVI, land cover, or water quality result you derive from Sentinel-2. This article compares DOS, Sen2Cor, and ACOLITE against the aerosol and humidity conditions typical of India and South Asia.

Why Atmospheric Correction Decides the Fate of Your Analysis
Every time you run an NDVI, classify land cover, or extract water quality parameters from Sentinel-2 imagery, the quality of that result is locked in before you even open your analysis software. It is locked in at the atmospheric correction step. Yet in my experience reviewing student projects and collaborating with early-career researchers across India, this step is either skipped entirely ("I'll just use TOA reflectance, it should be fine") or applied without understanding what the algorithm actually assumes.
This matters more in South Asia than almost anywhere else. The Indian subcontinent deals with aerosol loads from dust storms, crop-residue burning, industrial haze over the Indo-Gangetic Plain, and highly variable monsoon humidity — conditions that make the gap between top-of-atmosphere (TOA) and surface reflectance (SR) both large and spatially unpredictable. A correction method that performs reasonably over rural Europe may introduce systematic bias over a hazy October sky above Delhi or a turbid estuary in the Sundarbans.
This article walks through three widely used approaches — Dark Object Subtraction (DOS), Sen2Cor, and ACOLITE — comparing their assumptions, practical workflows, and appropriate use cases so you can make an informed choice rather than a default one.
What Does Atmospheric Correction Actually Do?

Illustrative: Indo-Gangetic Plain haze Sentinel-2. "Indo-Gangetic Plain" by Jeroen is licensed under CC BY-SA 2.5. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/2.5/.
When sunlight passes through the atmosphere before hitting the ground and again on its way back to the satellite sensor, it interacts with gases, water vapour, and aerosols. The sensor records radiance that is a mixture of actual surface signal and atmospheric path radiance. Atmospheric correction attempts to remove that atmospheric contribution and retrieve surface reflectance — the fraction of incoming light that the surface actually reflects.
There are two broad categories:
- Absolute correction: Uses radiative transfer modelling to physically simulate the atmosphere and retrieve true surface reflectance. Sen2Cor falls here.
- Relative / empirical correction: Uses image statistics or simplified assumptions to approximate the correction without full radiative transfer. DOS falls here; ACOLITE occupies a middle ground, using physics-based but scene-derived aerosol retrieval.
The distinction matters because absolute corrections require ancillary data (aerosol optical depth, water vapour, ozone) and are sensitive to how well those inputs represent the actual atmosphere at acquisition time.
Dark Object Subtraction: Simple, Fast, and Honest About Its Limits
DOS is the oldest and most accessible method. The core assumption is that some pixels in every scene — deep shadows, dense water bodies, tunnels — should have near-zero surface reflectance. Any signal recorded over those pixels must therefore be atmospheric path radiance, which can be subtracted band-by-band from the entire image.
Strengths:
- Requires no ancillary data
- Can be applied inside QGIS (Semi-Automatic Classification Plugin), Python, or R in minutes
- Useful for quick reconnaissance or when you only need relative comparisons within a single scene
Weaknesses for Indian conditions:
- Assumes a spatially uniform atmosphere — a poor assumption over the IGP during post-harvest burning or pre-monsoon dust events
- Does not account for adjacency effects (bright urban surfaces scattering light into neighbouring pixels)
- Performs poorly over water bodies where you actually need accurate blue and green reflectance for water quality work
- The "dark object" assumption breaks down if your scene has no genuinely dark pixels (common in arid Rajasthan or bright salt flats in Gujarat)
My practical rule: Use DOS only when you need a fast, single-scene result for a vegetation or built-up index over a relatively clear day, and you are comparing within that scene rather than across dates or sensors.
Sen2Cor: The ESA Standard and Its Real-World Caveats

Illustrative: turbid estuary satellite false color. "Sediment in the Río de La Plata - NASA Earth Observatory" by NASA's Earth Observatory is licensed under CC BY 2.0. To view a copy of this license, visit https://creativecommons.org/licenses/by/2.0/.
Sen2Cor is ESA's official processor for converting Sentinel-2 Level-1C (TOA) to Level-2A (SR). It uses a radiative transfer model called LibRadtran under the hood, combined with look-up tables, and retrieves aerosol optical depth and water vapour directly from the scene using specific spectral bands.
The good news: ESA now distributes pre-processed Level-2A products on Copernicus Open Access Hub for most of the globe, including India, so you often do not need to run Sen2Cor yourself. You can download the SR product directly.
Where Sen2Cor works well:
- Vegetated landscapes with moderate aerosol loading
- Time-series analysis where you want consistent, reproducible correction across dates
- When you are feeding results into supervised classifiers that benefit from absolute reflectance values
Known issues in South Asian conditions:
- Sen2Cor's aerosol retrieval struggles under very high aerosol optical depth — the kind of values routinely recorded over northern India in winter. When the atmosphere is too opaque, the algorithm can underestimate aerosol loading and leave residual haze in the image.
- The cloud and cloud-shadow mask (Scene Classification Layer, SCL) is notoriously conservative. Thin cirrus and bright urban surfaces are frequently misclassified, which can exclude valid data over Indian cities.
- Water pixels are flagged and not corrected for SR, which limits its utility for coastal and inland water applications.
Workflow tip: Always inspect the SCL layer before using Level-2A data. In SNAP or Python (via rasterio), load Band SCL and check what fraction of your study area is flagged as cloud or cloud shadow. If that fraction looks unrealistically high over a visually clear image, you may need to apply your own cloud mask rather than trusting the SCL blindly.
ACOLITE: The Right Tool for Water and Coastal Work
ACOLITE was developed at the Royal Belgian Institute of Natural Sciences specifically for aquatic remote sensing, and it shows. It retrieves aerosol properties from the image itself using near-infrared and shortwave infrared bands (the "dark spectrum" assumption over water), then applies a full atmospheric correction optimised for accurate blue and green reflectance over water bodies.
Where ACOLITE stands out:
- Inland lakes, reservoirs, and rivers (Chilika Lake, Vembanad, Wular, Chilika — any optically complex water body)
- Coastal zones where adjacency effects from land contaminate water pixels
- Turbid estuaries where standard corrections produce negative reflectance in the blue band
- It also outputs Rayleigh-corrected reflectance as an intermediate product, which is useful if you want to apply your own aerosol correction
Limitations:
- Less tested over purely terrestrial scenes; do not use it as a general-purpose land correction
- Requires some familiarity with the ACOLITE GUI or Python package — less plug-and-play than downloading Level-2A from the Hub
- The dark-spectrum assumption can fail over very turbid or shallow water where NIR reflectance from sediment or vegetation is non-negligible
A Quick Decision Framework
Here is how I think through the choice for a given project:
| Scenario | Recommended approach |
|---|---|
| Land cover classification, time series | Sen2Cor Level-2A (download pre-processed) |
| Quick single-scene vegetation index | DOS (if no Level-2A available) |
| Inland water quality / turbidity | ACOLITE |
| Coastal / estuarine mapping | ACOLITE |
| High aerosol loading (IGP winter) | Sen2Cor + manual QA, or consider MODIS MAIAC SR as a cross-check |
| Mixed land-water scene | ACOLITE for water pixels, Sen2Cor for land |
The Validation Step Nobody Talks About
Whichever method you apply, build in a sanity check. Pull the corrected reflectance values for a few spectrally stable targets — dense green vegetation, deep clear water, dry bare soil — and compare them to known spectral libraries (USGS Spectral Library, ECOSTRESS). If your "corrected" grass pixels are showing reflectance above 0.6 in the red band, something has gone wrong. This takes ten minutes and can save you from building an entire analysis on corrupted inputs.
References
- ESA Sentinel-2 Mission Overview: https://sentinel.esa.int/web/sentinel/missions/sentinel-2
- Sen2Cor Processor Documentation: https://step.esa.int/main/snap-supported-plugins/sen2cor/
- ACOLITE GitHub Repository (RBINS): https://github.com/acolite/acolite
- Copernicus Open Access Hub (Sentinel-2 Level-2A): https://scihub.copernicus.eu/
- USGS Spectral Library: https://www.usgs.gov/labs/spectroscopy-lab/science/spectral-library
- Semi-Automatic Classification Plugin (QGIS): https://fromgistors.blogspot.com/p/semi-automatic-classification-plugin.html
Researched with AI assistance and reviewed by Jannat Khosla.
Hero image: "Jalaput Reservoir, India" by SentinelHub is licensed under CC BY 2.0. To view a copy of this license, visit https://creativecommons.org/licenses/by/2.0/.


