Opérations mathématiques

Les calculs d'image peuvent être effectués à l'aide d'opérateurs tels que add() et subtract(), mais pour les calculs complexes comportant plusieurs termes, la fonction expression() constitue une bonne alternative. Pour en savoir plus sur les opérateurs et les expressions, consultez les sections suivantes.

Opérateurs

Les opérateurs mathématiques effectuent des opérations arithmétiques de base sur les bandes d'image. Ils prennent deux entrées : deux images ou une image et un terme constant, qui est interprété comme une image constante à bande unique sans pixels masqués. Les opérations sont effectuées par pixel pour chaque bande.

Prenons un exemple de base : calculer l'indice de végétation par différence normalisée (NDVI) à l'aide d'images VIIRS, où les opérateurs add(), subtract() et divide() sont utilisés :

Éditeur de code (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')));

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et l'utilisation de geemap pour le développement interactif.

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

Seule l'intersection des pixels non masqués entre les deux entrées est prise en compte et renvoyée comme non masquée. Tout le reste est masqué. En général, si l'une des entrées ne comporte qu'une seule bande, elle est utilisée pour toutes les bandes de l'autre entrée. Si les entrées ont le même nombre de bandes, mais pas les mêmes noms, elles sont utilisées par paire dans l'ordre naturel. Les bandes de sortie sont nommées d'après la plus longue des deux entrées, ou dans l'ordre de la première entrée si elles sont de la même longueur. Le type des pixels de sortie est l'union des types d'entrée.

L'exemple de soustraction d'images multibandes suivant montre comment les bandes sont mises en correspondance automatiquement, ce qui génère un "vecteur de changement" pour chaque pixel pour chaque bande co-occurrente.

Éditeur de code (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.');

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et l'utilisation de geemap pour le développement interactif.

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)

Dans la deuxième partie de cet exemple, la différence au carré est calculée à l'aide de image.pow(2). Pour obtenir la liste complète des opérateurs mathématiques traitant de l'arithmétique de base, de la trigonométrie, de l'exponentiation, de l'arrondi, du casting, des opérations au niveau du bit, etc., consultez la documentation de l'API.

Expressions

Pour implémenter des expressions mathématiques plus complexes, envisagez d'utiliser image.expression(), qui analyse une représentation textuelle d'une opération mathématique. L'exemple suivant utilise expression() pour calculer l'indice de végétation amélioré (EVI):

Éditeur de code (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']});

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et l'utilisation de geemap pour le développement interactif.

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)

Notez que le premier argument de expression() est la représentation textuelle de l'opération mathématique, le deuxième argument est un dictionnaire dont les clés sont les noms de variables utilisés dans l'expression et les valeurs sont les bandes d'image auxquelles les variables doivent être mappées. Les bandes de l'image peuvent être appelées b("band name") ou b(index), par exemple b(0), au lieu de fournir le dictionnaire. Vous pouvez définir des bandes à partir d'images autres que l'entrée lorsque vous utilisez le dictionnaire de mappage des bandes. Notez que expression() utilise la "division au plus proche", qui élimine le reste et renvoie un entier lorsque deux entiers sont divisés. Par exemple, 10 / 20 = 0. Pour modifier ce comportement, multipliez l'un des opérandes par 1.0: 10 * 1.0 / 20 = 0.5. Seule l'intersection des pixels non masqués est prise en compte et renvoyée comme non masquée lorsque les bandes de plusieurs images sources sont évaluées. Les opérateurs d'expression acceptés sont listés dans le tableau suivant.

Opérateurs pour expression()
Type Symbole Nom
Arithmétique + - * / % ** Addition, soustraction, multiplication, division, modulo, exposant
Relationnel == != < > <= >= Égal, Non égal, Inférieur, Supérieur, etc.
Logique && || ! ^ And, Or, Not, Xor
Ternaire ? : Si, alors, sinon