Convoluções

Para realizar convoluções lineares em imagens, use image.convolve(). O único argumento para convolução é um ee.Kernel especificado por uma forma e os pesos no kernel. Cada pixel da saída de imagem por convolve() é a combinação linear dos valores do kernel e dos pixels da imagem de entrada cobertos pelo kernel. Os kernels são aplicados a cada faixa individualmente. Por exemplo, convém usar um kernel de passagem baixa (suavização) para remover informações de alta frequência. A imagem a seguir ilustra um kernel de passagem baixa de 15 x 15 aplicado a uma imagem do Landsat 8:

Editor de código (JavaScript)

// Load and display an image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');
Map.setCenter(-121.9785, 37.8694, 11);
Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'input image');

// Define a boxcar or low-pass kernel.
var boxcar = ee.Kernel.square({
  radius: 7, units: 'pixels', normalize: true
});

// Smooth the image by convolving with the boxcar kernel.
var smooth = image.convolve(boxcar);
Map.addLayer(smooth, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'smoothed');

A saída da convolução com o filtro passa-baixa deve ser semelhante à Figura 1. Os argumentos para o kernel determinam o tamanho e os coeficientes dele. Especificamente, com o parâmetro units definido como pixels, o parâmetro radius especifica o número de pixels do centro que o kernel vai cobrir. Se normalize for definido como verdadeiro, os coeficientes do kernel vão somar um. Se o parâmetro magnitude estiver definido, os coeficientes do kernel serão multiplicados pela magnitude. Se normalize também for verdadeiro, os coeficientes vão somar magnitude. Se houver um valor negativo em qualquer um dos coeficientes do kernel, definir normalize como verdadeiro vai fazer com que os coeficientes somem a zero.

boxcar_sf
Figura 1. Imagem do Landsat 8 convolveda com um kernel de suavização. Área da baía de São Francisco, Califórnia, EUA.

Use outros kernels para conseguir o efeito de processamento de imagem desejado. Este exemplo usa um kernel de Laplace para detecção de borda isotrópica:

Editor de código (JavaScript)

// Define a Laplacian, or edge-detection kernel.
var laplacian = ee.Kernel.laplacian8({ normalize: false });

// Apply the edge-detection kernel.
var edgy = image.convolve(laplacian);
Map.addLayer(edgy,
             {bands: ['B5', 'B4', 'B3'], max: 0.5, format: 'png'},
             'edges');

Observe o especificador de formato nos parâmetros de visualização. O Earth Engine envia blocos de exibição para o Code Editor no formato JPEG para eficiência. No entanto, os blocos de borda são enviados no formato PNG para processar a transparência de pixels fora do limite da imagem. Quando ocorre uma descontinuidade visual, definir o formato como PNG resulta em uma exibição consistente. O resultado da convolução com o kernel de detecção de bordas de Laplacian deve ser semelhante à Figura 2.

laplacian_sf
Figura 2. Imagem do Landsat 8 convolveda com um kernel de detecção de bordas de Laplacian. Área da baía de São Francisco, Califórnia, EUA.

Há também kernels de detecção de bordas anisotrópicas (por exemplo, Sobel, Prewitt, Roberts), cuja direção pode ser alterada com kernel.rotate(). Outros kernels de passagem baixa incluem um kernel Gaussiano e kernels de várias formas com pesos uniformes. Para criar kernels com pesos e forma definidos de forma arbitrária, use ee.Kernel.fixed(). Por exemplo, este código cria um kernel 9x9 de 1s com um zero no meio:

Editor de código (JavaScript)

// Create a list of weights for a 9x9 kernel.
var row = [1, 1, 1, 1, 1, 1, 1, 1, 1];
// The center of the kernel is zero.
var centerRow = [1, 1, 1, 1, 0, 1, 1, 1, 1];
// Assemble a list of lists: the 9x9 kernel weights as a 2-D matrix.
var rows = [row, row, row, row, centerRow, row, row, row, row];
// Create the kernel from the weights.
var kernel = ee.Kernel.fixed(9, 9, rows, -4, -4, false);
print(kernel);