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.