Lấy mẫu lại và giảm độ phân giải

Như đã lưu ý trong tài liệu về Thực thể chiếu, theo mặc định, Earth Engine sẽ lấy mẫu lại các đối tượng lân cận gần nhất trong quá trình chiếu lại. Bạn có thể thay đổi hành vi này bằng các phương thức resample() hoặc reduceResolution(). Cụ thể, khi một trong các phương thức này được áp dụng cho hình ảnh đầu vào, mọi phép chiếu lại bắt buộc của đầu vào sẽ được thực hiện bằng phương thức lấy mẫu lại hoặc tổng hợp được chỉ định.

Lấy mẫu lại

resample() khiến phương thức lấy mẫu lại được chỉ định ('bilinear' hoặc 'bicubic') được sử dụng trong lần chiếu lại tiếp theo. Vì dữ liệu đầu vào được yêu cầu trong phép chiếu đầu ra, nên việc chiếu lại ngầm ẩn có thể xảy ra trước khi có bất kỳ thao tác nào khác trên dữ liệu đầu vào. Vì lý do này, hãy gọi trực tiếp resample() trên hình ảnh đầu vào. Hãy xem ví dụ đơn giản sau:

Trình soạn thảo mã (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');

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

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

Lưu ý rằng việc lấy mẫu lại 'bicubic' sẽ khiến các điểm ảnh đầu ra trông mượt mà so với hình ảnh gốc (Hình 1).

thuật toán kề gần nhất
Hình 1a. Hình ảnh Landsat được lấy mẫu lại bằng phương pháp lấy mẫu kề cận.
bicubic
Hình 1b. Hình ảnh Landsat được lấy mẫu lại bằng phương pháp lấy mẫu bicubic.

Thứ tự các thao tác cho mã mẫu này được trình bày trong sơ đồ Hình 2. Cụ thể, quá trình chiếu lại ngầm ẩn cho phép chiếu bản đồ Mercator diễn ra bằng phương thức lấy mẫu lại được chỉ định trên hình ảnh đầu vào.

Sơ đồ quy trình hoạt động

Hình 2. Biểu đồ quy trình của các thao tác khi resample() được gọi trên hình ảnh đầu vào trước khi hiển thị trong Trình soạn thảo mã. Các đường cong cho biết luồng thông tin đến phép chiếu lại: cụ thể là phương thức chiếu đầu ra, tỷ lệ và phương thức lấy mẫu lại cần sử dụng.

Giảm độ phân giải

Giả sử thay vì lấy mẫu lại trong quá trình chiếu lại, mục tiêu của bạn là tổng hợp các pixel thành các pixel lớn hơn trong một phép chiếu khác. Điều này hữu ích khi so sánh các tập dữ liệu hình ảnh ở các tỷ lệ khác nhau, ví dụ: pixel 30 mét từ sản phẩm dựa trên Landsat với pixel thô (tỷ lệ cao hơn) từ sản phẩm dựa trên MODIS. Bạn có thể kiểm soát quá trình tổng hợp này bằng phương thức reduceResolution(). Cũng như resample(), hãy gọi reduceResolution() trên dữ liệu đầu vào để ảnh hưởng đến lần chiếu lại tiếp theo của hình ảnh. Ví dụ sau đây sử dụng reduceResolution() để so sánh dữ liệu về độ che phủ rừng ở độ phân giải 30 mét với chỉ số thảm thực vật ở độ phân giải 500 mét:

Trình soạn thảo mã (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');

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

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

Trong ví dụ này, hãy lưu ý rằng phép chiếu đầu ra được đặt rõ ràng bằng reproject(). Trong quá trình chiếu lại theo phép chiếu sin MODIS, thay vì lấy mẫu lại, các pixel nhỏ hơn được tổng hợp với bộ giảm được chỉ định (ee.Reducer.mean() trong ví dụ). Trình tự thao tác này được minh hoạ trong Hình 3. Mặc dù ví dụ này sử dụng reproject() để giúp hình dung hiệu ứng của reduceResolution(), nhưng hầu hết các tập lệnh không cần phải chiếu lại một cách rõ ràng; hãy xem cảnh báo tại đây.

Sơ đồ quy trình hoạt động

Hình 3. Biểu đồ quy trình của các thao tác khi reduceResolution() được gọi trên hình ảnh đầu vào trước reproject(). Các đường cong cho biết luồng thông tin đến phép chiếu lại: cụ thể là phương thức chiếu đầu ra, tỷ lệ và tổng hợp pixel cần sử dụng.

Độ đậm pixel cho ReduceResolution

Trọng số của các pixel được sử dụng trong quá trình tổng hợp reduceResolution() dựa trên mức độ trùng lặp giữa các pixel nhỏ hơn đang được tổng hợp và các pixel lớn hơn do phép chiếu đầu ra chỉ định. Điều này được minh hoạ trong Hình 4.

Pixel đầu vào và đầu ra

Hình 4. Pixel đầu vào (đen) và pixel đầu ra (xanh dương) cho reduceResolution().

Hành vi mặc định là trọng số pixel đầu vào được tính là phân số của vùng pixel đầu ra được pixel đầu vào bao phủ. Trong sơ đồ, điểm ảnh đầu ra có diện tích a, trọng số của điểm ảnh đầu vào có diện tích giao điểm b được tính là b/a và trọng số của điểm ảnh đầu vào có diện tích giao điểm c được tính là c/a. Hành vi này có thể dẫn đến kết quả không mong muốn khi sử dụng một trình giảm khác với trình giảm trung bình. Ví dụ: để tính toán diện tích rừng trên mỗi pixel, hãy sử dụng hàm rút gọn trung bình để tính toán tỷ lệ phần trăm pixel được bao phủ, sau đó nhân với diện tích (thay vì tính toán diện tích trong các pixel nhỏ hơn rồi cộng các diện tích đó với hàm rút gọn tổng):

Trình soạn thảo mã (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');

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

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