Operacje matematyczne

Obliczenia obrazowe można wykonywać za pomocą operatorów takich jak add() i subtract(), ale w przypadku złożonych obliczeń z większą liczbą składników dobrą alternatywą jest funkcja expression(). Więcej informacji o operatorachwyrażeniach znajdziesz w następnych sekcjach.

Operatory

Operatory matematyczne wykonują podstawowe operacje arytmetyczne na pasmach obrazu. Do ich działania potrzebne są 2 parametry: dwa obrazy lub jeden obraz i wyrażenie stałe, które jest interpretowane jako obraz jednopasmowy bez zamaskowanych pikseli. Operacje są wykonywane dla każdego piksela w ramach każdego pasma.

W podstawowym przykładzie rozpatrzmy obliczenie znormalizowanego różnicowego wskaźnika wegetacji (NDVI) na podstawie obrazu z VIIRS, gdzie operatorzy add(), subtract()divide() są używane w ten sposób:

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

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

Tylko przecięcie niezamaskowanych pikseli między 2 wejściami jest brane pod uwagę i zwracane jako niezamaskowane, a wszystko inne jest zamaskowane. Ogólnie, jeśli jeden z wejść ma tylko jeden zakres, jest on używany w przypadku wszystkich zakresów drugiego wejścia. Jeśli wejścia mają taką samą liczbę pasm, ale nie mają tych samych nazw, są używane parami w kolejności naturalnej. Pasma wyjściowe są nazywane według dłuższego z 2 argumentów lub (jeśli mają taką samą długość) według kolejności pierwszego argumentu. Typ pikseli wyjściowych jest zbiorem typów danych wejściowych.

Ten przykład odejmowania obrazów w wielu pasmach pokazuje, jak pasma są dopasowywane automatycznie, co powoduje powstanie „wektora zmian” dla każdego piksela w przypadku każdego współwystępującego pasma.

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

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

W drugiej części tego przykładu kwadrat różnicy jest obliczany za pomocą funkcji image.pow(2). Pełną listę operatorów matematycznych obsługujących podstawowe działania arytmetyczne, trygonometrię, wykładnik, zaokrąglanie, konwersję, operacje bitowe i inne znajdziesz w dokumentacji interfejsu API.

Wyrażenia

Aby zaimplementować bardziej złożone wyrażenia matematyczne, rozważ użycie funkcji image.expression(), która analizuje tekstową reprezentację operacji matematycznej. W tym przykładzie do obliczenia wskaźnika EVI (Enhanced Vegetation Index) użyto funkcji expression():

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

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

Zwróć uwagę, że pierwszy argument funkcji expression() to reprezentacja tekstowa operacji matematycznej, drugi argument to słownik, w którym kluczami są nazwy zmiennych użytych w wyrażeniu, a wartościami pasma obrazu, do których należy zmapować zmienne. Pasma na obrazie mogą być określane jako b("band name") lub b(index), na przykład b(0), zamiast podawania słownika. Pasma można definiować na podstawie obrazów innych niż dane wejściowe, jeśli używasz słownika mapy pasm. Pamiętaj, że expression() używa „podziel przez z zaokrągleniem w dół”, która odrzuca resztę i zwraca liczbę całkowitą po podzieleniu 2 liczb całkowitych. Na przykład:10 / 20 = 0. Aby zmienić to zachowanie, pomnóż jeden z operandów przez:1.0: 10 * 1.0 / 20 = 0.5. Tylko przecięcie niezamaskowanych pikseli jest brane pod uwagę i zwracane jako niezamaskowane, gdy oceniane są pasma z więcej niż jednego obrazu źródłowego. Obsługiwane operatory wyrażeń są wymienione w tabeli poniżej.

Operatory dla expression()
Typ Symbol Nazwa
Arytmetyka + - * / % ** Dodawanie, odejmowanie, mnożenie, dzielenie, modulo, wykładnik
Relacyjne == != < > <= >= Równe, Inne niż, Mniejsze niż, Większe niż itp.
Logiczny && || ! ^ And, Or, Not, Xor
Ternarialna ? : Jeśli, to inaczej