Bildberechnungen können mit Operatoren wie add()
und subtract()
ausgeführt werden. Für komplexe Berechnungen mit mehr als ein paar Termen ist die Funktion expression()
jedoch eine gute Alternative. Weitere Informationen zu Operatoren und Ausdrücken finden Sie in den folgenden Abschnitten.
Operatoren
Mit mathematischen Operatoren werden einfache arithmetische Operationen auf Bildbänder angewendet. Sie nehmen zwei Eingaben an: entweder zwei Bilder oder ein Bild und einen konstanten Term, der als einfarbiges konstantes Bild ohne maskierte Pixel interpretiert wird. Die Vorgänge werden pro Pixel und Band ausgeführt.
Als einfaches Beispiel betrachten wir die Berechnung des normalisierten Differenz-Vegetationsindexes (NDVI) anhand von VIIRS-Bildern, wobei die Operatoren add()
, subtract()
und divide()
verwendet werden:
Code-Editor (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') ) ) )
Es wird nur die Überschneidung der nicht maskierten Pixel zwischen den beiden Eingaben berücksichtigt und als nicht maskiert zurückgegeben. Alles andere wird maskiert. Wenn eine der Eingaben nur ein Band hat, wird es im Allgemeinen auf alle Bänder in der anderen Eingabe angewendet. Wenn die Eingaben dieselbe Anzahl von Bändern, aber nicht dieselben Namen haben, werden sie paarweise in der natürlichen Reihenfolge verwendet. Die Ausgabebänder werden nach der längeren der beiden Eingaben benannt. Sind sie gleich lang, werden sie in der Reihenfolge der ersten Eingabe benannt. Der Typ der Ausgabepixel ist die Vereinigung der Eingabetypen.
Das folgende Beispiel für die Mehrbandbildableitung zeigt, wie Bänder automatisch abgeglichen werden, was zu einem „Änderungsvektor“ für jedes Pixel für jeden gleichzeitig vorhandenen Band führt.
Code-Editor (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)
Im zweiten Teil dieses Beispiels wird die quadratische Differenz mit image.pow(2)
berechnet. Eine vollständige Liste der mathematischen Operatoren für grundlegende Arithmetik, Trigonometrie, Exponentiation, Rundung, Casting und Bitweise Operationen finden Sie in der API-Dokumentation.
Ausdrücke
Wenn Sie komplexere mathematische Ausdrücke implementieren möchten, können Sie image.expression()
verwenden, um eine Textdarstellung einer mathematischen Operation zu analysieren.
Im folgenden Beispiel wird expression()
verwendet, um den Erweiterten Vegetationsindex (Enhanced Vegetation Index, EVI) zu berechnen:
Code-Editor (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)
Das erste Argument für expression()
ist die Textdarstellung der mathematischen Operation. Das zweite Argument ist ein Wörterbuch, dessen Schlüssel die im Ausdruck verwendeten Variablennamen und die Werte die Bildbänder sind, denen die Variablen zugeordnet werden sollen. Bänder im Bild können als b("band name")
oder b(index)
bezeichnet werden, z. B. b(0)
, anstatt das Wörterbuch anzugeben. Wenn Sie das Bandkartenwörterbuch verwenden, können die Bänder auch aus anderen Bildern als dem Eingabebild definiert werden. Bei expression()
wird die „Abrundende Division“ verwendet, bei der der Rest verworfen und eine Ganzzahl zurückgegeben wird, wenn zwei Ganzzahlen geteilt werden. Beispiel: 10 / 20 = 0
. Wenn Sie dieses Verhalten ändern möchten, multiplizieren Sie einen der Operanden mit 1.0
: 10 * 1.0 / 20 = 0.5
. Wenn Bänder aus mehreren Quellbildern ausgewertet werden, wird nur die Schnittmenge der nicht maskierten Pixel berücksichtigt und als nicht maskiert zurückgegeben. Die unterstützten Ausdrucksoperatoren sind in der folgenden Tabelle aufgeführt.
Typ | Symbol | Name |
---|---|---|
Arithmetisch | + - * / % ** | Addieren, Subtrahieren, Multiplizieren, Dividieren, Modulo, Exponent |
Relational | == != < > <= >= | „Gleich“, „Nicht gleich“, „Kleiner als“, „Größer als“ usw. |
Logisch | && || ! ^ | Und, Oder, Nicht, Xor |
Ternär | ? : | Wenn-dann-sonst |