Ga naar inhoud

Beeldstatistieken

Histogram (herhaling)

Een histogram is, binnen de remote sensing, een grafische weergave van de statistische frequentie van de pixelwaarden binnen een satellietbeeld.
Deze pixelwaarden verspreiden zich doorgaans tussen 0 en 255. In een histogram worden deze waarden uitgezet op de x-as, terwijl de overeenkomstige frequentie per waarde op de y-as wordt weergegeven.

In wat volgt maken we een histogram van het aangemaakte NDVI-beeld. Hiervoor is steeds een regio (polygoon) noodzakelijk waarvoor het histogram wordt berekend. We doen dit eerst voor het volledige geselecteerde satellietbeeld. Om de geometrie van het beeld om te zetten naar een polygoon, gebruiken we de functie .geometry().

var ROI = ndvi.geometry();

Bekijk de resulterende ROI eventueel door deze te mappen met Map.addLayer(ROI). Uiteraard kun je ook handmatig een polygoon intekenen.

Om een histogram aan te maken wordt gebruik gemaakt van de ui.Chart.image.histogram()-functie binnen Earth Engine. Deze functie neemt volgende elementen aan (ook te checken via de 'Docs'): het beeld, de ROI, de schaal waarover de histogram wordt berekend, het aantal te plotten histogrambalkjes. Layout-opties worden afzonderlijk toegekend via .setOptions().

//Initialiseren van een histogram via de ui.Chart functie
var ndviHist = ui.Chart.image.histogram({
  image: ndvi,
  region: ROI,
  scale:10,
  maxBuckets: 50,
  maxPixels: 1e12
});

//Histogram updaten met stijlopties
ndviHist = ndviHist.setOptions({
  title: 'Histogram van NDVI in de Gentse Haven'
});

//Histogram schrijven naar de console
print(ndviHist)


Parameters meegeven aan een functie

Als je parameters meegeeft aan een functie in Javascript, kun je dit op 2 manieren doen:

  1. De (noodzakelijke) parameters meegeven in volgorde aan de functie. Bijvoorbeeld: ui.Chart.image.histogram(ndvi, ROI, 10, 50). Hierbij is het noodzakelijk dat de paramters in juist volgorde worden meegeven en er geen parameters worden overgeslagen.
  2. Opstellen van een dictionary, waarbij de parameters expliciet worden toegekend, zoals in het voorbeeld hierboven. Dit zorgt voor wat extra overzicht.
    var ndviHist = ui.Chart.image.histogram({
    image: ndvi,
    region: ROI,
    scale: 10,
    maxBuckets: 50,
    maxPixels: 1e12
    });
    
NDVI Histogram van Haven Gent/Vlaanderen

Als je kijkt naar het resulterend histogram, dan kun je enkele pieken opmerken: rond -0.3, rond 0.1 en rond 0.8. Verklaar de oorsprong van deze pieken.

Bandstatistieken

Om beeldstatistieken binnen een bepaalde ROI te berekenen binnen Earth Engine wordt gebruik gemaakt van image.reduceRegion(), of binnen meerdere regio's image.reduceRegions(). Het principe van deze 'beeldreducer' is hetzelfde als een recuder van een ImageCollection, met dat verschil dat de pixels binnen een regio van eenzelfde beeld worden gereduceerd, zoals in onderstaande figuur wordt geïllustreerd. Hiermee kan m.a.w. - binnen een bepaalde ROI - bepaalde statistieken berekend worden, zoals het minimum, gemiddelde pixelwaarde, maximum, mediane waarde, ...

Voorbeeld 1 - ReduceRegion

Code

Code kwijt van het NDVI-beeld voor Gent? Geen nood; open het snel hier:
https://code.earthengine.google.com/649932bfa4cdb955503df0c3f9ac4071


Illustratie van een Reducer toegepast op een beeld (Image) binnen een bepaalde regio.

//Statistieken van NDVI: Toepassen van een Reducer
var ndvi_mean = ndvi.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: Gent,
  scale: 10,
  maxPixels: 1e12
});

print('Gemiddelde NDVI-waarde', ndvi_mean)

Oefening - ReduceRegions

In dit voorbeeld werken we met de WorldClim-data. We berekenen per provincie de som van de maandelijkse gemiddelde neerslag.

Vraag: In welke provinice valt er gemiddeld het meeste regen in de maand Januari?

Tips:

  • Start met het visualizeren van een Image uit de collectie.
  • Filter de collectie op de maand Januari (! gebruik hiervoor de correcte eigenschap (attribute)).
  • Gebruik de ReduceRegions-functie, gelijkaardig aan de reduceRegion(), maar ditmaal geef je aan volgens welke collectie (= featurecollectin) je de reductie wilt uitvoeren. Geef daarnaast ook de te gebruiken reducer aan (ee.Reducer.sum()).
  • De vectorfile met de provincies kun je via onderstaand stukje code toevoegen aan je script:
   var provinces = ee.FeatureCollection('projects/teledetectie-2025-474312/assets/P2-FeatureExtraction/Belgium_provinces')
Oplossingen
var dataset = ee.ImageCollection('WORLDCLIM/V1/MONTHLY');
var meanPrec = dataset.select('prec');
var meanPrecVis = {
  min: 0.0,
  max: 100.0,
  palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red'],
};


var meanPrecJan = meanPrec.filter(ee.Filter.eq('month',1)).first()
print(meanPrec)

// Clippen op basis van de provincies, gegeven als polygonen:
var provinces = ee.FeatureCollection('projects/teledetectie-2025-474312/assets/P2-FeatureExtraction/Belgium_provinces')
var prec_Belgium = meanPrecJan.clip(provinces)
Map.addLayer(prec_Belgium , meanPrecVis, 'Mean Precipitation');

//Map.addLayer(provincies)
Map.centerObject(provinces)

//REDUCE REGIONS; Totale neerslag per provincie
var reduced = prec_Belgium.reduceRegions({
  'collection': provinces,
  'reducer':ee.Reducer.sum(),
  //'scale':927,
})

print(reduced)