Ga naar inhoud

Spectrale indices

Spectral indices zijn combinaties van 2 of meerdere spectrale banden die gebruikt worden om bepaalde features extra in de verf te zetten of ze te herberekenen naar een relatieve schaal. Ze worden berekend aan de hand van bandbewerkingen,die op verschillende manieren in Google Earth Engine geimplementeerd kunnen worden.

1. NDVI

De Normalized Difference Vegatation Index (NDVI) is wellicht de meest bekende vegetatieindex, en wordt berekend als:

\[NDVI = { NIR - RED \over NIR + RED}.\]

Waarbij:
NIR = reflectie in het nabij-infrarode gebied van het spectrum (oftwel Near-Infrared)
RED = reflectie in het rode gebied van het spectrum

De resulterende index krijgt waarden binnen tussen -1 en 1.

De NDVI is een maat voor de dichtheid/gezondheid van vegetatie op basis van verschillen in lichtreflectie tussen het rode en infrarode spectrum. Vegetatie absorbeert veel zichtbaar licht voor fotosynthese (laagste reflectie in het rode deel van het spectrum) en weerkaatst bijna al het nabij-infrarode licht (hoge NIR-reflectiewaarde), wat zorgt voor een hogere NDVI-waarde. Hoe dichter de vegetatie, hoe hoger de NDVI.

Andere objecten, zoals water, absorberen NIR-licht juist goed, waardoor de NDVI-waarde voor water en niet-vegetatieve oppervlakken lager, of zelfs negatief uitvalt.

In Earth Engine kan de NDVI (en andere indices) op verschillende manieren berekend worden. We starten met de ‘meest conventionele’:

  • We starten deze oefening door het aanmaken van een Sentinel-2 beeld in Gent. Maak een punt-geometrie aan ergens ter hoogte van de Gentse haven te Evergem.


  • Stap 1 - Importeren en visualisatie Sentinel-2 beeld: Importeer de Sentinel-2 Surface Reflectance (Harmonized) collection en zoek naar het beeld met de laagste wolkbedekking uit 2024 in de periode mei-juni (= de late lente). Bekijk op welke datum het beeld werd genomen. Visualiseer als een valse kleurencomposiet.

  • Stap 2 - We beschikken tevens over de grenzen van Gent als polygoon (vector). Voeg deze toe aan je script. De vectorfile bevat alle gemeenten in België, waaruit we Gent op basis van de 'Name'-eigenschap filteren.

var Gent = ee.FeatureCollection('projects/ee-tele-2024/assets/P3-FeatureExtraction/Belgium_municipalities').filter(ee.Filter.eq('Name','Gent'))
Je kunt je beeld nu verder begrenzen a.d.h.v. deze vectorfile. Gebruik hiervoor de functie .clip(Gent) die je toepast op je verkregen Sentinel-2 beeld.

Oplossing
// Inladen van 'shape' stad Gent
var Gent = ee.FeatureCollection('projects/ee-tele-2024/assets/P3-FeatureExtraction/Belgium_municipalities').filter(ee.Filter.eq('Name','Gent'))

//1. Importeren van de Sentinel-2 collectie.
var S2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED");

//Filteren op basis van datum (lente 2024) + beeld met laagste wolkenpercentage selecteren
var S2_Gent_Lente24 = S2.filterBounds(Gent)
    .filterDate('2024-03-20', '2024-06-30')
    .sort('CLOUDY_PIXEL_PERCENTAGE')
    .first()
.divide(10000); // Remember: herschalen naar 0 - 1 waarden

print('Gent Lente 24: ',S2_Gent_Lente24)

//Clippen naar Grenzen Gent
var S2_Gent_Lente24 = S2_Gent_Lente24.clip(Gent)

//Visualisatieparameters (of handmatig instellen)
var S2_ValseKleuren = {
  gamma: 1,
  min: 0,
  max: 0.3, 
  bands: ['B8', 'B4', 'B3'],
  };

//Toevoegen aan Map
Map.addLayer(S2_Gent_Lente24,S2_ValseKleuren,'Valse Kleuren lente 2024')
  • Stap 3 - Toevoegen van de NDVI: Een eerste methode om een NDVI aan te maken is via de ingebouwde .normalizedDifference() functie. Ga na welke Sentinel-2 banden je nodig hebt om de ndvi te berekenen. (Maak eventueel gebruik van de ‘Docs’-tab.)

    //2. Aanmaken NDVI via NormalDifference()-functie. Vul de '?' in
    var ndvi = S2_Gent_Lente24.normalizedDifference(['?', '?']).rename('NDVI');
    Map.addLayer(ndvi,{},'ndvi_lente_2024') //Zonder visualisatieparametes
    


  • Een ndvi wordt meestal afgebeeld met een kleurenschema, zoals onderstaand voorbeeld:

    // Met visualisatie
    var ndviParams = {min: -1, max: 1, palette: ['red','yellow','darkgreen']};
    Map.addLayer(ndvi, ndviParams, 'ndvi_2024_vis');
    


Oefening: Connecteer de ndvi-waarden met de gepaste landbedekkingsklasse.
NDVI waarde Landbedekking (Lente)
Negatief (< 0) stenen, bodem, schaduw
Kleine waarden (0.1 or less) Grasland/lage vegetatie
Moderate values (0.2 to 0.3) Dense vegetatie
Large values (0.6 to 1) wolken, water, sneeuw
Antwoord
NDVI waarde Landbedekking (Lente)
Negative values (< 0) water / sneeuw / Wolken
Small values (0.1 or less) stenen, naakte grond, schaduw
Moderate values (0.2 to 0.5) Verspreide vegetatie, ongezond
Large values (0.6 to 1) Dense vegetatie

2. Bandbewerkingen

Bandbewerkingen kunnen worden gebruikt om een nieuw beeld aan te maken van de reeds bestaande banden. Het berekenen van indices zoals de NDVI, is al een treffend voorbeeld hiervan. Andere mogelijkheden zijn ratio’s, het verschil van 2 beelden op 2 verschillende tijdstippen om mogelijke veranderingen visueel te benadrukken, …

Er zijn 2 manieren om in Earth Engine een bewerking uit te voeren.

Optie 1 - Bewerkingen via operatoren

De basisoperators maken gebruik van 2 inputs: ofwel 2 beelden, ofwel 1 beeld en 1 constante. De bewerkingen worden steeds per pixel en per band uitgevoerd. Voorbeeld van operatoren zijn add(), subtract() en divide().

//NDVI berekenen aan de hand van bandwerkingen met operatoren
// Lange uitwerking: noodzakelijke banden eerst selecteren en onderbrengen in een nieuwe variabele
var nir = S2_Gent_Lente22.select('B8');
var red = S2_Gent_Lente22.select('B4');
var ndvi2 = nir.subtract(red).divide(nir.add(red)).rename('NDVI');
Map.addLayer(ndvi2, ndviParams, 'ndvi via operatoren');

Het resultaat is logischerwijs identiek als de voorgaande ndvi-berekening.

Optie 2 - Bewerkingen via expressies

Het spreekt voor zich dat bovenstaande methode voor complex wiskundige bewerkingen niet handig is. Voor dergelijke bewerkingen wordt aangeraden om gebruik te maken van image.expression(), gezien de inputvariabelen hier afzonderlijk worden aangegeven, waardoor de bewerking gemakkelijker wordt weergegeven en het coderen zo vereenvoudigd wordt. De expressie aanvaardt tevens ook constanten. Variabelen die binnen de expressie worden gebruikt, moeten steeds worden aangegeven, zoals in onderstaande NDVI-berekening;

//NDVI aan de hand van een expressie
  var ndvi3 = S2_Gent_Lente24.expression(
      '(NIR - RED)/(NIR + RED)', {
        'NIR': S2_Gent_Lente22.select('B8'),
        'RED': S2_Gent_Lente22.select('B4')
  });

Ook hier is het resultaat hetzelfde als de vorige ndvi-berekeningen.

Gebruikte operators binnen expressies

Onderstaande tabel geeft de binnen de expressies gehanteerde operators weer (bron: Earth Engine guide)


3. Andere indices

Naast de NDVI bestaan er nog een heleboel andere indices, elk met een eigen toepassing.

De Normalized Difference Water Index (NDWI)

Er bestaan 2 indices met de naam 'NDWI', beiden gerelateerd aan water:

  1. De NDWI ontwikkeld door Gao (1996), als index voor het watergehalte van vegetatie. De Index is gebaseerd op de NIR (gevoelig voor vegetatie) en SWIR (gevoelig voor water) banden:
\[NDWI = { NIR - SWIR \over NIR + SWIR}.\]
  1. De NDWI ontwikkeld door McFeeters (1996), als index voor het verscherpen van verschillen in waterlichamen;
\[NDWI = { GREEN - NIR \over GREEN + NIR}.\]

4. Opdrachten

Oef 3.1 - NDWI

Test beide NDWI-indices uit op het Sentinel-beeld van de Gentse Haven en omstreken. Bekijk de verschillen. Kijk hiervoor zeker naar naburige natuurgebieden en waterplassen.

Oef 3.2 - NDVI per seizoen

In deze oefening maak je een visualisatie van de NDVI per seizoen ter hoogte van Durbuy.

  1. Maak een wolkenvrije beeldencollectie aan (gebruik een maximaal aan wolkbedekking van 30%) aan van de regio Durbuy. Maak gebruik van de Cloudmask-procedure, op basis van de S2_CloudProbability collectie, zoals hier beschreven: https://users.ugent.be/~jfeyen/P2/P2-Cloud_masking.html#2-cloud-mask-van-sentinel-2-data

  2. Maak een functie aan om de NDVI te berekenen. Laat de functie dan los op de Imagecollectie via .map().

  3. Maak aan de hand van de collectie 3 beelden aan met een median()-reducer, binnen volgende periodes:

    A. Jan- 15 maart(Winter)
    B. 15 maart - Mei (Lente)
    C. Juli-Augustus (Zomer)

  4. Visualiseer voor elk seizoen een Normale Kleurencomposiet en een NDVI-beeld. Gebruik onderstaande visualisatieparameters bij het plotten:

//Visualisatieparameters instellen
var NormaleKleuren = {
  min: 0,
  max: 0.3,
  bands: ['B4', 'B3', 'B2'],
};

var ndviParams = {
  min: 0,
  max: 1,
  bands: ['NDVI'],
  palette: ['red','yellow','darkgreen']
};