Estadísticas de una región de imagen

reduceRegion

Para obtener estadísticas de los valores de píxeles en una región de un ee.Image, usa image.reduceRegion(). Esto reduce todos los píxeles de las regiones a una estadística o a otra representación compacta de los datos de píxeles en la región (p.ej., un histograma). La región se representa como un Geometry, que puede ser un polígono que contiene muchos píxeles o un solo punto, en cuyo caso solo habrá un píxel en la región. En cualquier caso, como se ilustra en la Figura 1, el resultado es una estadística derivada de los píxeles de la región.

Diagrama de reduceRegion
Figura 1: Ilustración de un ee.Reducer aplicado a una imagen y una región.

Para obtener un ejemplo de cómo obtener estadísticas de píxeles en una región de una imagen con reduceRegion(), considera encontrar los valores espectrales promedio de un compuesto de Landsat de 5 años dentro de los límites del bosque de coníferas de Sierra Nevada (que se ilustra en la Figura 2):

// Load input imagery: Landsat 7 5-year composite.
var image = ee.Image('LANDSAT/LE7_TOA_5YEAR/2008_2012');

// Load an input region: Sierra Nevada.
var region = ee.Feature(ee.FeatureCollection('EPA/Ecoregions/2013/L3')
  .filter(ee.Filter.eq('us_l3name', 'Sierra Nevada'))
  .first());

// Reduce the region. The region parameter is the Feature geometry.
var meanDictionary = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  scale: 30,
  maxPixels: 1e9
});

// The result is a Dictionary.  Print it.
print(meanDictionary);

Para forzar el procesamiento, basta con imprimir el resultado, que el editor de código mostrará como un Dictionary en la consola. El resultado debería ser similar al siguiente:

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
Diagrama de reduceRegion
Figura 2. Composición de colores falsos de los datos de imágenes de Landsat de California y Nevada. La región sobre la que se debe reducir se muestra en blanco.

Ten en cuenta que, en este ejemplo, la reducción se especifica proporcionando reducer (ee.Reducer.mean()), geometry (region.geometry()), scale (30 metros) y maxPixels para la cantidad máxima de píxeles que se ingresarán al reductor. Siempre se debe especificar una escala en las llamadas a reduceRegion(). Esto se debe a que, en los flujos de procesamiento complejos, que pueden incluir datos de diferentes fuentes con diferentes escalas, la escala del resultado no se determinará de forma inequívoca a partir de las entradas. En ese caso, la escala se establece de forma predeterminada en 1 grado, lo que, por lo general, produce resultados insatisfactorios. Consulta esta página para obtener más información sobre cómo Earth Engine controla la escala.

Existen dos maneras de establecer la escala: especificando el parámetro scale o especificando un CRS y una transformación de CRS. (consulta el glosario para obtener más información sobre los CRS y sus transformaciones). Por ejemplo, la reducción de meanDictionary (anterior) equivale a lo siguiente:

// As an alternative to specifying scale, specify a CRS and a CRS transform.
// Make this array by constructing a 4326 projection at 30 meters,
// then copying the bounds of the composite, from composite.projection().
var affine = [0.00026949458523585647, 0, -180, 0, -0.00026949458523585647, 86.0000269494563];

// Perform the reduction, print the result.
print(image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  crs: 'EPSG:4326',
  crsTransform: affine,
  maxPixels: 1e9
}));

En general, especificar la escala es suficiente y genera un código más legible. Earth Engine determina qué píxeles ingresar al reductor primero rasterizando la región. Si se especifica una escala sin un CRS, la región se rasteriza en la proyección nativa de la imagen ajustada a la resolución especificada. Si se especifican un CRS y una escala, la región se rasteriza en función de ellos.

Píxeles en la región

Se determina que los píxeles están en la región (y se ponderan) según las siguientes reglas, que se aplican en la escala y la proyección especificadas:

  • Reductores no ponderados (p.ej., ee.Reducer.count() o ee.Reducer.mean().unweighted()): Se incluyen píxeles si su centroide está en la región y la máscara de la imagen no es cero.
  • Reductores ponderados (p. ej., ee.Reducer.mean()): Los píxeles se incluyen si al menos (aproximadamente) el 0.5% del píxel está en la región y la máscara de la imagen no es cero. Su peso es el mínimo de la máscara de la imagen y la fracción (aproximada) del píxel que cubre la región.

El parámetro maxPixels es necesario para que el procesamiento se realice correctamente. Si se omite este parámetro del ejemplo, se muestra un error que se ve de la siguiente manera:

Existen varias opciones para superar estos errores: aumentar maxPixels, como en el ejemplo, aumentar scale o establecer bestEffort como verdadero, lo que calcula automáticamente una escala nueva (más grande) para que no se supere maxPixels. Si no especificas maxPixels, se usa el valor predeterminado.