Rilevamento dei bordi

Il rilevamento dei bordi è applicabile a una vasta gamma di attività di elaborazione delle immagini. Oltre ai kernel di rilevamento dei bordi descritti nella sezione sulle convolute, in Earth Engine sono disponibili diversi algoritmi di rilevamento dei bordi specializzati. L'algoritmo di rilevamento dei bordi di Canny (Canny 1986) utilizza quattro filtri distinti per identificare i bordi diagonali, verticali e orizzontali. Il calcolo estrae il valore della prima derivata per le direzioni orizzontale e verticale e calcola l'intensità del gradiente. I gradienti di entità inferiore vengono eliminati. Per eliminare il rumore ad alta frequenza, filtra eventualmente l'immagine con un kernel gaussiano. Ad esempio:

Editor di codice (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');

Tieni presente che il parametro threshold determina l'intensità minima del gradiente e il parametro sigma è la deviazione standard (DS) di un prefiltro Gauss per rimuovere il rumore ad alta frequenza. Per l'estrazione di linee da un rilevatore di bordi, Earth Engine implementa la trasformazione di Hough (Duda e Hart 1972). Proseguendo con l'esempio precedente, estrai le linee dal rilevatore Canny con:

Editor di codice (JavaScript)

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

Un altro algoritmo specializzato in Earth Engine è zeroCrossing(). Un passaggio per zero è definito come qualsiasi pixel in cui il pixel a destra, in basso o diagonale in basso a destra ha il segno opposto. Se uno di questi pixel è di segno opposto, il pixel corrente è impostato su 1 (passaggio per zero); in caso contrario, è impostato su zero. Per rilevare i bordi, l'algoritmo dei punti di passaggio per zero può essere applicato a una stima della seconda derivata dell'immagine. Di seguito viene mostrato l'utilizzo di zeroCrossing() per il rilevamento dei bordi:

Editor di codice (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');

L'output dei punti di passaggio per zero per un'area vicino all'aeroporto di San Francisco, in California, dovrebbe avere un aspetto simile alla Figura 1.

zero crossings SFO
Figura 1. Output dei punti di passaggio a zero (rosso) con la banda pancromatica di Landsat 8 sullo sfondo per un'area vicino all'aeroporto di San Francisco, in California (a destra).