Tresholding
In vorige sectie behandelden we hoe we spectrale banden kunnen combineren tot indices. Het resultaat is steeds een rasterbeeld met continue waarden. Door middel van tresholding kan de informatie gecatalogiseerd worden, om tot discrete rasters te komen (bijvoorbeeld landcover data).
Dergelijke tresholds kunnen worden geimplementeerd met logische operatoren. Uit een NDVI kan bijvoorbeeld een eenvoudige landclassificatie berekend worden door een vegetatie/non-vegetatie kaart aan te maken.
1. Enkelvoudige Treshold
Laat ons een eenvoudige NDVI aanmaken voor de stad Belèm. Hieronder kun je alvast de code terugvinden om het beeld met de laagste wolkbedekking op te sporen en in te laden (we passen hier dus geen cloudmask op toe);
var Belem = ee.Geometry.Point([-48.499 , -1.4505]);
var S2_Belem = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED")
.filterBounds(Belem)
.filterDate('2024-03-01','2024-10-30')
.sort('CLOUDY_PIXEL_PERCENTAGE')
.first()
Map.centerObject(S2_Belem)
// NDVI berekenen
var Belem_NDVI = S2_Belem.normalizedDifference(['B8', 'B4']);
// Karteren van de NDVI
var NDVIPalette = ['red', 'white', 'green'];
Map.addLayer(Belem_NDVI, { min: -1, max: 1, palette: vegPalette }, 'NDVI Belem');
Bekijk opnieuw het bekomen beeld. Bekijk de waarden voor het stad, water, bos, bodem,.. met de inspector.
Aan de hand van een ruwe inschatting zou je kunnen zeggen dat alle NDVI waarden > 0.5 tropisch bos betreft. Deze waarde kunnen we bijgevolg gebruiken als treshold. Via de Boolean operator .gt()
('greater then'), kunnen we alle waarden groter dan 0.7 naar een binair raster brengen.
Andere operators zijn .lt()
= less than, .lte()
= 'less than or equal', .gte()
= 'greater than or equal', .eq()
= 'equal', .neq()
= 'not equal', ..
// Invoegen van de treshold waarde
var forest = Belem_NDVI.gt(0.7);
// Map de threshold.
Map.addLayerforest, { min: 0, max: 1, palette: ['white', 'green'] }, 'Non-forest vs. Forest');
Complexere categorieën met .where()
Indien er meerdere conditionals opgesteld dienen te worden, kan er gebruik gemaakt worden van de .where() methode. Hierbij wordt eerst een Image
geïniteerd waarbij alle waarden = 1. Deze wordt daarna bijgewerkt via de .where()
-functie (zoek deze op in de Docs!.
Zo wensen we bijvoorbeeld de NDVI in 3 klassen op te delen, zoals in onderstaande tabel beschrijven:
Beschrijving | Klasse | NDVI range |
---|---|---|
Water | 0 | =< -0.1 |
Non-forest | 1 | > -0.1 & =<0.7 |
Forest | 2 | > 0.7 |
// Start met een Image, waar alle waarden gelijk zijn aan 1
var belemClass = ee.Image(1)
// Maak gebruik van clip om bij te snijden tot onze bestaand beeld
belemClass = belemClass.clip(Belem_NDVI.geometry());
belemClass = belemClass.where(Belem_NDVI.lte(-0.1), 0); // Alle pixels waar NDVI < 0.1 => klasse 0
belemClass = belemClass.where(Belem_NDVI.gt(-0.1).and(Belem_NDVI.lte(0.7)), 1)
belemClass = belemClass.where(Belem_NDVI.gt(0.7).and(Belem_NDVI.lte(1)), 2)
// Visualisatie van de NDVI-vegetatiekaart
Map.addLayer(belemClass, { min: 0, max: 2, palette: ['blue', 'white', 'green'] }, 'Water, Non-forest, Forest');
Zoals in bovenstaand voorbeeld blijkt, kun je ook gebruik maken van de operatoren .and()
, .or()
en not()
NDVI tresholding kaart van Belèm