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:
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'))
.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:
- 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:
- De NDWI ontwikkeld door McFeeters (1996), als index voor het verscherpen van verschillen in waterlichamen;
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.
-
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
-
Maak een functie aan om de NDVI te berekenen. Laat de functie dan los op de Imagecollectie via
.map()
. -
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) -
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']
};
Oplossing Oefening NDVI per seizoen
Via deze link: https://code.earthengine.google.com/8062e044b1a25398df999d7942e7175f?noload=true