Обнаружение краев применимо к широкому спектру задач обработки изображений. Помимо ядер обнаружения границ, описанных в разделе свертки , в Earth Engine есть несколько специализированных алгоритмов обнаружения границ. Алгоритм обнаружения краев Канни (Canny 1986) использует четыре отдельных фильтра для определения диагональных, вертикальных и горизонтальных краев. В ходе расчета извлекается значение первой производной для горизонтального и вертикального направлений и вычисляется величина градиента. Градиенты меньшей величины подавляются. Чтобы устранить высокочастотный шум, при необходимости предварительно отфильтруйте изображение с помощью ядра Гаусса. Например:
Редактор кода (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');
Обратите внимание, что threshold
параметр определяет минимальную величину градиента, а параметр sigma
представляет собой стандартное отклонение (SD) гауссовского предварительного фильтра для удаления высокочастотного шума. Для извлечения линии из детектора границ Earth Engine реализует преобразование Хафа (Дуда и Харт, 1972) . Продолжая предыдущий пример, извлеките линии из детектора Канни с помощью:
Редактор кода (JavaScript)
// Perform Hough transform of the Canny result and display. var hough = ee.Algorithms.HoughTransform(canny, 256, 600, 100); Map.addLayer(hough, {}, 'hough');
Другой специализированный алгоритм в Earth Engine — это zeroCrossing()
. Пересечение нуля определяется как любой пиксель, в котором правый, нижний или диагональный нижний правый пиксель имеет противоположный знак. Если какой-либо из этих пикселей имеет противоположный знак, текущий пиксель устанавливается на 1 (пересечение нуля); в противном случае он устанавливается на ноль. Чтобы обнаружить края, алгоритм пересечения нуля может быть применен к оценке второй производной изображения. Ниже показано использование zeroCrossing()
для обнаружения границ:
Редактор кода (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');
Выходные данные пересечения нуля для области возле аэропорта Сан-Франциско, штат Калифорния, должны выглядеть примерно так, как показано на рисунке 1.