L`algoritmo di Canny
Transcript
L`algoritmo di Canny
L’algoritmo di Canny R. Epifania D. Sili L. Pellegrini L’algoritmo di Canny L’algoritmo di Canny è un edge detector, ovvero un operatore che, lavorando sulle immagini, è in grado di riconoscere i bordi dei soggetti rappresentati. In particolare, prende in input un’immagine a toni di grigio e produce in output un’immagine che mostra la posizione delle zone con intensità discontinua, cioè i bordi. L’algoritmo di Canny Molto spesso i bordi nelle immagini corrispondono agli oggetti che vi sono rappresentati. Nel passaggio da una zona all’altra, individuate dal bordo, si nota una variazione rapida d’intensità luminosa. L'algoritmo proposto da Canny si basa su tre criteri per il riconoscimento dei punti di bordo: • tasso d'errore basso: tutti i bordi devono essere trovati con alta probabilità evitando risposte spurie; • buona localizzazione: la distanza tra il bordo rilevato e il bordo vero deve essere minima; • unicità della risposta per bordo: ogni bordo reale deve generare un'unica risposta. Per fare ciò, si seguono 4 step principali: – Riduzione del rumore; – Ricerca del gradiente della luminosità di un'immagine; – Soppressione dei non-massimi; – Individuazione dei contorni mediante sogliatura con isteresi; Riduzione del rumore Prima di iniziare l'elaborazione, l'immagine viene sottoposta a convoluzione con un filtro gaussiano. Questo perché una data immagine è corrotta da rumore di acquisizione. Perciò bisogna cercare i bordi che sono generati da elementi della scena, evitando quelli generati da rumore. Il risultato è un'immagine con una leggera "sfocatura" gaussiana, in cui nessun singolo pixel è affetto da disturbi di livello significativo. Riduzione del rumore In Matlab esiste una funzione in grado di creare un filtro gaussiano: H = FSPECIAL('gaussian',[3 3],sig) Restituisce un filtro passabasso gaussiano di dimensioni 3x3 e con deviazione standard pari a sigma. Una volta creato il filtro si effettua la convoluzione con la matrice I dell’immagine. Il comando: I = CONV2(I, H) effettua la convoluzione in 2-D delle due matrici. Ricerca del gradiente della luminosità di un'immagine Il secondo step, prevede il calcolo del gradiente (in direzione e modulo) della matrice I ottenuta al passo precedente. Per il calcolo del gradiente si procede con la funzione [Ix,Iy] = GRADIENT(I) restituisce il valore numerico del gradiente della matrice I. In particolare, Ix corrisponde a dI/dx (direzione orizzontale) e Iy a dI/dy (direzione verticale). Per il calcolo del modulo: M = sqrt(Ix.^2+Iy.^2); Per il calcolo del gradiente: D=atan2(Iy,Ix); * Abbiamo così ottenuto informazioni sul gradiente e quindi sul valore dell'intensità luminosa in ciascun punto dell'immagine. *Atan2 è Four quadrant-inverse tangent. Restituisce un valore compreso tra -π e +π Soppressione dei non-massimi Una forte intensità del gradiente, indica una forte probabilità della presenza di un contorno. Tuttavia, questa indicazione non è sufficiente a decidere se un punto corrisponde oppure no ad un contorno. Solo i punti corrispondenti a dei massimi locali sono considerati come appartenenti ad un contorno, e saranno presi in considerazione dai successivi step di elaborazione. Dato che l’immagine è assimilabile ad una griglia, è possibile approssimare in ogni punto, la direzione del gradiente al valore più vicino tra {0, π/4, π/2, 3π/4} che corrispondono alle direzioni orizzontale, verticale e diagonali. Per la ricerca dei massimi locali, per ogni punto bisogna quindi individuare la direzione del gradiente e confrontare il modulo nel punto in esame con i valori dei punti vicini giacenti sulla stessa direzione del gradiente: se M(i,j) non e un massimo locale lungo la direzione perpendicolare a D(i,j), ponga M(i,j)=0; Soppressione dei non-massimi for i=2:n-1 for j=2:m-1 if D(i,j) == 0 if M(i,j)<= M(i,j-1) || M(i,j) <= M(i,j+1) MM(i,j)=0; end elseif D(i,j) == pi/4 if M(i,j)<= M(i+1,j-1) || M(i,j) <= M(i-1,j+1) MM(i,j)=0; end elseif D(i,j) == pi/2 if M(i,j)<= M(i-1,j) || M(i,j) <= M(i+1,j) MM(i,j)=0; end elseif D(i,j) == 3*pi/4 if M(i,j)<= M(i-1,j-1) || M(i,j) <= M(i+1,j+1) MM(i,j)=0; end end end end Sogliatura con isteresi Al termine della fase di ricerca dei massimi locali, l’immagine risultante contiene valori a livelli di grigio che rappresentano possibili pixel di bordo. C’è quindi bisogno di una sogliatura per decidere quali pixel rappresentino effettivamente un bordo. Vengono definite due soglie T1 > T2. Ogni pixel avente livello di grigio ≥ T1 viene immediatamente marcato come pixel di bordo. Vengono inoltre marcati come di bordo tutti i pixels connessi al primo e aventi livelli di grigio ≥ T2. L'uso di due soglie con isteresi garantisce una maggior flessibilità rispetto alla soglia singola. Una soglia settata ad un valore troppo alto può provocare la perdita di informazioni significative, mentre una soglia settata ad una valore troppo basso può far sì che informazioni irrilevanti - ad esempio semplici disturbi - possano essere interpretate come elementi importanti dell'immagine. Risultato Finale Immagine originale Sogliatura effettuata con T1=10 e T2=5 Confronto dei risultati con valori di soglia diversi Sogliatura effettuata con T1=1 e T2=0.5 Sogliatura effettuata con T1=50 e T2=25 La funzione Edge In matlab esiste una funzione in grado di effettuare un elaborazione del genere. A=edge(I, 'canny');