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');