Las operaciones matemáticas de imágenes se pueden realizar con operadores como add()
y subtract()
, pero para cálculos complejos con más de un par de términos, la función expression()
proporciona una buena alternativa. Consulta las siguientes secciones para obtener más información sobre los operadores y las expresiones.
Operadores
Los operadores matemáticos realizan operaciones aritméticas básicas en las bandas de imágenes. Toman dos entradas: dos imágenes o una imagen y un término constante, que se interpreta como una imagen constante de una sola banda sin píxeles enmascarados. Las operaciones se realizan por píxel para cada banda.
Como ejemplo básico, considera la tarea de calcular el índice de vegetación con diferencia normalizada (NDVI) con imágenes de VIIRS, en las que se usan los operadores add()
, subtract()
y divide()
:
// 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
# 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') ) ) )
Solo se considera la intersección de píxeles sin enmascarar entre las dos entradas y se muestra como sin enmascarar, todo lo demás se enmascara. En general, si cualquiera de las entradas solo tiene una banda, se usa en todas las bandas de la otra entrada. Si las entradas tienen la misma cantidad de bandas, pero no los mismos nombres, se usan de a pares en el orden natural. Las bandas de salida se nombran según la más larga de las dos entradas o, si tienen la misma longitud, en el orden de la primera entrada. El tipo de los píxeles de salida es la unión de los tipos de entrada.
En el siguiente ejemplo de resta de imágenes multibanda, se muestra cómo se combinan las bandas automáticamente, lo que genera un "vector de cambio" para cada píxel de cada banda que se produce simultáneamente.
// 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
# 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)
En la segunda parte de este ejemplo, la diferencia al cuadrado se calcula con image.pow(2)
. Para obtener la lista completa de operadores matemáticos que controlan la aritmética básica, la trigonometría, la exponenciación, el redondeo, el casting, las operaciones por bits y mucho más, consulta la documentación de la API.
Expresiones
Para implementar expresiones matemáticas más complejas, considera usar
image.expression()
, que analiza una representación de texto de una operación matemática.
En el siguiente ejemplo, se usa expression()
para calcular el índice de vegetación mejorado (EVI):
// 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
# 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)
Observa que el primer argumento de expression()
es la representación textual de la operación matemática, el segundo argumento es un diccionario en el que las claves son nombres de variables que se usan en la expresión y los valores son las bandas de imagen a las que se deben asignar las variables. Las bandas de la imagen pueden denominarse b("band name")
o b(index)
, por ejemplo, b(0)
, en lugar de proporcionar el diccionario. Las bandas se pueden definir a partir de imágenes que no sean la entrada cuando se usa el diccionario del mapa de bandas. Ten en cuenta que expression()
usa la "división entera", que descarta el resto y muestra un número entero cuando se dividen dos números enteros. Por ejemplo, 10 / 20 = 0
. Para cambiar este comportamiento, multiplica uno de los operandos por 1.0
: 10 * 1.0 / 20 = 0.5
. Solo se considera la intersección de los píxeles sin enmascarar y se muestra como sin enmascarar cuando se evalúan bandas de más de una imagen de origen. En la siguiente tabla, se indican los operadores de expresión admitidos.
Tipo | Símbolo | Nombre |
---|---|---|
Aritmética | + - * / % ** | Suma, resta, multiplicación, división, módulo, exponente |
Relacional | == != < > <= >= | Igual, no igual, menor que, mayor que, etcétera. |
Lógicos | && || ! ^ | Y, O, No, Xor |
Ternaria | ? : | Si, entonces, de lo contrario |