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 operatorach i wyraż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()
i 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')));
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.');
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']});
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.
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 |