Operazioni matematiche

Le operazioni matematiche sulle immagini possono essere eseguite utilizzando operatori come add() e subtract(), ma per calcoli complessi con più di un paio di termini, la funzione expression() offre una buona alternativa. Per ulteriori informazioni su operatori ed espressioni, consulta le sezioni seguenti.

Operatori

Gli operatori matematici eseguono operazioni aritmetiche di base sulle bande di immagini. Prendono due input: due immagini o un'immagine e un termine costante, che viene interpretato come un'immagine costante a banda singola senza pixel mascherati. Le operazioni vengono eseguite per pixel per ogni banda.

Come esempio di base, prendiamo in considerazione il calcolo dell'indice NDVI (Normalized Difference Vegetation Index) utilizzando le immagini VIIRS, in cui vengono utilizzati gli operatori add(), subtract() e divide():

Editor di codice (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')));

Configurazione di Python

Per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo, consulta la pagina Ambiente Python.

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

Solo l'intersezione dei pixel non mascherati tra i due input viene considerata e restituita come non mascherata, mentre tutti gli altri vengono mascherati. In generale, se uno degli input ha solo una banda, viene utilizzato rispetto a tutte le bande dell'altro input. Se gli input hanno lo stesso numero di bande, ma non gli stessi nomi, vengono utilizzati a coppie nell'ordine naturale. I gruppi di output sono denominati in base al più lungo dei due input o, se sono di lunghezza uguale, nell'ordine del primo input. Il tipo di pixel di output è l'unione dei tipi di input.

Il seguente esempio di sottrazione di immagini multibanda mostra in che modo le bande vengono associate automaticamente, generando un "vettore di variazione" per ogni pixel per ogni banda coesistente.

Editor di codice (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.');

Configurazione di Python

Per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo, consulta la pagina Ambiente Python.

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)

Nella seconda parte di questo esempio, la differenza al quadrato viene calcolata utilizzando image.pow(2). Per l'elenco completo degli operatori matematici che gestiscono operazioni di aritmetica di base, trigonometria, potenza, arrotondamento, conversione, operazioni su bit e altro ancora, consulta la documentazione dell'API.

Espressioni

Per implementare espressioni matematiche più complesse, ti consigliamo di utilizzare image.expression(), che analizza una rappresentazione di testo di un'operazione matematica. L'esempio seguente utilizza expression() per calcolare l'indice di vegetazione migliorato (EVI):

Editor di codice (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']});

Configurazione di Python

Per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo, consulta la pagina Ambiente Python.

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)

Tieni presente che il primo argomento di expression() è la rappresentazione testuale dell'operazione matematica, il secondo argomento è un dizionario in cui le chiavi sono i nomi delle variabili utilizzate nell'espressione e i valori sono le bande di immagini a cui devono essere mappate le variabili. Le bande nell'immagine possono essere indicate come b("band name") o b(index), ad esempio b(0), anziché fornire il dizionario. Le bande possono essere definite da immagini diverse da quella di input quando si utilizza il dizionario della mappa delle bande. Tieni presente che expression() utilizza la "divisione per intero verso il basso", che ignora il resto e restituisce un numero intero quando vengono divisi due numeri interi. Ad esempio, 10 / 20 = 0. Per modificare questo comportamento, moltiplica uno degli operandi per 1.0: 10 * 1.0 / 20 = 0.5. Solo l'intersezione dei pixel non mascherati viene considerata e restituita come non mascherata quando vengono valutate le bande di più immagini di origine. Gli operatori di espressioni supportati sono elencati nella tabella seguente.

Operatori per expression()
Tipo Simbolo Nome
Aritmetica + - * / % ** Somma, Sottrazione, Moltiplicazione, Divisione, Modulo, Exponente
Relazione == != < > <= >= Uguale, Non uguale, Minore di, Maggiore di e così via.
Logico && || ! ^ And, Or, Not, Xor
Ternari ? : Se allora altrimenti