Gewichtete Rabatte

Standardmäßig werden bei Reduzierern, die auf Bilder angewendet werden, die Eingaben entsprechend dem Maskenwert gewichtet. Dies ist im Zusammenhang mit gebrochenen Pixeln relevant, die durch Vorgänge wie clip() erstellt werden. Sie können dieses Verhalten anpassen, indem Sie unweighted() für den Reducer aufrufen. Wenn Sie einen nicht gewichteten Reducer verwenden, haben alle Pixel in der Region dasselbe Gewicht. Das folgende Beispiel zeigt, wie sich die Gewichtung von Pixeln auf die Ausgabe des Reducer auswirken kann:

Bei gewichteten Reduzierungen werden die Gewichte für Pixelüberschneidungen intern als 8‑Bit-Ganzzahlen (0 bis 255) dargestellt. Dabei wird die fraktionale Pixelabdeckung in 256 diskrete Stufen quantisiert. Daher wird jeder Abdeckungsbruchteil, der kleiner als etwa 1/256 (~0,4%) ist, auf ein Gewicht von 0 (ungültig) abgerundet. Weitere Informationen zur Gewichtung von Pixeln in einer Region finden Sie im Leitfaden zum Reduzieren von Regionen.

Code-Editor (JavaScript)

// Load a Landsat 8 input image.
var image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318');

// Create an arbitrary region.
var geometry = ee.Geometry.Rectangle(-122.496, 37.532, -121.554, 37.538);

// Make an NDWI image.  It will have one band named 'nd'.
var ndwi = image.normalizedDifference(['B3', 'B5']);

// Compute the weighted mean of the NDWI image clipped to the region.
var weighted = ndwi.clip(geometry)
  .reduceRegion({
    reducer: ee.Reducer.mean(),
    geometry: geometry,
    scale: 30})
  .get('nd');

// Compute the UN-weighted mean of the NDWI image clipped to the region.
var unweighted = ndwi.clip(geometry)
  .reduceRegion({
    reducer: ee.Reducer.mean().unweighted(),
    geometry: geometry,
    scale: 30})
  .get('nd');

// Observe the difference between weighted and unweighted reductions.
print('weighted:', weighted);
print('unweighted', unweighted);

Python einrichten

Weitere Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung finden Sie auf der Seite Python-Umgebung.

import ee
import geemap.core as geemap

Colab (Python)

# Load a Landsat 8 input image.
image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318')

# Create an arbitrary region.
geometry = ee.Geometry.Rectangle(-122.496, 37.532, -121.554, 37.538)

# Make an NDWI image.  It will have one band named 'nd'.
ndwi = image.normalizedDifference(['B3', 'B5'])

# Compute the weighted mean of the NDWI image clipped to the region.
weighted = (
    ndwi.clip(geometry)
    .reduceRegion(reducer=ee.Reducer.mean(), geometry=geometry, scale=30)
    .get('nd')
)

# Compute the UN-weighted mean of the NDWI image clipped to the region.
unweighted = (
    ndwi.clip(geometry)
    .reduceRegion(
        reducer=ee.Reducer.mean().unweighted(), geometry=geometry, scale=30
    )
    .get('nd')
)

# Observe the difference between weighted and unweighted reductions.
display('weighted:', weighted)
display('unweighted', unweighted)

Der Unterschied in den Ergebnissen ist darauf zurückzuführen, dass Pixel am Rand der Region durch den Aufruf von unweighted() für den Reducer das Gewicht 1 erhalten.

Um eine explizit gewichtete Ausgabe zu erhalten, ist es besser, die Gewichte explizit mit splitWeights() im Reducer festzulegen. Ein durch splitWeights() modifizierter Reduzierer akzeptiert zwei Eingaben, wobei die zweite Eingabe das Gewicht ist. Im folgenden Beispiel wird splitWeights() veranschaulicht, indem der gewichtete Mittelwert des normierten differenzierten Vegetationsindex (Normalized Difference Vegetation Index, NDVI) in einer Region berechnet wird. Die Gewichte werden durch den Cloud-Score bestimmt (je wolkiger, desto geringer das Gewicht):

Code-Editor (JavaScript)

// Load an input Landsat 8 image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_186059_20130419');

// Compute cloud score and reverse it such that the highest
// weight (100) is for the least cloudy pixels.
var cloudWeight = ee.Image(100).subtract(
  ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud']));

// Compute NDVI and add the cloud weight band.
var ndvi = image.normalizedDifference(['B5', 'B4']).addBands(cloudWeight);

// Define an arbitrary region in a cloudy area.
var region = ee.Geometry.Rectangle(9.9069, 0.5981, 10.5, 0.9757);

// Use a mean reducer.
var reducer = ee.Reducer.mean();

// Compute the unweighted mean.
var unweighted = ndvi.select(['nd']).reduceRegion(reducer, region, 30);

// compute mean weighted by cloudiness.
var weighted = ndvi.reduceRegion(reducer.splitWeights(), region, 30);

// Observe the difference as a result of weighting by cloudiness.
print('unweighted:', unweighted);
print('weighted:', weighted);

Python einrichten

Weitere Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung finden Sie auf der Seite Python-Umgebung.

import ee
import geemap.core as geemap

Colab (Python)

# Load an input Landsat 8 image.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_186059_20130419')

# Compute cloud score and reverse it such that the highest
# weight (100) is for the least cloudy pixels.
cloud_weight = ee.Image(100).subtract(
    ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud'])
)

# Compute NDVI and add the cloud weight band.
ndvi = image.normalizedDifference(['B5', 'B4']).addBands(cloud_weight)

# Define an arbitrary region in a cloudy area.
region = ee.Geometry.Rectangle(9.9069, 0.5981, 10.5, 0.9757)

# Use a mean reducer.
reducer = ee.Reducer.mean()

# Compute the unweighted mean.
unweighted = ndvi.select(['nd']).reduceRegion(reducer, region, 30)

# compute mean weighted by cloudiness.
weighted = ndvi.reduceRegion(reducer.splitWeights(), region, 30)

# Observe the difference as a result of weighting by cloudiness.
display('unweighted:', unweighted)
display('weighted:', weighted)

cloudWeight muss als Bereich hinzugefügt werden, bevor reduceRegion() aufgerufen wird. Das Ergebnis zeigt, dass der geschätzte mittlere NDVI höher ist, weil das Gewicht von bewölkten Pixeln verringert wurde.