I want to create "visually appealing" RGB images from Sentinel-2 L1C data in a standardized manner. Obviously, this starts with extracting the bands 4, 3, and 2, which correspond to the Red, Green, and Blue channels of the electromagnetic spectrum. The problem, however, is that the histograms of the individual bands in the different images vary significantly in both shape and min/max values. So I am wondering what is the best way to create RGB images that follow some kind of standardized visual appearance.

Is there any fixed conversion factors or thresholds? Or would it be more advisable to use relative thresholds, e.g. by keeping the middle 95% of the gray values within each band?

  • 1
    why don't you just use the _TCI.jp2 image ? – RoVo Nov 14 '17 at 9:47
  • My question is more about how (i.e. based on which rationale) the TCI image is created than actually using it. – Michael Nov 14 '17 at 12:00
  • Your comment put me into the right direction! As can be read on sentinels.copernicus.eu/web/sentinel/user-guides/sentinel-2-msi/…, for the TCI the maximum value is set to 20% reflectance (i.e. to the DN 2000) in each individual band. This would of course be a standardized approach, but I am still not sure if all S2 images would be "visually appealing" with this hard-coded threshold. – Michael Nov 14 '17 at 12:04

In image processing the standardized way to create "visually appealing" RGB images is called histogram matching. It applies to any spectral data, not only from Sentinel mission. Some hints on software may be found here: Seamless, color balanced mosaics of aerial RGB photos with Open Source.

  • I am not sure if this goes into the right direction, since you must have a target histogram to match - which I don't have. – Michael Nov 14 '17 at 12:00
  • 1
    I understand what you mean. To further adjust the look of the image one can use GRASS module that crops outliers in histogram based on some threshold. grass.osgeo.org/grass72/manuals/i.colors.enhance.html I personally think that the visually appealing look is highly subjective, so there is no true threshold. – Vladimir Nov 14 '17 at 12:13
  • Looking at the source of i.colors.enhance I see that they also work with percentiles, i.e. relative thresholds. I guess this is the way to go then... – Michael Nov 14 '17 at 13:18

Probably not the best way but this is how i do it. I use GRASS GIS to process each band and then combine them together using ArcGIS (I'm sure all can be done in GRASS if you want)

  1. Import the bands to GRASS
  2. Execute r.quantile on each band to find the values of the percentiles you want. I use 1 and 99th
  3. Rescale with r.rescale using calculated percentiles as input so all pixels get values from 0 to 255
  4. Export using r.out.gdal

I then combine them to a 3-band image using ArcGIS

  • 1
    Yeah, that was exactly what I meant with keeping 95% (or 98% in your case) of the gray values in the middle. Currently, that seems to be the most reasonable solution for me. – Michael Nov 14 '17 at 11:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.