Introduzione a Matlab Operazioni di Base & Edge Detection Fondamenti di Visione Artificiale a.a. 25/26 2/5/6 Estrazione dei Contorni
Lezione V: indice Filtri e Kernel Line Detection Edge Detection Edge Detection e Rumore Esercizi 2/5/6 Estrazione dei Contorni 2
Definizione di un filtro: Kernel Ciascun filtro è definito dal Kernel corrispondente. Un kernel è una matrice 3 3 o 5 5 di valori reali o interi. Un filtro è applicato all immagine attraverso una operazione di convoluzione. 2/5/6 Estrazione dei Contorni 3
Convoluzione il filtro legge successivamente da sinistra a destra e dall'alto verso il basso tutti i pixel dell'area di azione del kernel. Moltiplica il valore di ciascuno per i corrispondenti valori del kernel poi somma i risultati: (*)+(5*)+(5*)*(*)+(*) +(*)+(*)+(*)+(*)+(*) = 5. 2/5/6 Estrazione dei Contorni 4
Operatori differenziali Ricerca di discontinuità (un cambiamento brusco di valore) Il problema viene affrontato tramite l'analisi della derivata In generale il problema della differenziazione risulta mal posto Un problema è ben posto se la sua soluzione: Esiste È unica Dipende con continuità dai dati iniziali Estrazione dei Contorni
Operatori differenziali Nel continuo una regione di transizione viene evidenziata dall'andamento della derivata prima Dovendo scegliere un punto preciso si può prendere il massimo (minimo) della derivata prima o lo zero (punto di attraversamento dell'asse x) della derivata seconda Estrazione dei Contorni
Operatori differenziali f(x) è l'intensità dell'immagine Estrazione dei Contorni
Derivata discreta La derivata può essere approssimata tramite una differenza Lo stesso approccio vale per la derivata seconda In uno spazio bidimensionale al posto della derivata si ha il gradiente (si noti che il gradiente è un vettore) Estrazione dei Contorni
Approssimazioni del gradiente Il gradiente è un vettore (ha due componenti) Gli operatori differenziali nel discreto sono realizzati tramite maschere a somma nulla: l'applicazione a una regione uniforme deve dare risultato zero Estrazione dei Contorni
Operatore di Roberts È la soluzione più semplice Si sfruttano due maschere M e M 2 per ottenere due componenti ortogonali del gradiente G =M *I,G 2 =M 2 *I È molto sensibile al rumore Il modulo del gradiente risulta: G m = sqrt(g 2 +G 22 ) la fase: G φ = arctan(g 2 / G )+π/4 - - Estrazione dei Contorni
Operatore isotropico Si sfruttano due maschere M x e M y per ottenere le due componenti ortogonali del gradiente G x =M x *I,G y =M y *I Il modulo del gradiente risulta: G m = sqrt(g x2 +G y2 ) la fase: G φ = arctan(g y /G x ) In C e Java: phi = atan2(g y,g x ) - - 2 - - 2-2 2 - Estrazione dei Contorni
Operatore di Sobel Per evitare i problemi di calcolo con i numeri reali, l'operatore isotropico viene normalmente approssimato: Prewitt - - - - - - Sobel - -2-2 - 2-2 - Estrazione dei Contorni
Operatore Laplaciano Una alternativa al gradiente è lo studio della derivata seconda (laplaciano) tende a formare contorni chiusi lo spessore dei bordi rilevati tipicamente è di un solo pixel Il principale problema dell operatore laplaciano è l estrema sensibilità al rumore -4 2/5/6 Estrazione dei Contorni 3
Line Detection A = double(imread( Linee.jpg )); h = [ ; ; - - -]; h2 = [ -; -; -]; B = conv2(a, h); B2 = conv2(a, h2); % linee orizzontali % linee verticali % convoluzione bidimensionale % convoluzione bidimensionale subplot(2,2,); hold on; imshow(uint8(a)); subplot(2,2,2); hold on; imshow(uint8(b)); subplot(2,2,3); hold on; imshow(uint8(b2)); 2/5/6 Estrazione dei Contorni 4
Line Detection (Output) 2/5/6 Estrazione dei Contorni 5
Line Detection A = imread( linee.jpg ); A2 = imread( linee2.jpg ); h = [ ; ; - - -]; h2 = [ -; -; - ]; B = conv2(a, h); B2 = conv2(a, h2); B3 = conv2(a2, h); B4 = conv2(a2, h2); % linee orizzontali % linee verticali subplot(3,2,); hold on; imshow(uint8(a)); subplot(3,2,2); imshow(uint8(a2)); subplot(3,2,3); imshow(uint8(b)); subplot(3,2,4); imshow(uint8(b3)); subplot(3,2,5); imshow(uint8(b2)); subplot(3,2,6); imshow(uint8(b4)); 2/5/6 Estrazione dei Contorni 6
Line Detection (Output) 2/5/6 Estrazione dei Contorni 7
Edge Detection () La funzione in matlab per l edge detection è: BW = edge(i, filter',thresh,direction) I filtri a disposizione sono: Sobel Prewitt Roberts Log Zerocross canny 2/5/6 Estrazione dei Contorni 8
Edge Detection A = imread( scale.jpg ); B = edge(a,'sobel'); B2 = edge(a, prewitt'); B3 = edge(a, roberts'); B4 = edge(a, log'); B5 = edge(a, zerocross'); B6 = edge(a, canny'); figure(); imshow(uint8(a)); xlabel( original ); figure(2); imshow(uint8(b)); xlabel( sobel ); figure(3); imshow(uint8(b2)); xlabel( prewitt ); figure(4); imshow(uint8(b3)); xlabel( roberts ); figure(5); imshow(uint8(b4)); xlabel( log ); figure(6); imshow(uint8(b5)); xlabel( zerocross ); figure(7); imshow(uint8(b6)); xlabel( canny ); 2/5/6 Estrazione dei Contorni 9
Edge Detection (Output) Sobel Canny Prewitt Original Log Zerocross 2/5/6 Estrazione dei Contorni 2
Edge Detection % Estrazione dei contorni close all; clear all; A = imread('scale.jpg'); figure; imshow(uint8(a)); A = double(a); B = filtro_laplaciano(a); figure; imshow(uint8(b)); C = filtro_prewitt(a); figure; imshow(uint8(c)); D = filtro_sobel(a); figure; imshow(uint8(d)); E = filtro_canny(a,.); figure; imshow(uint8(e), [ ]); 2/5/6 Estrazione dei Contorni 2
Robert Cross A = imread( libri_noise.jpg ); h = [ ; - -]; h2 = [ ; ; - ; -]; h3 = [ ; ; ; - ; - ; -; ]; B = uint8(conv2(a,h)); B2 = uint8(conv2(a,h2)); B3 = uint8(conv2(a,h3)); figure(); imshow(a); xlabel( original ); figure(2); imshow(b); xlabel( 2x2 ); figure(3); imshow(b2); xlabel( 3x3 ); figure(4); imshow(b3); xlabel( 4x4 ); 2/5/6 Estrazione dei Contorni 22
Robert Cross 2/5/6 Estrazione dei Contorni 23
Edge Detection in presenza di rumore % Estrazione dei contorni con rumore A = imread('libri_noise.jpg'); B = filtro_sobel(a); B2 = filtro_prewitt(a); B3 = filtro_laplaciano(a); B4 = filtro_canny(a,.); figure(); imshow(uint8(a)); xlabel('original'); figure(2); imshow(uint8(b)); xlabel('prewitt'); figure(3); imshow(uint8(b2)); xlabel('laplaciano'); figure(4); imshow(uint8(b4), [ ]); xlabel('canny'); 2/5/6 Estrazione dei Contorni 24
Edge Detection in presenza di rumore Prewitt Canny Original Sobel Laplaciano 2/5/6 Estrazione dei Contorni 25
Edge Detection in presenza di rumore (Sobel) 3x3 5x5 2/5/6 Estrazione dei Contorni 26
Edge Detection in presenza di rumore (Prewitt) 3x3 5x5 2/5/6 Estrazione dei Contorni 27
Edge Detection in presenza di rumore (Laplaciano) 3x3 5x5 2/5/6 Estrazione dei Contorni 28
Edge Detection in presenza di rumore (Canny) 3x3 5x5 2/5/6 Estrazione dei Contorni 29
Esercizio I Caricare l immagine mappa.jpeg. Trovare il migliore fra i filtri per l edge detection in modo da mettere in evidenza i confini. 2/5/6 Estrazione dei Contorni 3
Esercizio II Caricare l immagine oggetto.jpeg ed estrarre il contorno, limitando le imperfezioni. 2/5/6 Estrazione dei Contorni 3
Soluzione () % ESERCIZIO II - Soluzione I A = imread('oggetto.jpg'); subplot(2,2,); hold on; imshow(uint8(a)); xlabel('originale'); %approccio diretto B = filtro_canny(a,.5); subplot(2,2,2); imshow(uint8(b)); xlabel('metodo diretto'); 2/5/6 Estrazione dei Contorni 32
Soluzione (2) % ESERCIZIO II - Soluzione II (con raffinamento) %approccio con raffinamento B = filtro_canny(a,.5); subplot(2,2,3); imshow(uint8(b)); xlabel( senza smoothing'); %approccio con raffinamento B = A; for i=:5 B = filtro_gaussiano(b, 4); end C = filtro_canny(b,.5); subplot(2,2,4); imshow(uint8(c)); xlabel('con smoothing e cambio di soglia'); 2/5/6 Estrazione dei Contorni 33