Reamostragem e redução da resolução

Conforme observado no documento Projeções, o Earth Engine realiza a reamostragem do vizinho mais próximo por padrão durante a reprojeção. É possível mudar esse comportamento com os métodos resample() ou reduceResolution(). Especificamente, quando um desses métodos é aplicado a uma imagem de entrada, qualquer reprojeção necessária da entrada é feita usando o método de agregação ou reamostragem indicado.

Reamostragem

resample() faz com que o método de reamostragem indicado ('bilinear' ou 'bicubic') seja usado na próxima reprojeção. Como as entradas são solicitadas na projeção de saída, uma reprojeção implícita pode acontecer antes de qualquer outra operação na entrada. Por isso, chame resample() diretamente na imagem de entrada. Considere este exemplo simples:

Editor de código (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');

Configuração do Python

Consulte a página Ambiente Python para informações sobre a API Python e o uso de geemap para desenvolvimento interativo.

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

A reamostragem 'bicubic' resulta em pixels de saída suaves em relação à imagem original (Figura 1).

vizinho mais próximo
Figura 1a. Imagem do Landsat reamosada com o vizinho mais próximo.
bicúbico
Figura 1b. Imagem do Landsat reamosada com reamosagem bicúbica.

A ordem das operações para este exemplo de código está mostrada no diagrama da Figura 2. Especificamente, a reprojeção implícita para a projeção maps mercator ocorre com o método de reamostragem especificado na imagem de entrada.

Fluxograma das operações

Figura 2. Fluxograma de operações quando resample() é chamado na imagem de entrada antes da exibição no editor de código. As linhas curvas indicam o fluxo de informações para a reprojeção: especificamente, a projeção de saída, a escala e o método de reamostragem a serem usados.

Reduzir a resolução

Suponha que, em vez de reamosar durante a reprojeção, seu objetivo seja agregar pixels a pixels maiores em uma projeção diferente. Isso é útil ao comparar conjuntos de dados de imagens em diferentes escalas, por exemplo, pixels de 30 metros de um produto baseado em Landsat com pixels grosseiros (escala maior) de um produto baseado em MODIS. É possível controlar esse processo de agregação com o método reduceResolution(). Assim como em resample(), chame reduceResolution() na entrada para afetar a próxima projeção da imagem. O exemplo a seguir usa reduceResolution() para comparar dados de cobertura florestal com resolução de 30 metros a um índice de vegetação com resolução de 500 metros:

Editor de código (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');

Configuração do Python

Consulte a página Ambiente Python para informações sobre a API Python e o uso de geemap para desenvolvimento interativo.

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

Neste exemplo, a projeção de saída é definida explicitamente com reproject(). Durante a reprojeção para a projeção sinusoidal do MODIS, em vez de reamostragem, os pixels menores são agregados com o redutor especificado (ee.Reducer.mean() no exemplo). Essa sequência de operações é ilustrada na Figura 3. Embora este exemplo use reproject() para ajudar a visualizar o efeito de reduceResolution(), a maioria dos scripts não precisa ser reprojetada explicitamente. Confira o aviso aqui.

Fluxograma das operações

Figura 3. Fluxograma das operações quando reduceResolution() é chamado em uma imagem de entrada antes de reproject(). As linhas curvas indicam o fluxo de informações para a reprojeção: especificamente, a projeção de saída, a escala e o método de agregação de pixels a serem usados.

Pesos de pixel para ReduceResolution

Os pesos dos pixels usados durante o processo de agregação reduceResolution() são baseados na sobreposição entre os pixels menores que estão sendo agregados e os pixels maiores especificados pela projeção de saída. Isso é ilustrado na Figura 4.

Pixels de entrada e saída

Figura 4. Pixels de entrada (preto) e pixel de saída (azul) para reduceResolution().

O comportamento padrão é que os pesos de pixel de entrada são calculados como a fração da área de pixel de saída coberta pelo pixel de entrada. No diagrama, o pixel de saída tem a área a, o peso do pixel de entrada com área de interseção b é calculado como b/a e o peso do pixel de entrada com área de interseção c é calculado como c/a. Esse comportamento pode resultar em resultados inesperados ao usar um redutor diferente do redutor médio. Por exemplo, para calcular a área de floresta por pixel, use o redutor médio para calcular a fração de um pixel coberto e, em seguida, multiplique pela área (em vez de calcular áreas nos pixels menores e depois somá-las com o redutor de soma):

Editor de código (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');

Configuração do Python

Consulte a página Ambiente Python para informações sobre a API Python e o uso de geemap para desenvolvimento interativo.

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