La détection des contours s'applique à un large éventail de tâches de traitement d'images. En plus des noyaux de détection des bords décrits dans la section sur les convolutions, Earth Engine propose plusieurs algorithmes de détection des bords spécialisés. L'algorithme de détection des contours de Canny (Canny 1986) utilise quatre filtres distincts pour identifier les contours horizontaux, verticaux et diagonaux. Le calcul extrait la valeur de la première dérivée pour les directions horizontale et verticale, puis calcule l'intensité du gradient. Les gradients de plus faible intensité sont supprimés. Pour éliminer le bruit à haute fréquence, vous pouvez préfiltrer l'image avec un noyau gaussien. Exemple :
Éditeur de code (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');
Notez que le paramètre threshold
détermine l'intensité minimale du gradient et que le paramètre sigma
correspond à l'écart type (ET) d'un préfiltre gaussien permettant d'éliminer le bruit à haute fréquence. Pour l'extraction de lignes à partir d'un détecteur de bords, Earth Engine implémente la transformation de Hough (Duda et Hart, 1972). Pour reprendre l'exemple précédent, extrayez les lignes du détecteur Canny avec:
Éditeur de code (JavaScript)
// Perform Hough transform of the Canny result and display. var hough = ee.Algorithms.HoughTransform(canny, 256, 600, 100); Map.addLayer(hough, {}, 'hough');
zeroCrossing()
est un autre algorithme spécialisé dans Earth Engine. Un point d'inflexion est défini comme tout pixel dont le pixel de droite, de bas ou de diagonale en bas à droite a le signe opposé. Si l'un de ces pixels est de signe opposé, le pixel actuel est défini sur 1 (passage à zéro). Sinon, il est défini sur zéro. Pour détecter les arêtes, l'algorithme de passage par zéro peut être appliqué à une estimation de la seconde dérivée de l'image.
L'exemple suivant montre comment utiliser zeroCrossing()
pour la détection des bords:
Éditeur de code (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');
La sortie des points d'inflexion pour une zone située à proximité de l'aéroport de San Francisco, en Californie, devrait ressembler à la figure 1.