Обнаружение края

Обнаружение краев применимо к широкому спектру задач обработки изображений. Помимо ядер обнаружения границ, описанных в разделе свертки , в 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.

пересечения нуля SFO
Рисунок 1. Выходные данные пересечения нуля (красный) с панхроматической полосой Landsat 8 на заднем плане для района недалеко от аэропорта Сан-Франциско, Калифорния (справа).