Corso di Multimedia A.A 2013/2014 Un immagine è rappresentata da una funzione bidimensionale f(x,y). Il piano XY in cui stanno le coordinate dell’immagine è detto DOMINIO SPAZIALE e le variabili x,y sono dette variabili spaziali o coordinate spaziali. Tutte le tecniche di elaborazione dell’immagine che illustreremo (edge detection) vengono implementate nel dominio spaziale, che, quindi, altro non è che il piano stesso che contiene i pixel di un’immagine; esse, infatti, operano direttamente sui pixel di un’immagine. Una linea può essere vista come un segmento di edge in cui l’intensità dello sfondo su entrambi i lati della linea è maggiore o minore dell’intensità dei pixel della linea. Gli individuatori di edge (edge detection) sono metodi di elaborazione locale progettati per individuare i pixel della linea. Gli strumenti che permettono di individuare le brusche variazioni locali di intensità sono le derivate prima e seconda. In particolare la derivata prima produce edge spessi, mentre la derivata seconda evidenzia meglio i cambiamenti bruschi e quindi mette in rilievo i dettagli sottili (incluso il rumore). Il gradiente viene utilizzato per definire l'intensità e la direzione di un edge in un certo punto (x,y). Tutto ciò è possibile perché il gradiente è un vettore bidimensionale che ha la proprietà geometrica di puntare nella direzione di massima variazione di f nel punto (x,y). Il gradiente e' definito: La direzione del gradiente è data dall’angolo: calcolato rispetto all’asse x. La direzione di un edge in un punto qualsiasi (x, y) è ortogonale alla direzione di α(x,y) del vettore gradiente in quel punto. I tre passi fondamentali per individuare gli edge sono: APPLICARE LO SMOOTHING ALL'IMMAGINE PER RIDURRE IL RUMORE PRESENTE INDIVIDUARE I POTENZIALI PUNTI DI EDGE LOCALIZZARE GLI EDGE, CIOÈ SELEZIONARE TRA I PUNTI CANDIDATI QUELLI CHE LO SONO VERAMENTE L’individuazione dei bordi è largamente utilizzata quando si vuole dividere l’immagine in aree corrispondente a oggetti differenti. Rappresentare un immagine attraverso i suoi bordi permette che la quantità di dati da memorizzare è ridotta significativamente mentre la maggior parte delle informazioni vengono comunque mantenute. L’individuazione dei bordi costituisce uno stadio preliminare nell’analisi delle immagini. Le tecniche utilizzate per questo scopo sono: Esse sono definite avanzate in quanto tengono conto come il rumore e la natura degli edge stessi. di fattori Marr e Hildreth intuirono che le variazioni di intensità sono dipendenti dalla scala dell'immagine e quindi la loro individuazione richiede l'uso di operatori di dimensioni diverse. un cambiamento di intensità improvviso da origine a un picco o lungo la derivata prima o a uno zero crossing nella derivata seconda. Quindi le caratteristiche principali di un operatore utilizzato per l'individuazione degli edge dovrebbero essere: essere un operatore differenziale capace di calcolare un'approssimazione delle derivate prima e seconda in ogni punto dell'immagine poter essere regolato per agire a ogni scala selezionata, in modo tale che gli operatori più grandi possano essere utilizzati per individuare gli edge sfocati, mentre gli operatori più piccoli per individuare i dettagli più piccoli scarsamente visibili. Marr e Hildreth intuirono che il miglior operatore che rispettasse queste condizioni fosse il filtro ∇ 2G dove: ∂2 ∂2 + 2 2 ∂x ∂y ∇ : è l’operatore laplaciano 2 G: è la funzione gaussiana 2-D G ( x, y ) = e − x2 + y2 2σ 2 con deviazione standard σ (a volte detto costante di spazio). Mettendo insieme i due termini si ha come espressione finale: ∇ 2 G ( x, y ) = x + y − 2σ 2 2 σ 4 Questa espressione è detta il Laplaciano del Gaussiano ( LoG ) o, per via della sua forma, operatore a sombrero. 2 − e x2 + y2 2σ 2 Mostriamo una maschera 5x5 che ne approssima la forma 0 0 -1 0 0 0 -1 -2 -1 0 -1 -2 16 -2 -1 0 -1 -2 -1 0 0 0 -1 0 0 (nella pratica si utilizzerebbe il negativo di questa maschera). Questa approssimazione non è unica. Il suo scopo è quello di catturare la forma essenziale della funzione LoG. Ci sono due aspetti fondamentali dietro la scelta dell’operatore ∇2G(x,y): 1. la parte gaussiana dell'operatore sfoca l'immagine, quindi riduce il rumore sia nel dominio spaziale che in quello della frequenza ed è quindi meno probabile che vengano introdotti artefatti non presenti nell'immagine originale. 2. il laplaciano ha il vantaggio di essere isotropico, cioè invariante per rotazione, e quindi ha le caratteristiche del sistema visivo umano e risponde in egual modo alle variazioni di intensità in ogni direzione della maschera, senza quindi la necessità di dover utilizzare maschere multiple per calcolare la risposta più forte. L'algoritmo di Marr-Hildreth può essere riassunto nei seguenti passi: filtrare l’immagine di input con un filtro passa basso gaussiano nxn ottenuto dalla funzione gaussiana 2D, cioè: G ( x, y ) = e − x2 + y2 2σ 2 Le dimensioni del filtro discreto LoG nxn dovrebbero essere tali che n sia il più piccolo intero dispari maggiore o uguale a 6σ (l’uso di valori più grandi non influisce più di tanto sul risultato finale). calcolare il laplaciano dell’immagine ottenuta nel passo precedente utilizzando, ad esempio, la seguente maschera 3x3: 1 1 1 1 -8 1 1 1 1 trovare gli zero crossing dell’immagine del passo precedente per determinare le posizioni degli edge. Gli zero crossing sono la caratteristica fondamentale del metodo di individuazione degli edge di Marr-Hildreth. Una conseguenza importante negli utilizzare gli zero crossing per l’individuazione degli edge è che gli edge che ne risultano sono spessi 1 pixel. Questa proprietà semplifica i passaggi successivi come ad esempio il collegamento degli edge (edge linking). Un metodo per trovare gli zero crossing in ogni pixel p dell’immagine filtrata g(x,y) si basa sull’uso di un intorno 3 x 3 centrato in p. Uno zero crossing in p implica la presenza di una delle configurazioni seguenti: Se i valori di g(x,y) vengono confrontati su una linea(un metodo usato comunemente) allora non solo i segni devono essere diversi, ma anche il valore assoluto della loro differenza numerica deve anche superare una data soglia prima di poter dire che p è un pixel di zero crossing. I = imread(‘inserisci-img.jpg'); X = rgb2gray(I); A = edge(X,'log',t,σ); % gli zero crossing utilizzeranno % il metodo dell’intorno 3x3 % con soglia t figure; subplot(1,2,1); imshow(X); title(‘originale’); subplot(1,2,2); imshow(A); title(‘log’); la scelta di σ influisce sul tipo di dettaglio evidenziato σ =0.5 t = 0.1 σ =1 t =0.1 σ=2 t =0.1 Si noti che, se posto il valore della soglia uguale a 0, tutti gli edge formano dei percorsi chiusi. Questo effetto a “spaghetti” è un serio inconveniente di questo metodo quando viene utilizzato come valore soglia lo zero. Si possono evitare tali artefatti utilizzando un valore di soglia positivo t=0 σ=0.5 t=0.1 σ=0.5 t=0.5 σ=0.5 Una procedura a volte utilizzata, per tenere in conto che le variazioni di intensità sono dipendenti dalla scala, è filtrare un’immagine con vari valori di σ. Le mappe di edge di zero crossing che ne risultato vengono poi combinate tenendo solo gli edge che sono comuni a tutte le mappe. Marr e Hildreth notarono che è possibile approssimare il filtro LoG tramite una differenza di gaussiane: con σp> σq Questo metodo può fornisce utili informazioni ma a causa della sua complessità è utilizzato solo come strumento di prototipazione per selezionare un appropriato valore di σ da utilizzare con un filtro singolo. Quindi il valore σ per il LoG dovrebbe essere scelto come nell’equazione che segue in modo tale che Log e Dog abbiano gli stessi zero crossing: σ1 σ 2 σ 1 ln σ = σ 1 − σ 2 σ 2 2 2 2 2 2 2 2 Un approccio analitico è stato invece seguito da John F. Canny nel 1986, che ha studiato in dettaglio il comportamento dell’operatore gradiente applicato ad un contorno rumoroso. Il modello di bordo considerato è un fronte ripido monodimensionale b(x) cui è aggiunto rumore Gaussiano bianco. Si assume che l’individuazione del bordo sia realizzata tramite una convoluzione con un filtro f(x) avente risposta impulsiva h(x) antisimmetrica e nulla al di fuori di un intervallo [-W,W]. Un bordo è individuato da un massimo locale della convoluzione tra l’immagine ed il filtro. Il filtro è scelto sulla base di tre criteri di efficacia definiti da Canny: 1. 2. 3. Buona capacità di individuazione: l’operatore ha una bassa probabilità di non individuare un bordo reale (elevata sensibilità – falsi negativi) ed una bassa probabilità di individuare falsi bordi (elevata specificità – falsi positivi) Buona capacità di localizzazione: i punti evidenziati dall’operatore dovrebbero essere quanto più vicini possibile al centro del bordo reale. Unicità della risposta: l’operatore dovrebbe fornire una sola risposta in corrispondenza di un bordo reale. Ciò che contraddistingue il lavoro di Canny è la capacità di formalizzare matematicamente i tre criteri citati e poi tentare di derivarne alcune soluzioni ottimali. In pratica è difficile(se non impossibile) trovare una soluzione in forma chiusa che soddisfi tutti i criteri precedenti. L’algoritmo di individuazione degli edge di Canny consiste nei seguenti passaggi fondamentali: Sottoporre a smoothing l’immagine di input con un filtro gaussiano. Un problema primario negli algoritmi di riconoscimento dei contorni è dato dalla presenza di rumore nelle immagini non processate, per cui è necessario applicare all’immagine un filtro spaziale, tramite il processo di convoluzione. Lo scopo è rimuovere le alte frequenze su cui il rumore interferisce in maniera più problematica. Calcolare la magnitudo e l’angolo del gradiente. Calcolando il gradiente del risultato e, poi, utilizzando la magnitudo e la direzione del gradiente otteniamo l’intensità e la direzione degli edge in ogni punto. 2 2 M ( x, y ) = gx + g y gx α ( x, y ) = tan g y −1 con gx = ∂ fs/ ∂x e gy = ∂ fs/ ∂y. Applicare la non maxima suppression all’immagine della magnitudo. Dato che è stata generata utilizzando il gradiente, M(x,y) contiene ampie “creste” (detti ridges) attorno ai massimi locali. Il passo successivo è l’assottigliamento di tali valori facendo uso, ad esempio, del metodo non maxima suppression. La non-maximum suppression si ottiene azzerando i valori dei pixel non considerati parte del contorno, cioè i pixel il cui valore di intensità non è maggiore di quello dei pixel adiacenti situati lungo la direzione data dal valore α in quel punto. Il risultato è un’immagine binaria con una linea sottile in corrispondenza dei bordi degli oggetti nell’immagine. 1. 2. 3. • • Utilizzare la doppia soglia e la connettività per individuare e collegare gli edge. Si fissano due soglie TL e TH con TH > TL. Tutti i punti di valore maggiore di TH sono di edge. Tutti i punti di valore compreso fra TH e TL saranno considerati edge solo se è contigui ad un edge Perché la scelta di due soglie? Utilizzando un’unica soglia potremmo avere i seguenti problemi: soglia troppo bassa: ci saranno alcuni falsi edge (detti falsi positivi) soglia troppo alta: allora alcuni punti di edge saranno eliminati (falsi negativi). L’algoritmo di Canny cerca di migliorare questa situazione utilizzando due soglie (thresholding mediante isteresi), scegliendo una soglia bassa TL e una soglia alta TH. I = imread(‘inserisci-img.jpg'); X = rgb2gray(I); C= edge(X,‘canny’,[t1 t2],σ); figure; subplot(1,2,1); imshow(X); title(‘originale’); subplot(1,2,2); imshow(C); title(‘canny); – Alti valori di σ permettono di trovare edge a scale più grandi – Piccoli valori di σ permettono di scovare i dettagli più fini σ = 0.5 σ=1 σ=2 Processo utilizzato per ridurre i falsi punti di edge. Canny suggerì che il rapporto tra le due soglie dovrebbe essere di circa 2 ( o 3) a 1. t1 = 0.1 t2 = 0.2 t1 = 0.2 t2 = 0.4 t1 = 0.01 t2 = 0.5 Insiemi ordinari(crisp) 1 21 70 13 80 20 19 Insiemi ordinari(crisp) 1 21 70 giovani 13 80 20 19 non giovani Insiemi ordinari(crisp) 1 21 70 giovani 13 80 20 19 non giovani una persona di 20 anni è considerata giovane, ma una persona di 20 anni e un secondo non appartiene all’insieme delle persone giovani. Questo problema è tipico degli insiemi crisp e limita l’uso della teoria classica degli insiemi in molte applicazioni pratiche. giovani 1 non giovani 21 13 20 19 80 70 Quello che occorre è una maggiore flessibilità nel concetto di “giovane” cioè, una transizione graduale da giovane a non giovane. Ciò può essere fatto creando dei gradi di “giovinezza”. Possiamo dire in questo modo se una persona è giovane, relativamente giovane, giovane al 50%, non così giovane, e così via. Questo tipo di imprecisioni (FUZZY) sono più in linea con il comportamento degli uomini quando parlano di età in modo indefinito. La teoria degli insiemi fuzzy è stata introdotta da L.A. Zadeh più di 40 anni fa. Come vedremo, gli insiemi fuzzy forniscono un formalismo in grado di trattare informazioni imprecise. Un insieme fuzzy A in Z è caratterizzato da una funzione di appartenenza, µA(z), che associa a ogni elemento di Z un numero reale nell’intervallo [0,1]. Il valore di µA(z) in z rappresenta il grado di appartenenza di z in A. Più vicino è il valore di µA(z) all’unità, più alto è il grado di appartenenza di z ad A e viceversa quando il valore di µA(z) si avvicina allo zero. ATTENZIONE al concetto ‘appartiene a ‘: caso insieme ordinari: un elemento appartiene ad un insieme un elemento non appartiene ad un insieme caso insiemi fuzzy: tutti gli elementi z per cui µA(z) = 1 sono membri a pieno titolo dell’insieme tutti gli elementi z per cui 0<µA(z)<1 appartengono in modo parziale all’insieme tutti gli elementi z per cui µA(z) = 0 non sono membri dell’insieme Insiemi fuzzy (1,1) 1 19 13 (19,1) 21 (13,1) 80 22 20 (21,0.9) (20,1) (80,0) (22,0.8) 90 (90,0) Quindi, un insieme fuzzy è una coppia ordinata di valori di z e una funzione di appartenenza corrispondente che assegna un grado di appartenenza a ogni valore di z. In simboli: A = {z, µA(z) | z ∈ Z} Definizioni ‘Intersezione’: l’intersezione (AND) di due insiemi fuzzy A e B, denotata da A AND B, è un insieme fuzzy I con funzione di appartenenza per tutti i valori di z ∈ Z. Anche se la logica e la probabilità operano sullo stesso intervallo di valori [0,1] è importante fare la distinzione tra i due concetti. PROBABILITA’ => c’è il 50% di probabilità che una persona sia giovane significa che semplicemente abbiamo il 50% delle probabilità di sapere a quale insieme appartiene. LOGICA FUZZY => il grado di appartenenza di una persona all’insieme delle persone giovani è di 0.5, significa che una persona è giovane fino ad un certo grado (0,5) o equivalentemente che questa è una persona giovane “media”; non veramente giovane ma non troppo vicina a essere non giovane. In altre parole la logica fuzzy non è affatto probabilistica ed è legata soltanto ai gradi di appartenenza a un insieme. Valori d’input FUZZIFICAZIONE Rendere fuzzy gli input scalare -> valore fuzzy VALUTAZIONE IN BASE ALLA REGOLA output fuzzy DEFUZZIFICAZIONE valore fuzzy -> Scalare Valori d’output Quando si applicano gli insiemi fuzzy al filtraggio spaziale, l’approccio di base è quello di definire le proprietà della regione dell’intorno locale che ‘catturi’ l’essenza di quello che ci si aspetta che i filtri individuano. Possiamo sviluppare un algoritmo di estrazione dei contorni su un semplice concetto fuzzy: se un pixel appartiene a una regione uniforme rendilo bianco; altrimenti rendilo nero, dove bianco e nero sono insiemi fuzzy. Definiamo, per ogni regione 3x3, le differenze tra il pixel centrale (chiamato z5) e ognuno dei vicini formando la sub-immagine di dimensioni 3 × 3, dove di indica la differenza di intensità tra il vicino iesimo e il punto centrale (di = zi - z5, dove i valori z sono valori di intensità). sottoporre a smoothing l’immagine di input con un filtro gaussiano. per ogni pixel dell’immagine creare un kernel 3x3 tramite l’utilizzo della seguente formula: di = zi – z5 Si noti che abbiamo usato le differenze di intensità dei 4 vicini e il punto centrale, è possibile tramite un’estenzione diretta utilizzare gli 8 vicini. rendere gli input di fuzzy assegnando il grado di appartenenza all’insieme zero. applicare le formule di Fuzzy: R1: SE d2 è zero AND d6 è zero, ALLORA z5 R2: SE d6 è zero AND d8 è zero, ALLORA z5 R3: SE d8 è zero AND d4 è zero, ALLORA z5 R4: SE d4 è zero AND d2 è zero, ALLORA z5 R5: altrimenti z5 è nero. calcolando l’output dell’insieme fuzzy bianco. è è è è bianco bianco bianco bianco applicare la defuzzificazione per tornare ai valori in scala di grigio. X = imread(‘immagine'); A3 = rgb2gray(X); %scelgo l'immagine %la converto a scala di grigio %applico il filtro gaussiano h = fspecial('gaussian',[3 3],sigma); A3 = imfilter(A3,h,'replicate'); F = double(A3); %creo la matrice F che sarà for i=2:size(A3,1)-1 % formata dai gradi di appartenenza for j=2:size(A3,2)-1 % dei pixel all'insieme fuzzy zero z5 = double(A3(i,j)); k = double(A3(i-1:i+1,j-1:j+1)); %creo il kernel temporaneo per la for n1 = 1:3 %creazione delle differenze d'intensità for n2 = 1:3 k(n1,n2) = k(n1,n2)-z5; % creo il kernel con le differenze di intensità end end x1 = appartZeros(1,2,k); x2 = appartZeros(2,3,k); if (min(x1,x2) > 0) %Applico la prima regola: SE d2 è zero %AND d6 è zero, ALLORA z5 è bianco % restituisce il grado di appartenenza del % valore k(i,j) all'insieme fuzzy zero % stabilisco il grado all’insieme zero % se il valore è 1 allora appartiene a pieno titolo all'insieme % piena forza if (x1==1 && x2== 1) c1 = 1; else c1 = min(x1,x2); end else c1=0; end %analogamente tramite le altre tre regole ricavo c2,c3 e c4 F(i,j) = assegnaGrado(c1,c2,c3,c4); %effettua una media artimetica per calcolare il grado di appartenenza dell'insieme fuzzy zero end end V = F; for i=2:size(A3,1)-1 for j=2:size(A3,2)-1 % creo la matrice con gli output effettivi %calcolo il baricentro n = 1-F(i,j); % il grado di appartenenza al nero b = F(i,j); % il grado di appartenenza al bianco V(i,j) = round((0*n+255*b) / (n+b)); if( V(i,j) < t ) V1(i,j) = 0; else V1(i,j) = 255; end end end %trasformo l'immagine in binaria INPUT OUTPUT INPUT OUTPUT MARR HILDRETH CANNY FUZZY Implementazione Semplice Complessa Semplice Punto forza Utilizzo degli ZC Doppia sogliatura La semplicità Superiore a tutti gli altri approcci: migliore risultati specialmente in condizioni di rumore; miglioramenti significativi nei dettagli degli edge principali; maggiore rigetto delle caratteristiche irrilevanti nei risultati Estremamente semplice, rilevamento di bordi e dei loro orientamenti Vantaggi Generalmente trovare le posizioni corrette dei bordi I risultati dipendono Svantaggi MARR HILDRETH CANNY FUZZY dalla scelta di σ, T dalla scelta di σ, T1 e T2 dalla scelta di σ, T Calcoli complessi. Maggiore complessità computazionale Dispensiosa dal punto di vista computazione:il processo di fuzzificazione, gli antecedenti di ogni regola, l’implicazione, l’aggregazione e la defuzzificazione deve essere applicato a ogni pixel dell’immagine. Malfunzionamenti agli angoli, nelle curve e dove la funzione dell'intensità livello di grigio varia.