Resampling und Auflösung reduzieren

Wie im Dokument Projektionen erwähnt, führt Earth Engine bei der Reprojektion standardmäßig eine Nearest-Neighbor-Resampling-Methode aus. Sie können dieses Verhalten mit den Methoden resample() oder reduceResolution() ändern. Wenn eine dieser Methoden auf ein Eingabebild angewendet wird, erfolgt die erforderliche Neuprojektion der Eingabe mit der angegebenen Methode für die Neuberechnung oder Aggregation.

Resampling

Bei resample() wird die angegebene Methode für die Neuberechnung ('bilinear' oder 'bicubic') bei der nächsten Neuprojektion verwendet. Da Eingaben in der Ausgabeprojektion angefordert werden, kann es vor jeder anderen Operation an der Eingabe zu einer impliziten Neuprojektion kommen. Rufen Sie resample() daher direkt auf das Eingabebild. Betrachten Sie das folgende einfache Beispiel:

Code-Editor (JavaScript)

// Load a Landsat image over San Francisco, California, UAS.
var landsat = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20160323');

// Set display and visualization parameters.
Map.setCenter(-122.37383, 37.6193, 15);
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the Landsat image using the default nearest neighbor resampling.
// when reprojecting to Mercator for the Code Editor map.
Map.addLayer(landsat, visParams, 'original image');

// Force the next reprojection on this image to use bicubic resampling.
var resampled = landsat.resample('bicubic');

// Display the Landsat image using bicubic resampling.
Map.addLayer(resampled, visParams, 'resampled');

Python einrichten

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

import ee
import geemap.core as geemap

Colab (Python)

# Load a Landsat image over San Francisco, California, UAS.
landsat = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20160323')

# Set display and visualization parameters.
m = geemap.Map()
m.set_center(-122.37383, 37.6193, 15)
vis_params = {'bands': ['B4', 'B3', 'B2'], 'max': 0.3}

# Display the Landsat image using the default nearest neighbor resampling.
# when reprojecting to Mercator for the Code Editor map.
m.add_layer(landsat, vis_params, 'original image')

# Force the next reprojection on this image to use bicubic resampling.
resampled = landsat.resample('bicubic')

# Display the Landsat image using bicubic resampling.
m.add_layer(resampled, vis_params, 'resampled')

Beachten Sie, dass die Ausgabepixel durch das 'bicubic'-Resampling im Vergleich zum Originalbild weich erscheinen (Abbildung 1).

Nearest Neighbor
Abbildung 1a: Landsat-Bilder, die mit der Nearest-Neighbor-Methode neu gemustert wurden.
Bikubische
Abbildung 1b Mit bikubischem Resampling neu gemusterte Landsat-Bilder.

Die Reihenfolge der Vorgänge für dieses Codebeispiel ist in Abbildung 2 dargestellt. Die implizite Neuprojektion in die Mercator-Projektion erfolgt mit der für das Eingabebild angegebenen Methode zur Neuberechnung.

Flussdiagramm der Vorgänge

Abbildung 2: Flussdiagramm der Vorgänge, wenn resample() auf das Eingabebild aufgerufen wird, bevor es im Code-Editor angezeigt wird. Gebogenen Linien geben den Informationsfluss zur Neuprojektion an, insbesondere die Ausgabeprojektion, den Maßstab und die zu verwendende Methode für die Neuberechnung.

Auflösung reduzieren

Angenommen, Sie möchten anstelle des Resamplings bei der Neuprojektion Pixel in einer anderen Projektion zu größeren Pixeln zusammenfassen. Das ist nützlich, wenn Bilddatensätze in verschiedenen Skalen verglichen werden, z. B. 30-Meter-Pixel aus einem Landsat-basierten Produkt mit groben Pixeln (höhere Skala) aus einem MODIS-basierten Produkt. Sie können diesen Aggregationsprozess mit der Methode reduceResolution() steuern. Wie bei resample() wird reduceResolution() auf die Eingabe aufgerufen, um die nächste Neuprojektion des Bildes zu beeinflussen. Im folgenden Beispiel werden mit reduceResolution() Daten zur Waldbedeckung mit einer Auflösung von 30 Metern mit einem Vegetationsindex mit einer Auflösung von 500 Metern verglichen:

Code-Editor (JavaScript)

// Load a MODIS EVI image.
var modis = ee.Image(ee.ImageCollection('MODIS/061/MOD13A1').first())
    .select('EVI');

// Display the EVI image near La Honda, California.
Map.setCenter(-122.3616, 37.5331, 12);
Map.addLayer(modis, {min: 2000, max: 5000}, 'MODIS EVI');

// Get information about the MODIS projection.
var modisProjection = modis.projection();
print('MODIS projection:', modisProjection);

// Load and display forest cover data at 30 meters resolution.
var forest = ee.Image('UMD/hansen/global_forest_change_2023_v1_11')
    .select('treecover2000');
Map.addLayer(forest, {max: 80}, 'forest cover 30 m');

// Get the forest cover data at MODIS scale and projection.
var forestMean = forest
    // Force the next reprojection to aggregate instead of resampling.
    .reduceResolution({
      reducer: ee.Reducer.mean(),
      maxPixels: 1024
    })
    // Request the data at the scale and projection of the MODIS image.
    .reproject({
      crs: modisProjection
    });

// Display the aggregated, reprojected forest cover data.
Map.addLayer(forestMean, {max: 80}, 'forest cover at MODIS scale');

Python einrichten

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

import ee
import geemap.core as geemap

Colab (Python)

# Load a MODIS EVI image.
modis = ee.Image(ee.ImageCollection('MODIS/006/MOD13A1').first()).select('EVI')

# Display the EVI image near La Honda, California.
m.set_center(-122.3616, 37.5331, 12)
m.add_layer(modis, {'min': 2000, 'max': 5000}, 'MODIS EVI')

# Get information about the MODIS projection.
modis_projection = modis.projection()
display('MODIS projection:', modis_projection)

# Load and display forest cover data at 30 meters resolution.
forest = ee.Image('UMD/hansen/global_forest_change_2015').select(
    'treecover2000'
)
m.add_layer(forest, {'max': 80}, 'forest cover 30 m')

# Get the forest cover data at MODIS scale and projection.
forest_mean = (
    forest
    # Force the next reprojection to aggregate instead of resampling.
    .reduceResolution(reducer=ee.Reducer.mean(), maxPixels=1024)
    # Request the data at the scale and projection of the MODIS image.
    .reproject(crs=modis_projection)
)

# Display the aggregated, reprojected forest cover data.
m.add_layer(forest_mean, {'max': 80}, 'forest cover at MODIS scale')

In diesem Beispiel wird die Ausgabeprojektion explizit mit reproject() festgelegt. Bei der Umprojektionierung in die sinusförmige MODIS-Projektion werden die kleineren Pixel nicht neu abgetastet, sondern mit dem angegebenen Reducer (ee.Reducer.mean() im Beispiel) aggregiert. Diese Abfolge von Vorgängen ist in Abbildung 3 dargestellt. In diesem Beispiel wird reproject() verwendet, um die Auswirkungen von reduceResolution() zu veranschaulichen. Bei den meisten Scripts muss jedoch nicht explizit eine Neuprojektion durchgeführt werden. Weitere Informationen finden Sie in dieser Warnung.

Flussdiagramm der Vorgänge

Abbildung 3: Flussdiagramm der Vorgänge, wenn reduceResolution() vor reproject() auf ein Eingabebild aufgerufen wird. Gebogenen Linien geben den Informationsfluss zur Neuprojektion an, insbesondere die Ausgabeprojektion, den Maßstab und die zu verwendende Pixelaggregationsmethode.

Pixelgewichte für ReduceResolution

Die Gewichte der Pixel, die bei der reduceResolution()-Aggregation verwendet werden, basieren auf der Überlappung zwischen den kleineren Pixeln, die aggregiert werden, und den größeren Pixeln, die durch die Ausgabeprojektion angegeben werden. Das ist in Abbildung 4 dargestellt.

Eingabe- und Ausgabepixel

Abbildung 4: Eingabepixel (schwarz) und Ausgabepixel (blau) für reduceResolution().

Standardmäßig werden die Gewichte der Eingabepixel als Bruchteil der vom Eingabepixel bedeckten Ausgabepixelfläche berechnet. Im Diagramm hat das Ausgabepixel die Fläche a. Das Gewicht des Eingabepixels mit dem Schnittpunktbereich b wird als b/a berechnet und das Gewicht des Eingabepixels mit dem Schnittpunktbereich c wird als c/a berechnet. Wenn Sie einen anderen Mittelwert-Reduktionsfaktor verwenden, kann dies zu unerwarteten Ergebnissen führen. Wenn Sie beispielsweise die bewaldete Fläche pro Pixel berechnen möchten, verwenden Sie den Mittelwert-Reduktionsfaktor, um den bedeckten Anteil eines Pixels zu berechnen, und multiplizieren Sie ihn dann mit der Fläche. Anstatt die Flächen in den kleineren Pixeln zu berechnen und sie dann mit dem Summen-Reduktionsfaktor zusammenzuzählen:

Code-Editor (JavaScript)

// Compute forest area per MODIS pixel.
var forestArea = forest.gt(0)
    // Force the next reprojection to aggregate instead of resampling.
    .reduceResolution({
      reducer: ee.Reducer.mean(),
      maxPixels: 1024
    })
    // The reduce resolution returns the fraction of the MODIS pixel
    // that's covered by 30 meter forest pixels.  Convert to area
    // after the reduceResolution() call.
    .multiply(ee.Image.pixelArea())
    // Request the data at the scale and projection of the MODIS image.
    .reproject({
      crs: modisProjection
    });
Map.addLayer(forestArea, {max: 500 * 500}, 'forested area at MODIS scale');

Python einrichten

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

import ee
import geemap.core as geemap

Colab (Python)

# Compute forest area per MODIS pixel.
forest_area = (
    forest.gt(0)
    # Force the next reprojection to aggregate instead of resampling.
    .reduceResolution(reducer=ee.Reducer.mean(), maxPixels=1024)
    # The reduce resolution returns the fraction of the MODIS pixel
    # that's covered by 30 meter forest pixels.  Convert to area
    # after the reduceResolution() call.
    .multiply(ee.Image.pixelArea())
    # Request the data at the scale and projection of the MODIS image.
    .reproject(crs=modis_projection)
)
m.add_layer(forest_area, {'max': 500 * 500}, 'forested area at MODIS scale')
m