L2A differences compared to L1C


I am currently trying to process all available S2 data sets for a specific area. Therefore I created a script that only process (L2A) e.g. 4 out of 8 tiles (e.g. tile “32UPB”). Comparing the differences between the original L1C product and the processed L2A product, I saw that the L2A processed file seems to feature some reflectance edges…
It looks like this (left: L1C, middle: L2A RGB, right: L2A False-color IR RGB):

Does anyone know, where this comes from? Or is it just a problem of stretching? And if so, what should be done different?


Sen2cor makes an estimate of aerosol optical thickness (AOT) independently on each tile. As the AOT estimation is not perfect (because it is difficult), the resulting AOT might be different on each side of the tile border, and therefore the surface reflectances differ on each side of the tile border.

Sometimes, on a tile, sen2cor does not find enough pixels suitable to estimate AOT, and then the default AOT is used on one of the tiles, which results in even greater differences.

The atmospheric correction processor I am working on (MACCS) has similar issues, although somewhat reduced as we saw in the first tests (but it has to be confirmed with more tests).

Experiments are being set-up to make large scale comparisons :

After I spent days to install Sen2Cor and get it to work right and many hours to apply the correction on the whole product I have the same problem described above that renders the outcome unusable and the correction problematic. I mean, how am I supposed to further process (e.g. apply depth correction or classification algorithms on) an area between two tiles when the same ‘thing’ on two different tiles has different ‘corrected’ dn values?
I believe the obvious solution would be to be able to run the atmospheric correction on a user defined subset of a product. This way AOT would be uniformly estimated on the subset of interest (with the estimated values when ‘appropriate pixels are found’ or with the default AOT otherwise).
Why is this simple approach (the option to set the user defined area where to apply Atm Correction) not implemented with Sen2Cor?