Estadísticas de los vecindarios de imágenes

En lugar de especificar una región sobre la que realizar una reducción, también es posible especificar un vecindario en el que aplicar un reductor. Para reducir los vecindarios de imágenes, usa image.reduceNeighborhood(). En este caso, la reducción se realizará en una ventana deslizante sobre la imagen de entrada, con el tamaño y la forma de la ventana especificados por un ee.Kernel. El resultado de reduceNeighborhood() será otra imagen, en la que cada valor de píxel representará el resultado de la reducción en un vecindario alrededor de ese píxel en la imagen de entrada. En la Figura 1, se ilustra este tipo de reducción.

Diagrama de reduceNeighborhood
Figura 1: Ilustración de reduceNeighborhood(), en la que se aplica el reductor en un kernel.

Por ejemplo, considera usar imágenes del Programa Nacional de Imágenes Agrícolas (NAIP) para cuantificar las diferencias en el paisaje resultantes de la tala en los bosques de secuoyas de California. Específicamente, usa la desviación estándar (DE) en un vecindario para representar la diferencia de textura entre el área registrada (SW de la imagen en la Figura 2) y el área protegida (NE de la imagen en la Figura 2). Por ejemplo, para obtener la textura de una imagen del índice de vegetación con diferencia normalizada (NDVI) de NAIP, usa reduceNeighborhood() para calcular la desviación estándar en un vecindario definido por un kernel:

// Define a region in the redwood forest.
var redwoods = ee.Geometry.Rectangle(-124.0665, 41.0739, -123.934, 41.2029);

// Load input NAIP imagery and build a mosaic.
var naipCollection = ee.ImageCollection('USDA/NAIP/DOQQ')
  .filterBounds(redwoods)
  .filterDate('2012-01-01', '2012-12-31');
var naip = naipCollection.mosaic();

// Compute NDVI from the NAIP imagery.
var naipNDVI = naip.normalizedDifference(['N', 'R']);

// Compute standard deviation (SD) as texture of the NDVI.
var texture = naipNDVI.reduceNeighborhood({
  reducer: ee.Reducer.stdDev(),
  kernel: ee.Kernel.circle(7),
});

// Display the results.
Map.centerObject(redwoods, 12);
Map.addLayer(naip, {}, 'NAIP input imagery');
Map.addLayer(naipNDVI, {min: -1, max: 1, palette: ['FF0000', '00FF00']}, 'NDVI');
Map.addLayer(texture, {min: 0, max: 0.3}, 'SD of NDVI');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
# Define a region in the redwood forest.
redwoods = ee.Geometry.Rectangle(-124.0665, 41.0739, -123.934, 41.2029)

# Load input NAIP imagery and build a mosaic.
naip_collection = (
    ee.ImageCollection('USDA/NAIP/DOQQ')
    .filterBounds(redwoods)
    .filterDate('2012-01-01', '2012-12-31')
)
naip = naip_collection.mosaic()

# Compute NDVI from the NAIP imagery.
naip_ndvi = naip.normalizedDifference(['N', 'R'])

# Compute standard deviation (SD) as texture of the NDVI.
texture = naip_ndvi.reduceNeighborhood(
    reducer=ee.Reducer.stdDev(), kernel=ee.Kernel.circle(7)
)

# Display the results.
m = geemap.Map()
m.center_object(redwoods, 12)
m.add_layer(naip, {}, 'NAIP input imagery')
m.add_layer(
    naip_ndvi, {'min': -1, 'max': 1, 'palette': ['FF0000', '00FF00']}, 'NDVI'
)
m.add_layer(texture, {'min': 0, 'max': 0.3}, 'SD of NDVI')
m

Cualquier píxel con un valor de kernel distinto de cero se incluye en el cálculo. Los pesos del kernel se usan de forma predeterminada, aunque puedes cambiar ese comportamiento con el argumento inputWeight. En la Figura 2, se comparan la imagen de entrada y la salida de reduceNeighborhood().

Entrada reduceNeighborhood
Figura 2a. Imágenes de NAIP de la costa norte de California.
Salida de reduceNeighborhood
Figura 2b. Salida de reduceNeighborhood() con un reductor de desviación estándar.