Wykrywanie krawędzi

Wykrywanie krawędzi można stosować do szerokiej gamy zadań związanych z przetwarzaniem obrazów. Oprócz rdzeni wykrywania krawędzi opisanych w  sekcji dotyczących splotów w Earth Engine dostępnych jest kilka wyspecjalizowanych algorytmów wykrywania krawędzi. Algorytm wykrywania krawędzi Canny (Canny 1986) używa 4 oddzielnych filtrów do identyfikowania krawędzi ukośnych, pionowych i poziomych. Obliczenie to wyodrębnia wartość pierwszej pochodnej w kierunku poziomym i pionowym oraz oblicza wielkość gradientu. Gradienty o mniejszym natężeniu są tłumione. Aby wyeliminować szum o wysokiej częstotliwości, opcjonalnie przefiltruj obraz za pomocą filtra Gaussian. Na przykład:

Edytor kodu (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');

Pamiętaj, że parametr threshold określa minimalną wielkość gradientu, a parametr sigma to odchylenie standardowe (SD) w ramach filtra wstępnego typu Gaussian do usuwania szumów o wysokiej częstotliwości. W przypadku wyodrębniania linii z detektora krawędzi Earth Engine stosuje transformację Hougha (Duda and Hart 1972). Kontynuując poprzedni przykład, wyodrębnij wiersze z detektora Canny za pomocą:

Edytor kodu (JavaScript)

// Perform Hough transform of the Canny result and display.
var hough = ee.Algorithms.HoughTransform(canny, 256, 600, 100);
Map.addLayer(hough, {}, 'hough');

Innym wyspecjalizowanym algorytmem w Earth Engine jest zeroCrossing(). Przecięcie z osią 0 definiuje się jako dowolny piksel, w którym piksel po prawej stronie, na dole lub po przekątnej w prawym dolnym rogu ma znak przeciwny. Jeśli którykolwiek z tych pikseli ma przeciwny znak, bieżący piksel jest ustawiany na 1 (przecięcie z osią X); w przeciwnym razie jest ustawiany na 0. Aby wykryć krawędzie, algorytm przejść przez zero można zastosować do oszacowania drugiej pochodnej obrazu. Poniżej przedstawiamy przykład użycia zeroCrossing() do wykrywania krawędzi:

Edytor kodu (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');

Dane wyjściowe dotyczące przecięć z osią symetrii w obszarze w pobliżu lotniska w San Francisco w Kalifornii powinny wyglądać mniej więcej tak jak na rysunku 1.

zero przejść SFO
Rysunek 1. Dane wyjściowe z przecięciami na zero (czerwone) z pasmem panchromatycznym Landsat 8 na tle obszaru w pobliżu lotniska w San Francisco w Kalifornii (po prawej).