Il rilevamento dei bordi è una tecnica di analisi delle immagini essenziale quando qualcuno è interessato a riconoscere gli oggetti secondo i loro contorni ed è anche considerato un passaggio essenziale nel recupero delle informazioni dalle immagini.
Ad esempio, caratteristiche importanti come linee e curve possono essere estratte utilizzando il rilevamento dei bordi, che vengono quindi normalmente utilizzati da computer di livello superiore o da algoritmi di elaborazione delle immagini. Un buon algoritmo di rilevamento dei bordi evidenzia le posizioni dei bordi principali in un'immagine, ignorando allo stesso tempo i falsi bordi causati dal rumore.
Ma quali sono i bordi comunque? I bordi sono funzioni di immagine che possono essere utilizzate per stimare e analizzare la struttura degli oggetti in un'immagine. Rappresentano cambiamenti locali significativi avvenuti nell'intensità dell'immagine (ad esempio il valore del pixel). I bordi si verificano normalmente sul confine tra due diverse regioni nell'immagine.
In questo tutorial, descriverò l'algoritmo del rivelatore di bordo Canny e come possiamo implementarlo in Python.
L'algoritmo di rivelatore di bordo Canny prende il nome dal suo inventore, John F. Canny, che ha inventato l'algoritmo nel 1986. Il rilevatore di bordo Canny normalmente acquisisce un'immagine in scala di grigi come input e produce un'immagine che mostra la discontinuità di intensità come output (cioè i bordi).
Non voglio fare matematica qui, ma descriverò cosa sta succedendo dietro le quinte nell'algoritmo del rivelatore di bordo Canny da un punto di vista di alto livello.
La prima cosa che fa il rilevatore di bordo Canny è che usa la convoluzione gaussiana per uniformare l'immagine in ingresso e rimuovere il rumore. Un primo operatore derivativo viene quindi applicato all'immagine livellata per evidenziare quelle regioni dell'immagine con prime derivate spaziali elevate.
L'algoritmo quindi trova sia la magnitudine sia la direzione del gradiente calcolando la derivata x e la derivata y, specialmente dal momento che conoscere la direzione del gradiente ci consente effettivamente di trovare la direzione dei bordi.
L'algoritmo esegue quindi ciò che viene chiamato soppressione non massimale, dove traccia lungo la parte superiore delle creste che si ergono dai bordi e imposta quei pixel che non sono sulla cima superiore a zero, producendo infine una linea sottile nel risultato.
In altre parole, controlliamo se il gradiente calcolato nel passaggio precedente è considerato il massimo tra i punti vicini che si trovano in entrambe le direzioni positive e negative del gradiente. Se il gradiente era il massimo, è considerato come parte del bordo e viceversa.
Il processo di monitoraggio di cui sopra è controllato da due soglie, t1
e t2
, così t1> t2
, denominato soglia di isteresi.Il tracciamento inizia in un punto della cresta più alto di t1
, e poi continua in entrambe le direzioni da quel punto fino a quando l'altezza della cresta diventa inferiore a t2
.
Quindi, in sostanza, ciò che accade qui è che selezioniamo tutti i punti di bordo che sono al di sopra della soglia superiore t1
, e poi indagare se ci sono vicini di questi punti che sono considerati al di sotto della soglia superiore t1
e sopra la soglia inferiore t2
. In questo caso, tali vicini sarebbero parte del vantaggio.
Quindi, il larghezza del kernel gaussiano utilizzato per uniformare l'immagine di input e il t1 (superiore e t2 (inferiore) le soglie utilizzate dal tracker, sono i parametri che determinano l'effetto del rivelatore di bordo canny.
In questa sezione, descriverò due modi in cui possiamo implementare il rilevatore di bordo Canny. Un modo usa il scikit-image
libreria, e l'altro usa il OpenCV
biblioteca.
scikit-image
Se non lo hai scikit-image
già installato sulla tua macchina, vai avanti e installalo seguendo le istruzioni mostrate nella pagina di installazione di scikit-image.
Mentre sto usando un Ubuntu
macchina, ho semplicemente dovuto eseguire il seguente comando nel mio terminale per far funzionare la libreria:
sudo apt-get install python-skimage
Il scikit-image
la biblioteca ha un Canny ()
funzione che possiamo usare per applicare il rilevatore di bordo Canny sulla nostra immagine. Si noti che la funzione fa parte del caratteristica
modulo.
Prima di andare avanti, usiamo un'immagine giocattolo per sperimentare. Puoi comunque usare qualsiasi immagine. Utilizzerò l'immagine boat.png mostrata di seguito (fai clic sul link per scaricare l'immagine):
Senza ulteriori indugi, vediamo come possiamo rilevare i bordi nell'immagine sopra (cioè la barca) usando il rilevatore di bordo Canny. Ricorda che la nostra immagine deve essere in scala di grigi. Dato che la nostra immagine è già in scala di grigi, non è necessario fare nulla a questo punto, come la conversione dell'immagine da colore a scala di grigi. La sceneggiatura del rilevatore di bordo Canny ha il seguente aspetto:
da skimage import io da skimage import feature im = io.imread ('boat.png') edges = feature.canny (im) io.imshow (edges) io.show ()
Quindi, come puoi vedere, prima leggiamo la nostra immagine, boat.png
. Dopo ciò, applichiamo il Canny ()
funzione sull'immagine (non ho passato nessun parametro personalizzato, tranne la nostra immagine, e l'ho lasciato ai valori predefiniti della funzione). Infine, mostriamo il nostro risultato che mostra i bordi rilevati. Il risultato dello script sopra appare come segue:
Puoi giocare con i parametri per ottenere risultati diversi su come vengono rilevati i bordi. Ma il risultato sembra bello con quei bordi rilevati, non è vero??!
OpenCV
In questa sezione, vedremo come possiamo usare OpenCV
per applicare il rilevatore di bordo Canny sulla nostra immagine dell'imbarcazione. Se non hai ancora installato OpenCV, vai avanti e installalo. Puoi controllare i seguenti articoli su come puoi installare OpenCV
sulla tua macchina. Ho incluso diversi articoli per diversi sistemi operativi:
Come con il scikit-image
biblioteca, OpenCV
ha anche una funzione chiamata Canny ()
per applicare l'algoritmo del rilevatore di bordo Canny sull'immagine. Il seguente script mostra come possiamo usare OpenCV
per trovare i bordi nella nostra immagine:
import cv2 import matplotlib.pyplot as plt im = cv2.imread ('boat.png') edges = cv2.Canny (im, 25,255, L2gradient = False) plt.imshow (edges, cmap = 'gray') plt.show ( )
Si noti che ho passato quanto segue come argomenti al Canny ()
funzione:
sono
: nome dell'immaginesoglia inferiore
: 25soglia superiore
: 255L2gradient = False
: questo significa che viene utilizzata la norma L1. Se impostato su Vero
, verrà utilizzata la norma L2.Il matplotlib
la libreria è stata quindi utilizzata per tracciare i risultati. Per ulteriori informazioni su questa libreria, consulta il mio tutorial: Introduzione alla libreria Matplotlib di Python.
Il risultato dello script di cui sopra è il seguente:
In questo tutorial, abbiamo imparato a conoscere il rilevatore di bordo Canny e ho visto come scikit-image
e OpenCV
le librerie ci consentono di implementare facilmente questo rilevatore con poche righe di codice.