A detecção de bordas é aplicável a uma ampla gama de tarefas de processamento de imagens. Além dos kernels de detecção de bordas descritos na seção de convoluções, há vários algoritmos especializados de detecção de bordas no Earth Engine. O algoritmo de detecção de bordas de Canny (Canny 1986) usa quatro filtros separados para identificar as bordas diagonais, verticais e horizontais. O cálculo extrai o valor da primeira derivada para as direções horizontal e vertical e calcula a magnitude do gradiente. Gradientes de magnitude menor são suprimidos. Para eliminar ruídos de alta frequência, pré-filtre a imagem com um kernel Gaussiano, se quiser. Exemplo:
Editor de código (JavaScript)
// Load a Landsat 8 image, select the panchromatic band. var image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318').select('B8'); // Perform Canny edge detection and display the result. var canny = ee.Algorithms.CannyEdgeDetector({ image: image, threshold: 10, sigma: 1 }); Map.setCenter(-122.054, 37.7295, 10); Map.addLayer(canny, {}, 'canny');
O parâmetro threshold
determina a magnitude mínima do gradiente, e o parâmetro sigma
é o desvio padrão (SD, na sigla em inglês) de um pré-filtro gaussiano para remover ruídos de alta frequência. Para extrair linhas de um detector de bordas,
o Earth Engine implementa a transformação de Hough
(Duda e Hart, 1972). Continuando com o
exemplo anterior, extraia linhas do detector Canny com:
Editor de código (JavaScript)
// Perform Hough transform of the Canny result and display. var hough = ee.Algorithms.HoughTransform(canny, 256, 600, 100); Map.addLayer(hough, {}, 'hough');
Outro algoritmo especializado no Earth Engine é o zeroCrossing()
. Uma
passagem por zero é definida como qualquer pixel em que o pixel direito, inferior ou diagonal
inferior direito tem o sinal oposto. Se qualquer um desses pixels tiver sinal oposto, o pixel
atual será definido como 1 (cruzamento de zero). Caso contrário, ele será definido como zero. Para detectar bordas,
o algoritmo de passagem por zero pode ser aplicado a uma estimativa da segunda derivada da imagem.
O exemplo a seguir demonstra o uso de zeroCrossing()
para a detecção de bordas:
Editor de código (JavaScript)
// Load a Landsat 8 image, select the panchromatic band. var image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318').select('B8'); Map.addLayer(image, {max: 12000}); // Define a "fat" Gaussian kernel. var fat = ee.Kernel.gaussian({ radius: 3, sigma: 3, units: 'pixels', normalize: true, magnitude: -1 }); // Define a "skinny" Gaussian kernel. var skinny = ee.Kernel.gaussian({ radius: 3, sigma: 1, units: 'pixels', normalize: true, }); // Compute a difference-of-Gaussians (DOG) kernel. var dog = fat.add(skinny); // Compute the zero crossings of the second derivative, display. var zeroXings = image.convolve(dog).zeroCrossing(); Map.setCenter(-122.054, 37.7295, 10); Map.addLayer(zeroXings.selfMask(), {palette: 'FF0000'}, 'zero crossings');
A saída de cruzamentos com valor zero para uma área perto do aeroporto de São Francisco, CA, será semelhante à Figura 1.