Yeniden örnekleme ve çözünürlüğü azaltma

Projeksiyonlar dokümanında belirtildiği gibi, Earth Engine yeniden projeksiyon sırasında varsayılan olarak en yakın komşu yeniden örnekleme işlemi gerçekleştirir. Bu davranışı resample() veya reduceResolution() yöntemleriyle değiştirebilirsiniz. Özellikle, bu yöntemlerden biri bir giriş görüntüsüne uygulandığında, girişin gerekli tüm yeniden projeksiyonu, belirtilen yeniden örnekleme veya toplama yöntemi kullanılarak yapılır.

Yeniden örnekleme

resample(), belirtilen yeniden örnekleme yönteminin ('bilinear' veya 'bicubic') bir sonraki yeniden projeksiyonda kullanılmasına neden olur. Girişler çıkış projeksiyonunda istendiğinden, girişte başka bir işlem yapılmadan önce gizli bir yeniden projeksiyon gerçekleşebilir. Bu nedenle, doğrudan giriş resminde resample() işlevini çağırın. Aşağıdaki basit örneği inceleyin:

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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

'bicubic' yeniden örneklemenin, çıkış piksellerinin orijinal resme kıyasla düzgün görünmesine neden olduğunu unutmayın (Şekil 1).

en yakın komşu
Şekil 1a. En yakın komşu yöntemiyle yeniden örneklenmiş Landsat görüntüleri.
iki boyutlu
Şekil 1b. İki boyutlu yeniden örnekleme ile yeniden örneklenmiş Landsat görüntüleri.

Bu kod örneğindeki işlemlerin sırası Şekil 2'de şematik olarak gösterilmiştir. Daha açık belirtmek gerekirse, haritalarda Mercator projeksiyonuna yapılan örtük yeniden projeksiyon, giriş resminde belirtilen yeniden örnekleme yöntemiyle gerçekleşir.

İşlemlerin akış şeması

Şekil 2. Giriş resminde resample() çağrıldığında Kod Düzenleyici'de görüntülenmeden önce yapılan işlemlerin akış şeması. Eğri çizgiler, yeniden projeksiyona aktarılan bilgi akışını gösterir: Özellikle, kullanılacak çıkış projeksiyonu, ölçek ve yeniden örnekleme yöntemini belirtir.

Çözünürlüğü azaltma

Yeniden projeksiyon sırasında yeniden örnekleme yapmak yerine, farklı bir projeksiyonda pikselleri daha büyük pikseller halinde toplama hedefiniz olduğunu varsayalım. Bu özellik, farklı ölçeklerdeki görüntü veri kümelerini (ör. Landsat tabanlı bir üründeki 30 metrelik pikseller ile MODIS tabanlı bir üründeki kaba pikseller (daha yüksek ölçek)) karşılaştırırken faydalıdır. Bu toplama sürecini reduceResolution() yöntemiyle kontrol edebilirsiniz. resample() ile olduğu gibi, görüntünün sonraki yeniden projeksiyonunu etkilemek için girişte reduceResolution() işlevini çağırın. Aşağıdaki örnekte, 30 metre çözünürlükteki orman örtüsü verilerini 500 metre çözünürlükteki bir bitki örtüsü indeksiyle karşılaştırmak için reduceResolution() kullanılır:

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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

Bu örnekte, çıkış projeksiyonunun reproject() ile açıkça ayarlandığını unutmayın. MODIS sinüzoidal projeksiyonuna yeniden projeksiyon sırasında, yeniden örnekleme yerine daha küçük pikseller belirtilen azaltıcıyla (örnekte ee.Reducer.mean()) toplanır. Bu işlem dizisi Şekil 3'te gösterilmektedir. Bu örnekte, reduceResolution() etkisini görselleştirmeye yardımcı olmak için reproject() kullanılsa da çoğu komut dosyasının açıkça yeniden projelendirilmesi gerekmez. Buradaki uyarıya bakın.

İşlemlerin akış şeması

Şekil 3. Giriş resminde reduceResolution(), reproject()'ten önce çağrıldığında yapılan işlemlerin akış şeması. Eğri çizgiler, yeniden projeksiyona aktarılan bilgi akışını gösterir: Özellikle, kullanılacak çıkış projeksiyonu, ölçek ve piksel toplama yöntemini gösterir.

ReduceResolution için piksel ağırlıkları

reduceResolution() toplama işlemi sırasında kullanılan piksellerin ağırlıkları, toplanan daha küçük pikseller ile çıkış projeksiyonu tarafından belirtilen daha büyük pikseller arasındaki çakışmalara dayanır. Bu durum Şekil 4'te gösterilmektedir.

Giriş ve çıkış pikselleri

Şekil 4. reduceResolution() için giriş pikselleri (siyah) ve çıkış pikseli (mavi).

Varsayılan davranış, giriş pikseli ağırlıklarının giriş pikseli tarafından kaplanan çıkış piksel alanının kesri olarak hesaplanmasıdır. Diyagramda çıkış pikseli a alanına sahiptir, kesişim alanı b olan giriş pikseli ağırlığı b/a olarak hesaplanır ve kesişim alanı c olan giriş pikseli ağırlığı c/a olarak hesaplanır. Bu davranış, ortalama azaltıcı dışında bir azaltıcı kullanıldığında beklenmedik sonuçlara yol açabilir. Örneğin, piksel başına ormanlık alan hesaplamak için ortalama azaltıcıyı kullanarak bir pikselin kapladığı kısmın kesrini hesaplayın, ardından alanı çarpın (küçük piksellerdeki alanları hesaplayıp bunları toplama azaltıcıyla toplama yerine):

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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