Przepróbkowanie i zmniejszenie rozdzielczości

Jak wspomniano w artykule Projekcje, podczas ponownego rzutowania Earth Engine domyślnie stosuje interpolację sąsiednich pikseli. Możesz zmienić to zachowanie za pomocą metod resample() lub reduceResolution(). Gdy jedna z tych metod zostanie zastosowana do obrazu wejściowego, wszelkie wymagane projekcje wejścia zostaną wykonane za pomocą wskazanej metody próbkowania lub agregacji.

Odświeżanie

resample() powoduje, że podczas następnej projekcji zostanie użyta wskazana metoda próbkowania ('bilinear' lub 'bicubic'). Dane wejściowe są wymagane w projekcji wyjściowej, dlatego przed każdą inną operacją na danych wejściowych może nastąpić ich domyślna ponowna projekcja. Z tego powodu wywołaj funkcję resample() bezpośrednio na obrazie wejściowym. Rozważ ten prosty przykład:

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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')

Pamiętaj, że próbkowanie 'bicubic' powoduje, że piksele wyjściowe są gładsze niż w początkowym obrazie (rysunek 1).

najbliższy sąsiad
Rysunek 1a. Zdjęcia Landsat z próbkowaniem zbliżonym do najbliższych sąsiadów.
bicubic
Rysunek 1b. Zdjęcia satelitarne Landsat z resamplingiem dwukwadratowym.

Kolejność operacji w tym przykładzie kodu pokazano na rysunku 2. W szczególności, domyślna projekcja wsteczna do projekcji Mercator odbywa się za pomocą metody próbkowania określonej w przypadku obrazu wejściowego.

Schemat blokowy operacji

Rysunek 2. Schemat blokowy operacji, gdy funkcja resample() jest wywoływana na obrazie wejściowym przed wyświetleniem w Edytorze kodu. Krzywe linie wskazują przepływ informacji do ponownego wyznaczenia: w szczególności projekcji wyjściowej, skali i metody próbkowania.

Zmniejsz rozdzielczość

Załóżmy, że zamiast próbkowania podczas ponownego rzutowania chcesz scalić piksele w większe piksele w innej projekcji. Jest to przydatne podczas porównywania zbiorów danych obrazów w różnych skalach, np. pikseli 30-metrowych z usługi opartej na danych Landsat z grubszymi pikselami (większa skala) z usługi opartej na danych MODIS. Możesz kontrolować ten proces agregacji za pomocą metody reduceResolution(). Podobnie jak w przypadku funkcji resample(), wywołaj funkcję reduceResolution() na wejściu, aby wpłynąć na następne przeprojektowanie obrazu. W tym przykładzie dane dotyczące pokrycia lasami o rozdzielczości 30 m są porównywane z danymi dotyczącymi indeksu wegetacji o rozdzielczości 500 m:reduceResolution()

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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')

W tym przykładzie rzutowanie danych wyjściowych jest ustawiane za pomocą parametru reproject(). Podczas przeprojektowania na projekcję sinusoidalną MODIS zamiast próbkowania mniejsze piksele są agregowane za pomocą określonego reduktora (w tym przykładzie ee.Reducer.mean()). Ta sekwencja operacji jest pokazana na rysunku 3. W tym przykładzie używamy reproject(), aby zilustrować działanie funkcji reduceResolution(), ale w przypadku większości skryptów nie trzeba wyraźnie ponownie tworzyć projektu. Zapoznaj się z ostrzeżeniem tutaj.

Schemat blokowy operacji

Rysunek 3. Schemat blokowy operacji, gdy funkcja reduceResolution() jest wywoływana na obrazie wejściowym przed funkcją reproject(). Krzywe linie wskazują przepływ informacji do ponownego przeprojektowania: w szczególności wskazują, jakiej projekcji wyjściowej, skali i metody agregacji pikseli użyć.

Wagi pikseli w przypadku ReduceResolution

Wagi pikseli używane podczas procesu agregacji reduceResolution() są określane na podstawie nakładania się mniejszych pikseli, które są agregowane, na większe piksele określone przez projekcję wyjściową. Widać to na rysunku 4.

Wejściowe i wyjściowe piksele

Rysunek 4. Piksel wejściowy (czarny) i piksel wyjściowy (niebieski) w przypadku reduceResolution().

Domyślnie wagi pikseli wejściowych są obliczane jako ułamek pola wyjściowego piksela pokrytego przez piksel wejściowy. Na diagramie piksel wyjściowy ma obszar a, a waga piksela wejściowego o powierzchni przecięcia b jest obliczana jako b/a, a waga piksela wejściowego o powierzchni przecięcia c jest obliczana jako c/a. Takie zachowanie może spowodować nieoczekiwane wyniki, jeśli użyjesz innego niż średnia reduktor. Aby na przykład obliczyć obszar lasu na piksel, użyj funkcji meanReducer do obliczenia pokrycia piksela, a następnie pomnóż wynik przez powierzchnię (zamiast obliczania powierzchni mniejszych pikseli i sumowania ich za pomocą funkcji sumReducer):

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

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