[GRASS-user] i.atcorr with Sentinel2

Stefan Blumentrath Stefan.Blumentrath at nina.no
Tue Dec 19 01:56:17 PST 2017


Hi again,

Still trying to track down the issue...
I now ran i.atcorr with constant spectral condition and manually defined "wl inf" and "wl sup".

First I got those values for Sentinel-2 band 2: 
*                        spectral condition                                     *
*                        ------------------                                     *
*            sentinel2a blue b2                                                 *
*                value of filter function :                                     *
*                 wl inf=    0.300 mic   wl sup=    2.600 mic                  *

Then for Landsat 7 band 4 (that was known to give results):
*                        spectral condition                                     *
*                        ------------------                                     *
*            etm+ 4                                                             *
*                value of filter function :                                     *
*                 wl inf=    0.740 mic   wl sup=    0.913 mic                  *


If I then feed those values into a filter function for constant spectral conditions, and again the Sentinel-2 values:
*                        spectral condition                                     *
*                        ------------------                                     *
*            constant                                                           *
*                value of filter function :                                     *
*                 wl inf=    0.300 mic   wl sup=    2.600 mic                  *
lead to empty maps, while Landsat7 values:
*                        spectral condition                                     *
*                        ------------------                                     *
*            constant                                                           *
*                value of filter function :                                     *
*                 wl inf=    0.740 mic   wl sup=    0.913 mic                  *
work fine (with all other settings being equal).

That makes me suspect that the values of the Sentinel-2 filter function are actually causing the issue here...
I am currently testing all thinkable combinations of input band ranges to see if any of them works with wl inf=0.300 mic and wl sup=2.600 mic and will report back from that exercise.

Meanwhile, can anyone confirm that i.atcorr in GRASS 7.4.0RC1 actually works with Sentinel-2 data?

Cheers
Stefan



-----Original Message-----
From: grass-user [mailto:grass-user-bounces at lists.osgeo.org] On Behalf Of Stefan Blumentrath
Sent: tirsdag 19. desember 2017 08.45
To: Moritz Lennert <mlennert at club.worldonline.be>; Žofie Cimburová <zoficimburova at gmail.com>
Cc: GRASS user list <grass-user at lists.osgeo.org>
Subject: Re: [GRASS-user] i.atcorr with Sentinel2

Hi again,

A little update on the problem:
Now I ran i.atcorr with all possible band values for Sentinel-2 in the 6s parameters (166-178) with input maps ranges scaled to 0-1, 0-255, 0-10000 All runs resulted in completely empty maps!
Any ideas?

Thanks for helping in advance!

Kind regards,
Stefan

-----Original Message-----
From: Moritz Lennert [mailto:mlennert at club.worldonline.be]
Sent: mandag 18. desember 2017 16.58
To: Stefan Blumentrath <Stefan.Blumentrath at nina.no>; Žofie Cimburová <zoficimburova at gmail.com>
Cc: GRASS user list <grass-user at lists.osgeo.org>
Subject: Re: [GRASS-user] i.atcorr with Sentinel2

On 18/12/17 16:35, Stefan Blumentrath wrote:
> Hi Moritz,
> 
> Thanks for helping with troubleshooting!
> QUANTIFICATION_VALUE is 10000, Thus dividing with it gives a maximum value of 2.8...
> Any idea how to figure out if it is 12 or 16 bit image. It is directly downloaded from ESA...

Check which proportion of the image is > 1. AFAIR (which is a bit limited), you might have reflectances above 1 in saturated pixels. I just checked on a random image and I also have some pixels above 1, but only 0.25% of the pixels:

GRASS 7.5.svn (UTM32N):/data/home/mlennert > r.mapcalc "test = if(b04_refl>1,1,0)"
  100%
GRASS 7.5.svn (UTM32N):/data/home/mlennert > r.stats -cp test
  100%
0 120259106 99.75%
1 301294 0.25%

And all the pixels with value 1 are in clouded areas.

Moritz

> 
> Cheers
> Stefan
> 
> -----Original Message-----
> From: grass-user [mailto:grass-user-bounces at lists.osgeo.org] On Behalf 
> Of Moritz Lennert
> Sent: mandag 18. desember 2017 16.26
> To: Žofie Cimburová <zoficimburova at gmail.com>
> Cc: GRASS user list <grass-user at lists.osgeo.org>
> Subject: Re: [GRASS-user] i.atcorr with Sentinel2
> 
> On 18/12/17 16:13, Žofie Cimburová wrote:
>> Dear Moritz,
>>
>> According to
>> https://earth.esa.int/web/sentinel/user-guides/sentinel-2-msi/product
>> - types , the L1C product I am using already is in top of atmosphere 
>> reflectance, so this should not be the problem (?).
>> I tried running i.atcorr both with and without the -r flag.
> 
> Reflectance is the percentage of light that is reflected either from 
> the top of the atmosphere or from the surface. Reflectance values 
> should thus be real values between 0 and 1. Your data have
> 
> Range of data:    min = 1  max = 28000
> 
> This means that they are expressed in digital (integer) numbers. Try transforming these DN into real numbers. IIRC, in the metadata, you have a variable QUANTIFICATION_VALUE. Divide your pixel values by that value to get real TOA reflectance values.
> 
> AFAIK, it also depends on whether you directly imported the original 12-bit file, or possibly a modified, e.g. 16-bit, version.
> 
> Moritz
> 
>> On Mon, Dec 18, 2017 at 3:35 PM, Moritz Lennert 
>> <mlennert at club.worldonline.be <mailto:mlennert at club.worldonline.be>> wrote:
>>
>>      On 18/12/17 13:14, Žofie Cimburová wrote:
>>
>>          Hi all,
>>          Now the 6S parameters are complete, but the output map contains
>>          only NULLs, no matter what combinations of input parameters and
>>          flags I use. Have anyone encountered the same issue? (Info
>> below.)
>>
>>
>>      In the i.atcorr man page it says:
>>
>>      "If flag -r is used, the input raster data are treated as
>>      reflectance. Otherwise, the input raster data are treated as
>>      radiance values"
>>
>>      IIUC, your data is still in DN. You might want to try to transform
>>      this into radiance values before sending it into i.atcorr.
>>
>>      Moritz
>>
>>
>>          Thanks again.
>>          Zofie
>>
>>          ----------------------------------------
>>          Version:
>>          g.version -g
>>          version=7.4.0RC1
>>          date=2017
>>          revision=exported
>>          build_date=2017-11-18
>>          build_platform=x86_64-pc-linux-gnu
>>          build_off_t_size=8
>>
>>          ----------------------------------------
>>          Region:
>>          g.region -p
>>          projection: 1 (UTM)
>>          zone:       33
>>          datum:      etrs89
>>          ellipsoid:  grs80
>>          north:      6653695
>>          south:      6643685
>>          west:       256495
>>          east:       266505
>>          nsres:      10
>>          ewres:      10
>>          rows:       1001
>>          cols:       1001
>>          cells:      1002001
>>
>>          ----------------------------------------
>>          Input data: Sentinel2 L1C product B02 (tried with B01 too)
>>          r.info <http://r.info> <http://r.info>
>>          map=test_B02 at p_Sentinel4Nature_S2_Oslo
>>             +----------------------------------------------------------------------------+
>>             | Map:      test_B02 at p_Sentinel4Nat  Date: Wed Dec  6
>>          12:06:39 2017
>>             | Mapset:   p_Sentinel4Nature_S2_Oslo      Login of Creator:
>>          stefan.blumentr
>>             | Location: ETRS_33N
>>             | DataBase: /data/grass
>>             | Title:
>>          S2A_OPER_PRD_MSIL1C_PDMC_20160907T044118_R008_V20160905T104022_2
>>             | Timestamp: none
>>             |----------------------------------------------------------------------------|
>>             |
>>             |   Type of Map:  raster               Number of Categories: 0
>>             |   Data Type:    CELL
>>             |   Rows:         1001
>>             |   Columns:      1001
>>             |   Total Cells:  1002001
>>             |        Projection: UTM (zone 33)
>>             |            N:    6653695    S:    6643685   Res:    10
>>             |            E:     266505    W:     256495   Res:    10
>>             |   Range of data:    min = 1  max = 28000
>>             |
>>             |   Data Description:
>>             |    generated by r.in.gdal
>>             
>> +--------------------------------------------------------------------
>> +-
>> -------+
>>
>>          ----------------------------------------
>>          6s file:
>>          25- geometrical conditions=Sentinel-2A
>>          9 5 10.6728 10.73413 59.90647- month day hh.ddd longitude latitude
>>          4 - atmospheric model=subarctic summer
>>          3- aerosol model=urban
>>          50- visibility [km] (aerosol model concentration) (this is
>>          estimated, I also tried with AOD specified)
>>          -0.055- mean target elevation above sea level [km]
>>          -1000- sensor height
>>          166- Sentinel2A Blue band B2 (440nm - 535nm)
>>
>>          ----------------------------------------
>>          Command:
>>          i.atcorr input=test_B02 at p_Sentinel4Nature_S2_Oslo range=1,28000
>>          elevation=dem_10m_25833 at p_Sentinel4Nature_S2_Oslo
>>          parameters=/home/NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt
>>          <http://NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt>
>>          <http://NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt
>>          <http://NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt>>
>>          output=test_B02_atcorr
>>            >Atmospheric correction...
>>            >Atmospheric correction complete.
>>
>>          (I am not sure about the range parameter, tried with 0,255 too.
>>          The DEM contains no NULLs. Also tried running with -r and -a
>> flags.)
>>
>>          ----------------------------------------
>>          Output:
>>          r.info <http://r.info> <http://r.info>
>>          map=test_B02_atcorr at p_Sentinel4Nature_S2_Oslo
>>             +----------------------------------------------------------------------------+
>>             | Map:      test_B02_atcorr at p_Sentinel4N  Date: Mon Dec 18
>>          13:10:14 2017
>>             | Mapset:   p_Sentinel4Nature_S2_Oslo      Login of Creator:
>>          zofie.cimburova
>>             | Location: ETRS_33N
>>             | DataBase: /data/grass
>>             | Title:    test_B02_atcorr2
>>             | Timestamp: none
>>             |----------------------------------------------------------------------------|
>>             |
>>             |   Type of Map:  raster               Number of Categories: 0
>>             |   Data Type:    FCELL
>>             |   Rows:         1001
>>             |   Columns:      1001
>>             |   Total Cells:  1002001
>>             |        Projection: UTM (zone 33)
>>             |            N:    6653695    S:    6643685   Res:    10
>>             |            E:     266505    W:     256495   Res:    10
>>             |   Range of data:    min = -nan  max = -nan
>>             |
>>             |   Data Description:
>>             |    generated by i.atcorr
>>             |
>>             |   Comments:
>>             |    i.atcorr input="test_B02 at p_Sentinel4Nature_S2_Oslo"
>>          range=1,28\
>>             |    000 elevation="dem_10m_25833 at p_Sentinel4Nature_S2_Oslo"
>>          para\
>>             |
>>          meters="/home/NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt <http://NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt>
>>          <http://NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt
>>          <http://NINA.NO/zofie.cimburova/Sentinel4Nature/DATA/6s.txt>>" o\
>>             |    utput="test_B02_atcorr2" rescale=0,255
>>             |
>>             
>> +--------------------------------------------------------------------
>> +-
>> -------+
>>
>>
>>
>>          On Fri, Dec 15, 2017 at 5:12 PM, Žofie Cimburová
>>          <zoficimburova at gmail.com <mailto:zoficimburova at gmail.com>
>>          <mailto:zoficimburova at gmail.com
>>          <mailto:zoficimburova at gmail.com>>> wrote:
>>
>>               Dear Markus,
>>               thanks for your reply, this is exactly what I need to know!
>>
>>               Best, Zofie
>>
>>               On Fri, Dec 15, 2017 at 5:09 PM, Markus Neteler
>>          <neteler at osgeo.org <mailto:neteler at osgeo.org>
>>               <mailto:neteler at osgeo.org <mailto:neteler at osgeo.org>>> wrote:
>>
>>
>>                   On Dec 15, 2017 3:54 PM, "Žofie Cimburová"
>>                   <zoficimburova at gmail.com
>>          <mailto:zoficimburova at gmail.com> <mailto:zoficimburova at gmail.com
>>          <mailto:zoficimburova at gmail.com>>> wrote:
>>                   >
>>                   > Dear all,
>>                   > I am trying to use i.atcorr (GRASS 7.4) to apply
>>          atmospheric corrections for Sentinel 2 data. The documentation
>>          provides a great help, but there are two points I am not sure
>>          about -         >
>>                   > - I don't need the atmospheric correction to be
>>          applied to the whole scene, so I only imported a small clip of
>>          the scene to GRASS. What longitude and latitude shall I then
>>          specify in the 6S parameters?
>>
>>                   I'd use the center coordinates of the clipped area.
>>
>>                   > Or is it necessary to apply the corrections to the
>>          entire scene?
>>
>>                   No since it is a pixel based algorithm.
>>
>>                   > - How can I estimate the value of visibility (aerosol
>>          model concentration)?
>>                   There are AERONET data online somewhere which might be
>>          the best
>>                   choice.
>>
>>                   Markus
>>
>>
>>
>>
>>
>>          _______________________________________________
>>          grass-user mailing list
>>          grass-user at lists.osgeo.org <mailto:grass-user at lists.osgeo.org>
>>          https://lists.osgeo.org/mailman/listinfo/grass-user
>>          <https://lists.osgeo.org/mailman/listinfo/grass-user>
>>
>>
>>
>>
> 
> 
> _______________________________________________
> grass-user mailing list
> grass-user at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/grass-user
> 


_______________________________________________
grass-user mailing list
grass-user at lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/grass-user


More information about the grass-user mailing list