Con la colección de reflectancia de la TOA de Landsat 8 cargada en una variable llamada l8
, viste que el siguiente código genera un composite de valores recientes:
Editor de código (JavaScript)
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31'); Map.addLayer(landsat2016, visParams, 'l8 collection');
Uno de los problemas con este compuesto es que está lleno de nubes. En lugar de solo tomar el último píxel de la colección (cuando agregas una colección al mapa, Earth Engine llama de forma implícita a mosaic()
), puedes reducir el ImageCollection
(obtén más información para reducir colecciones de imágenes).
Composición con reductores
Primero, se te presentaron los reductores para obtener estadísticas en una región de la imagen. Esa fue una reducción espacial. Reducir una colección de imágenes a una sola imagen es una reducción temporal cuando la colección representa imágenes a lo largo del tiempo. El tipo de Reducer
que usas define cómo Earth Engine controla los píxeles superpuestos. Landsat 8 visita el mismo punto de la Tierra cada 16 días. Esto significa que, en un período de 6 meses, habrá aproximadamente 12 imágenes (y más en los casos en que las escenas se superpongan). Cada píxel del mapa se deriva de una pila de píxeles, uno de cada imagen de la colección que se muestra.
Con solo agregar la colección al mapa, se selecciona el píxel más reciente, es decir, el de la imagen más reciente de la pila. Este comportamiento se puede alterar con los reductores de Earth Engine. Por ejemplo, en lugar de tomar el píxel más reciente de la pila, se le puede indicar a Earth Engine que elija el valor de la mediana en la pila. Esto tiene el beneficio de quitar las nubes (que tienen un valor alto) y las sombras (que tienen un valor bajo). Cuando se reduce una colección de imágenes con el reductor de mediana, el valor compuesto es la mediana en cada banda a lo largo del tiempo. Por ejemplo, con escenas de Landsat en 2016:
Editor de código (JavaScript)
// Get the median over time, in each band, in each pixel. var median = l8.filterDate('2016-01-01', '2016-12-31').median(); // Make a handy variable of visualization parameters. var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3}; // Display the median composite. Map.addLayer(median, visParams, 'median');
Lo nuevo en este código es el método median()
aplicado a una colección de imágenes.
Al igual que los métodos de filtrado, este es un atajo para el método más general reduce()
en las colecciones de imágenes, que toma un ee.Reducer()
como argumento. Consulta el paquete ee.Reducer
en la pestaña Docs del editor de código para ver una lista de todos los reductores de Earth Engine. Cuando consideres un reductor para una colección de imágenes, ten en cuenta que el resultado es una imagen, por lo que los reductores con resultados no numéricos, por ejemplo, los reductores histogram
o toList
, no funcionarán con una colección de imágenes.

Cuando alejes el zoom en la composición mediana, deberías ver algo similar a la Figura 6. Esto debería verse mucho mejor que el compuesto de valores recientes que creaste anteriormente. En este punto, vale la pena detenerse y considerar qué se hizo para crear esa composición mediana. Earth Engine cargó toda la colección de Landsat 8 en el territorio continental de EE.UU. y calculó la mediana de cada píxel. ¡Son muchos datos! Por supuesto, puedes calcular las medianas anuales. Para ello, primero filtra la colección, como ya lo hiciste. El punto es que, si tuvieras que descargar todas esas imágenes y crear este compuesto, sería un proyecto grande. Con Earth Engine, obtendrás un resultado en segundos.
Obtén más información sobre la composición y la creación de mosaicos aquí.
Enmascaramiento
Si bien la composición de la mediana es una mejora con respecto a la composición del valor reciente, es posible que desees enmascarar partes de la imagen. Enmascarar píxeles en una imagen hace que esos píxeles sean transparentes y los excluye del análisis. Cada píxel de cada banda de una imagen tiene una máscara. Los que tengan un valor de máscara de 0 o inferior serán transparentes. Se renderizarán los que tengan una máscara con cualquier valor superior a 0. La máscara de una imagen se establece con una llamada como image1.mask(image2)
. Esta llamada toma los valores de image2
y los convierte en la máscara de image1
. Los píxeles de image2
que tengan el valor 0 se volverán transparentes en image1
.
Por ejemplo, supongamos que deseas enmascarar todos los píxeles de agua en la imagen compuesta de la mediana. Se puede crear una máscara de agua con el conjunto de datos que se describe en Hansen et al. (2013), que se encuentra en el catálogo de datos de Earth Engine. (Obtén más información sobre el conjunto de datos de Hansen et al. en este instructivo). En este conjunto de datos, el agua tiene un valor de 2, la tierra tiene un valor de 1 y "sin datos" tiene un valor de 0. Usa un poco de lógica para crear una imagen de máscara que tenga ceros donde no haya tierra:
Editor de código (JavaScript)
// Load or import the Hansen et al. forest change dataset. var hansenImage = ee.Image('UMD/hansen/global_forest_change_2015'); // Select the land/water mask. var datamask = hansenImage.select('datamask'); // Create a binary mask. var mask = datamask.eq(1); // Update the composite mask with the water mask. var maskedComposite = median.updateMask(mask); Map.addLayer(maskedComposite, visParams, 'masked');
Hay un par de cosas nuevas en este código que vale la pena mencionar en detalle. Primero, la función select()
es útil para extraer las bandas de interés de una imagen. Aquí, seleccionamos solo la banda que nos interesa: datamask
. La siguiente novedad es el operador lógico eq()
, que significa "es igual a". Usamos eq(1)
para crear una imagen binaria en la que todos los píxeles que no tienen el valor 1 en la banda datamask
(los que son agua o no tienen datos) obtienen un valor de 0 en la imagen resultante.
Como resultado de este enmascaramiento, todos los píxeles del compuesto de mediana que se encuentran sobre tierra (según el conjunto de datos de Hansen et al.) son visibles, pero los que se encuentran sobre el agua (o sin datos) son transparentes y se excluirán de cualquier análisis que realices en la imagen de maskedComposite
.
Generación de mosaicos
Si combinas los conceptos de colecciones de imágenes, operadores lógicos, enmascaramiento y composición, puedes obtener resultados cartográficos interesantes. Por ejemplo, supongamos que deseas una imagen en la que los píxeles de tierra se muestren en color verdadero y todos los demás píxeles se muestren en azul. Puedes hacer lo siguiente:
Editor de código (JavaScript)
// Make a water image out of the mask. var water = mask.not(); // Mask water with itself to mask all the zeros (non-water). water = water.mask(water); // Make an image collection of visualization images. var mosaic = ee.ImageCollection([ median.visualize(visParams), water.visualize({palette: '000044'}), ]).mosaic(); // Display the mosaic. Map.addLayer(mosaic, {}, 'custom mosaic');
Hay mucho que explorar en ese código, así que vamos a analizarlo. Primero, usamos el operador lógico not()
para invertir la máscara que creamos antes. Específicamente, not()
convierte todos los ceros en unos y todos los no ceros en ceros. No es del todo correcto llamar a esa variable water
, ya que también incluye algunos píxeles sin datos, pero está bien en el contexto cartográfico actual. Lo siguiente es enmascarar el "agua" con sí misma. Esto genera una imagen en la que todos los píxeles de agua son 1 y todo lo demás está enmascarado. El último paso es combinar las imágenes con mosaic()
. Dado que mosaic()
funciona en una colección de imágenes, pasamos una
lista de imágenes que queremos combinar en el constructor de la colección de imágenes y, luego,
llamamos a mosaic()
como paso final. El orden de las imágenes en esa lista es importante. Específicamente, la imagen de salida contendrá el último píxel sin máscara de la pila de imágenes de la colección de entrada. En este caso, funciona porque la capa de agua es la última imagen (superior) de la colección y solo contiene píxeles sin máscara en los que hay agua.
Ten en cuenta que las imágenes de la colección son imágenes de visualización. Cuando llamas a visualize()
en una imagen, se convierte en una imagen de 8 bits y 3 bandas según los parámetros de visualización que pases. Los parámetros de visualización predeterminados funcionan bien para las imágenes de 3 bandas y 8 bits, por lo que no necesitas parámetros de visualización cuando agregas la imagen al mapa. El resultado debería verse como en la figura 7.

En este punto, ya viste formas de visualizar colecciones de imágenes como composiciones de valores recientes, métodos para componer colecciones de imágenes con reductores y métodos para crear composiciones personalizadas enmascarando y creando mosaicos de una colección de imágenes. En la página siguiente, aprenderás a agregar un índice de vegetación a cada imagen de una colección y a usar el índice para crear una imagen compuesta del "píxel más verde".