La detección de bordes se aplica a una amplia variedad de tareas de procesamiento de imágenes. Además de los kernels de detección de bordes que se describen en la sección de convolución, existen varios algoritmos especializados de detección de bordes en Earth Engine. El algoritmo de detección de bordes de Canny (Canny 1986) usa cuatro filtros separados para identificar los bordes diagonales, verticales y horizontales. El cálculo extrae el valor de la primera derivada para las direcciones horizontal y vertical, y calcula la magnitud del gradiente. Se suprimen los gradientes de magnitud más pequeña. Para eliminar el ruido de alta frecuencia, filtra previamente la imagen con un kernel gaussiano de forma opcional. Por ejemplo:
// 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');
Ten en cuenta que el parámetro threshold
determina la magnitud mínima del gradiente y el parámetro sigma
es la desviación estándar (DE) de un filtro previo gaussiano para quitar el ruido de alta frecuencia. Para la extracción de líneas de un detector de bordes, Earth Engine implementa la transformación de Hough (Duda y Hart, 1972). Para continuar con el ejemplo anterior, extrae líneas del detector Canny con lo siguiente:
// Perform Hough transform of the Canny result and display. var hough = ee.Algorithms.HoughTransform(canny, 256, 600, 100); Map.addLayer(hough, {}, 'hough');
Otro algoritmo especializado en Earth Engine es zeroCrossing()
. Un cruce por cero se define como cualquier píxel en el que el píxel derecho, inferior o diagonal inferior derecho tenga el signo opuesto. Si alguno de estos píxeles tiene un signo opuesto, el píxel actual se establece en 1 (cero a cero); de lo contrario, se establece en cero. Para detectar bordes, se puede aplicar el algoritmo de cruces por cero a una estimación de la segunda derivada de la imagen.
En el siguiente ejemplo, se muestra el uso de zeroCrossing()
para la detección de bordes:
// 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');
El resultado de cruces cero para un área cerca del aeropuerto de San Francisco, California, debería ser similar a la Figura 1.
