Composição, mascaramento e mosaico

Com a coleção de reflectância TOA do Landsat 8 carregada em uma variável chamada l8, você viu que o código a seguir resulta em uma composição de valor recente:

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

Um dos problemas com essa composição é que ela está cheia de nuvens. Em vez de apenas pegar o último pixel da coleção (quando você adiciona uma coleção ao mapa, o Earth Engine chama implicitamente mosaic() nela), é possível reduzir o ImageCollection (saiba mais sobre como reduzir coleções de imagens).

Composição com redutores

Você conheceu os redutores para coletar estatísticas em uma região de imagem. Essa foi uma redução espacial. Reduzir uma coleção de imagens a uma imagem é uma redução temporal quando a coleção representa imagens ao longo do tempo. O tipo de Reducer usado define como o Earth Engine processa pixels sobrepostos. O Landsat 8 visita o mesmo ponto na Terra a cada 16 dias. Isso significa que, em um período de seis meses, haverá aproximadamente 12 imagens (e mais onde as cenas se sobrepõem). Cada pixel no mapa é derivado de uma pilha de pixels, um de cada imagem na coleção que está sendo mostrada.

Apenas adicionar a coleção ao mapa resulta na seleção do pixel mais recente, ou seja, aquele da última imagem na pilha. Esse comportamento pode ser alterado usando os redutores do Earth Engine. Por exemplo, em vez de usar o pixel mais recente da pilha, o Earth Engine pode ser instruído a escolher o valor mediano na pilha. Isso tem o benefício de remover nuvens (que têm um valor alto) e sombras (que têm um valor baixo). Quando uma coleção de imagens é reduzida usando o redutor de mediana, o valor composto é a mediana em cada banda ao longo do tempo. Por exemplo, usando cenas do Landsat em 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');

A novidade nesse código é o método median() aplicado a uma coleção de imagens. Assim como os métodos de filtragem, esse é um atalho para o método mais geral reduce() em coleções de imagens que usa um ee.Reducer() como argumento. Consulte o pacote ee.Reducer na guia Docs do editor de código para conferir uma lista de todos os redutores do Earth Engine. Ao considerar um redutor para uma coleção de imagens, observe que a saída é uma imagem. Portanto, redutores com saídas não numéricas, como os redutores histogram ou toList, não funcionam com uma coleção de imagens.

Tutorial_api_06_median_composite
Figura 6. Composição mediana do Landsat 8.

Ao diminuir o zoom na composição mediana, você verá algo como a Figura 6. O resultado deve ser bem melhor do que o composto de valor recente que você criou antes. Neste ponto, vale a pena dar um passo atrás e considerar o que foi feito para criar essa composição mediana. O Earth Engine carregou toda a coleção do Landsat 8 sobre os EUA continentais e calculou a mediana de cada pixel. É muita informação! É claro que você pode calcular as medianas anuais filtrando primeiro a coleção, como fez anteriormente. O ponto é que, se você tivesse que baixar todas essas imagens e fazer essa composição, seria um grande projeto. Com o Earth Engine, você recebe um resultado em segundos.

Saiba mais sobre composição e mosaico neste link.

Mascaramento

Embora o composto mediano seja uma melhoria em relação ao composto de valor recente, talvez você queira mascarar partes da imagem. Mascarar pixels em uma imagem os torna transparentes e os exclui da análise. Cada pixel em cada banda de uma imagem tem uma máscara. Aqueles com um valor de máscara de 0 ou menos serão transparentes. Aqueles com uma máscara de qualquer valor acima de 0 serão renderizados. A máscara de uma imagem é definida usando uma chamada como image1.mask(image2). Essa chamada usa os valores de image2 e os torna a máscara de image1. Todos os pixels em image2 que têm o valor 0 serão transparentes em image1.

Por exemplo, suponha que você queira mascarar todos os pixels de água na composição mediana. Uma máscara de água pode ser criada usando o conjunto de dados descrito por Hansen et al. (2013), que está no Data Catalog do Earth Engine. Saiba mais sobre o conjunto de dados de Hansen et al. neste tutorial. Nesse conjunto de dados, a água tem o valor 2, a terra tem o valor 1 e "sem dados" tem o valor 0. Use um pouco de lógica para criar uma imagem de máscara com zeros onde não há terra:

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

Há algumas novidades nesse código que vale a pena mencionar em detalhes. Primeiro, a função select() é útil para extrair as bandas de interesse de uma imagem. Aqui, selecionamos apenas a banda que nos interessa: datamask. A próxima novidade é o operador lógico eq(), que significa "igual a". Usamos eq(1) para criar uma imagem binária em que todos os pixels que não têm o valor 1 na banda datamask (aqueles que são água ou não têm dados) recebem o valor 0 na imagem resultante.

Como resultado dessa máscara, todos os pixels no composto mediano que estão sobre a terra (de acordo com o conjunto de dados de Hansen et al.) ficam visíveis, mas aqueles sobre a água (ou nodata) ficam transparentes e são excluídos de qualquer análise feita na imagem maskedComposite.

Mosaico

Ao combinar os conceitos de coleções de imagens, operadores lógicos, mascaramento e composição, é possível alcançar resultados cartográficos interessantes. Por exemplo, suponha que você queira uma imagem em que os pixels de terra sejam exibidos em cores reais e todos os outros pixels sejam exibidos em azul. Você pode fazer algo como:

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

Há muita coisa acontecendo nesse código, então vamos analisá-lo. Primeiro, usamos o operador lógico not() para inverter a máscara que criamos anteriormente. Especificamente, not() transforma todos os zeros em uns e todos os não zeros em zeros. Não é totalmente correto chamar essa variável de water porque ela também inclui alguns pixels sem dados, mas isso é aceitável no contexto cartográfico atual. Em seguida, mascaramos a "água" com ela mesma. Isso resulta em uma imagem em que todos os pixels de água são 1 e todo o resto é mascarado. A etapa final é combinar as imagens com mosaic(). Como mosaic() funciona em uma coleção de imagens, transmitimos uma lista de imagens que queremos combinar no construtor da coleção de imagens e, em seguida, chamamos mosaic() como a etapa final. A ordem das imagens nessa lista é importante. Especificamente, a imagem de saída vai conter o último pixel sem máscara da pilha de imagens na coleção de entrada. Nesse caso, isso funciona porque a camada de água é a última imagem (superior) na coleção e contém apenas pixels não mascarados onde há água.

As imagens na coleção são imagens de visualização. Quando você chama visualize() em uma imagem, ela é transformada em uma imagem de 3 bandas e 8 bits de acordo com os parâmetros de visualização que você transmite. Os parâmetros de visualização padrão funcionam bem para imagens de 3 bandas e 8 bits. Portanto, não é necessário usar parâmetros de visualização ao adicionar a imagem ao mapa. O resultado será semelhante à Figura 7.

Tutorial_api_07_mosaic.png
Figura 7. Mosaico personalizado que deixa as áreas de água com uma cor uniforme.

Até agora, você viu maneiras de visualizar coleções de imagens como compostos de valor recente, métodos para compor coleções de imagens usando redutores e métodos para criar compostos personalizados mascarando e criando mosaicos de uma coleção de imagens. Na próxima página, aprenda a adicionar um índice de vegetação a cada imagem em uma coleção e usar o índice para criar uma composição de "pixel mais verde".