Toán tử

Bạn có thể thực hiện toán học hình ảnh bằng các toán tử như add()subtract(), nhưng đối với các phép tính phức tạp có nhiều hơn một vài thuật ngữ, hàm expression() sẽ là một lựa chọn thay thế phù hợp. Hãy xem các phần sau đây để biết thêm thông tin về toán tửbiểu thức.

Toán tử

Toán tử toán học thực hiện các phép toán số học cơ bản trên các dải hình ảnh. Các hàm này nhận hai đầu vào: hai hình ảnh hoặc một hình ảnh và một hằng số, được diễn giải là một hình ảnh hằng số đơn băng không có pixel bị che. Các phép toán được thực hiện trên mỗi pixel cho mỗi dải tần số.

Ví dụ cơ bản: hãy xem xét nhiệm vụ tính Chỉ số thực vật khác biệt chuẩn hoá (NDVI) bằng hình ảnh VIIRS, trong đó sử dụng các toán tử add(), subtract()divide():

Trình soạn thảo mã (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for May 2024.
var viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-05-01', '2024-05-16')).first();

// Compute NDVI.
var ndvi202405 = viirs202405.select('SurfReflect_I2')
  .subtract(viirs202405.select('SurfReflect_I1'))
  .divide(viirs202405.select('SurfReflect_I2')
    .add(viirs202405.select('SurfReflect_I1')));

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 VIIRS 8-day surface reflectance composite for May 2024.
viirs202405 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-05-01', '2024-05-16'))
    .first()
)

# Compute NDVI.
ndvi202405 = (
    viirs202405.select('SurfReflect_I2')
    .subtract(viirs202405.select('SurfReflect_I1'))
    .divide(
        viirs202405.select('SurfReflect_I2').add(
            viirs202405.select('SurfReflect_I1')
        )
    )
)

Chỉ giao điểm của các pixel chưa bị che giữa hai đầu vào mới được xem xét và trả về dưới dạng chưa bị che, tất cả các pixel khác đều bị che. Nhìn chung, nếu một trong hai đầu vào chỉ có một dải tần, thì dải tần đó sẽ được dùng cho tất cả các dải tần trong đầu vào còn lại. Nếu các đầu vào có cùng số lượng băng tần nhưng không có cùng tên, thì các đầu vào này sẽ được sử dụng theo cặp theo thứ tự tự nhiên. Các dải đầu ra được đặt tên theo dải đầu vào dài hơn trong hai dải đầu vào hoặc nếu hai dải đầu vào có độ dài bằng nhau thì theo thứ tự của dải đầu vào đầu tiên. Loại của các pixel đầu ra là tập hợp hợp nhất của các loại đầu vào.

Ví dụ sau đây về việc trừ hình ảnh nhiều băng tần minh hoạ cách các băng tần được so khớp tự động, dẫn đến một "vectơ thay đổi" cho mỗi pixel cho mỗi băng tần đồng thời xuất hiện.

Trình soạn thảo mã (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for September 2024.
var viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-09-01', '2024-09-16')).first();

// Compute multi-band difference between the September composite and the
// previously loaded May composite.
var diff = viirs202409.subtract(ndvi202405);
Map.addLayer(diff, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: -1,
  max: 1
}, 'difference');

// Compute the squared difference in each band.
var squaredDifference = diff.pow(2);
Map.addLayer(squaredDifference, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: 0,
  max: 0.7
}, 'squared diff.');

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 VIIRS 8-day surface reflectance composite for September 2024.
viirs202409 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-09-01', '2024-09-16'))
    .first()
)

# Compute multi-band difference between the September composite and the
# previously loaded May composite.
diff = viirs202409.subtract(ndvi202405)

m = geemap.Map()
m.add_layer(
    diff,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': -1,
        'max': 1,
    },
    'difference',
)

# Compute the squared difference in each band.
squared_difference = diff.pow(2)

m.add_layer(
    squared_difference,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': 0,
        'max': 0.7,
    },
    'squared diff.',
)
display(m)

Trong phần thứ hai của ví dụ này, chênh lệch bình phương được tính bằng cách sử dụng image.pow(2). Để biết danh sách đầy đủ các toán tử toán học xử lý số học cơ bản, lượng giác, luỹ thừa, làm tròn, truyền dữ liệu, phép toán bit và nhiều toán tử khác, hãy xem tài liệu về API.

Cụm từ

Để triển khai các biểu thức toán học phức tạp hơn, hãy cân nhắc sử dụng image.expression(). Phương thức này phân tích cú pháp một bản trình bày văn bản của một phép toán. Ví dụ sau đây sử dụng expression() để tính Chỉ số thực vật tăng cường (EVI):

Trình soạn thảo mã (JavaScript)

// Load a Landsat 8 image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Compute the EVI using an expression.
var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
      'NIR': image.select('B5'),
      'RED': image.select('B4'),
      'BLUE': image.select('B2')
});

Map.centerObject(image, 9);
Map.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});

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 8 image.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')

# Compute the EVI using an expression.
evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',
    {
        'NIR': image.select('B5'),
        'RED': image.select('B4'),
        'BLUE': image.select('B2'),
    },
)

# Define a map centered on San Francisco Bay.
map_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9)

# Add the image layer to the map and display it.
map_evi.add_layer(
    evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi'
)
display(map_evi)

Hãy quan sát rằng đối số đầu tiên của expression() là bản trình bày bằng văn bản của phép toán, đối số thứ hai là một từ điển trong đó khoá là tên biến được sử dụng trong biểu thức và giá trị là các dải hình ảnh mà các biến sẽ được ánh xạ. Các dải trong hình ảnh có thể được gọi là b("band name") hoặc b(index), ví dụ: b(0), thay vì cung cấp từ điển. Bạn có thể xác định các dải tần từ các hình ảnh khác với hình ảnh đầu vào khi sử dụng từ điển bản đồ dải tần. Xin lưu ý rằng expression() sử dụng "phép chia sàn", bỏ phần dư và trả về một số nguyên khi chia hai số nguyên. Ví dụ: 10 / 20 = 0. Để thay đổi hành vi này, hãy nhân một trong các toán hạng với 1.0: 10 * 1.0 / 20 = 0.5. Chỉ giao điểm của các pixel chưa bị che mới được xem xét và trả về dưới dạng chưa bị che khi các dải từ nhiều hình ảnh nguồn được đánh giá. Các toán tử biểu thức được hỗ trợ được liệt kê trong bảng sau.

Toán tử cho expression()
Loại Biểu tượng Tên
Số học + - * / % ** Cộng, trừ, nhân, chia, mô đun, luỹ thừa
Quan hệ == != < > <= >= Bằng, Không bằng, Nhỏ hơn, Lớn hơn, v.v.
Logic && || ! ^ And, Or, Not, Xor
Ba ngôi ? : If then else