As operações matemáticas de imagem podem ser realizadas usando operadores como add()
e
subtract()
, mas para cálculos complexos com mais de dois termos, a
função expression()
é uma boa alternativa. Consulte as seções a seguir para mais informações sobre operadores e expressões.
Operadores
Os operadores matemáticos executam operações aritméticas básicas nas bandas de imagem. Elas recebem duas entradas: duas imagens ou uma imagem e um termo constante, que é interpretado como uma imagem constante de banda única sem pixels mascarados. As operações são realizadas por pixel para cada banda.
Como exemplo básico, considere a tarefa de calcular o índice de vegetação por diferença normalizada (NDVI, na sigla em inglês) usando imagens do VIIRS, em que os operadores add()
, subtract()
e divide()
são usados:
// 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') ) ) )
Apenas a interseção de pixels sem máscara entre as duas entradas é considerada e retornada como sem máscara. Todas as outras são mascaradas. Em geral, se uma das entradas tiver apenas uma banda, ela será usada em todas as bandas da outra entrada. Se as entradas tiverem o mesmo número de bandas, mas não os mesmos nomes, elas serão usadas em pares na ordem natural. As bandas de saída são nomeadas com base na entrada mais longa das duas ou, se tiverem o mesmo comprimento, na ordem da primeira entrada. O tipo dos pixels de saída é a união dos tipos de entrada.
O exemplo a seguir de subtração de imagem com várias bandas demonstra como as bandas são combinadas automaticamente, resultando em um "vetor de mudança" para cada pixel de cada banda simultânea.
// 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)
Na segunda parte deste exemplo, a diferença ao quadrado é calculada usando
image.pow(2)
. Para conferir a lista completa de operadores matemáticos que processam
aritmética básica, trigonometria, exponenciação, arredondamento, conversão, operações bitwise
e muito mais, consulte a documentação da API.
Expressões
Para implementar expressões matemáticas mais complexas, use
image.expression()
, que analisa uma representação de texto de uma operação matemática.
O exemplo a seguir usa expression()
para calcular o índice de vegetação aprimorado (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)
O primeiro argumento para expression()
é a representação textual da operação matemática. O segundo argumento é um dicionário em que as chaves são nomes de variáveis usadas na expressão, e os valores são as bandas de imagem para as quais as variáveis precisam ser mapeadas. As bandas na imagem podem ser chamadas de b("band name")
ou
b(index)
, por exemplo, b(0)
, em vez
de fornecer o dicionário. As bandas podem ser definidas a partir de imagens diferentes da entrada ao usar o dicionário do mapa de bandas. expression()
usa a "divisão inteira", que
descarta o restante e retorna um número inteiro quando dois números inteiros são divididos. Por exemplo,
10 / 20 = 0
. Para mudar esse comportamento, multiplique um dos operandos por
1.0
: 10 * 1.0 / 20 = 0.5
. Apenas a interseção de pixels sem máscara
é considerada e retornada como sem máscara quando as bandas de mais de uma imagem de origem são
avaliadas. Os operadores de expressão compatíveis estão listados na tabela a seguir.
Tipo | Símbolo | Nome |
---|---|---|
Aritmética | + - * / % ** | Adicionar, subtrair, multiplicar, dividir, módulo, expoente |
Relacional | == != < > <= >= | Igual, diferente, menor que, maior que etc. |
Lógica | && || ! ^ | E, Ou, Não, Xor |
Ternar | ? : | If then else |