21.06.2014 Views

Intro all'analisi dei principali filtri convolutivi.pdf - SaLUG

Intro all'analisi dei principali filtri convolutivi.pdf - SaLUG

Intro all'analisi dei principali filtri convolutivi.pdf - SaLUG

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Analisi <strong>dei</strong> <strong>principali</strong> <strong>filtri</strong> <strong>convolutivi</strong><br />

Fabio Viola


Immagini e segnali<br />

Lavorando con software di elaborazione delle immagini e' impossibile<br />

non imbattersi in operazioni quali miglioramento, sfocatura, rilevamento<br />

contorni. Queste sono solo alcune delle numerose operazioni realizzabili<br />

con <strong>dei</strong> <strong>filtri</strong> di convoluzione...<br />

La progettazione <strong>dei</strong> <strong>filtri</strong> e' strettamente connessa allo studio di segnali<br />

e sistemi.<br />

Ma cosa c'entrano i segnali e i sistemi in un campo cosi'<br />

apparentemente lontano come la grafica?


Immagini e segnali<br />

Un segnale e' la variazione di una grandezza d'interesse, solitamente<br />

nel tempo. I segnali vengono classificati fra continui e discreti a seconda<br />

che possano assumere tutti i valori in un intervallo (si veda ad esempio la<br />

temperatura di una stanza) o che assumano un numero finito di valori<br />

(consideriamo ad esempio i bit, questi possono assumere valore 0 o 1).<br />

Nel nostro caso la grandezza da studiare e' la quantita' di colore di ogni<br />

pixel ed e' bidimensionale discreto, ma soprattutto la nostra variabile non<br />

e' il tempo... E' lo spazio!<br />

Un sistema e' un dispositivo che, dato un segnale in ingresso lo elabora<br />

e ne fornisce il risultato in uscita. Un sistema e' in genere una<br />

modellazione matematica di un fenomeno fisico. Esistono numerose<br />

classificazioni <strong>dei</strong> sistemi, ma non entreremo nel merito. Ci<br />

accontentiamo di sapere che anche i sistemi possono essere continui o<br />

discreti (o talvolta ibridi).


La convoluzione<br />

I sistemi vengono descritti (ad esempio) tramite la loro risposta<br />

impulsiva, cioe' indicando il modo in cui rispondono all'impulso di Dirac<br />

in ingresso.<br />

Sapendo la risposta impulsiva di un sistema e conoscendo l'espressione<br />

del segnale in ingresso, l'uscita del sistema puo' esser calcolata tramite<br />

l'operazione di convoluzione definita rispettivamente nel continuo e nel<br />

discreto da:<br />

v t=ut ∗h t=∫ −∞<br />

∞<br />

u t h t−= ∫ −∞<br />

∞<br />

u t−ht<br />

v t=ut ∗ht=∑ −∞<br />

∞<br />

u t ht−= ∑ −∞<br />

∞<br />

ut− ht


La convoluzione<br />

Operando con un segnale discreto e bidimensionale, l'immagine in uscita<br />

viene calcolata con la seguente operazione:<br />

M −1<br />

v x , y=ux , y∗h x , y=∑ m=0<br />

N −1<br />

∑ n=0 u m , nhx−m , y−n<br />

Quest'operazione corrisponde a far scorrere una matrice detta kernel<br />

sulla matrice che rappresenta l'immagine e calcolare il nuovo valore di<br />

ogni pixel come sommatoria <strong>dei</strong> prodotti fra un elemento del kernel con il<br />

corrispondente elemento sulla matrice immagine


La convoluzione<br />

Supponiamo di avere una matrice di convoluzione (il kernel) come la<br />

seguente:<br />

0 1 0<br />

1 −5 1<br />

0 1 0<br />

e consideriamo ora un pezzo di una matrice immagine a caso:<br />

<br />

124 112 98 <br />

124 45 29 <br />

110 102 110 <br />

<br />

Il nuovo valore del pixel al centro sara':<br />

0⋅1241⋅1120⋅981⋅12445⋅−51⋅290⋅1101⋅1020⋅110=142


The Gimp e la convoluzione<br />

Per provare nella pratica quanto vedremo<br />

con questa presentazione e' bene prima<br />

dire che The Gimp permette l'inserimento<br />

di una propria matrice di convoluzione da:<br />

Filtri → Generici → Matrice di<br />

Convoluzione


Categorie di <strong>filtri</strong><br />

I <strong>filtri</strong> che si possono ottenere con le matrici di convoluzione sono<br />

innumerevoli, ma i piu' utilizzati possono essere classificati fra le<br />

seguenti categorie:<br />

●<br />

Filtri di Edge Detection<br />

●<br />

Filtri di Rilievo / Basso Rilievo<br />

●<br />

Filtri di Sfocatura<br />

●<br />

Filtri di Sharpening<br />

●<br />

Filtri di Shifting


Edge Detection


Filtri di Edge Detection<br />

I <strong>filtri</strong> di Edge Detection vengono utilizzati per il rilevamento <strong>dei</strong> bordi.<br />

Praticamente tutti si basano su operazioni differenziali, la maggior parte<br />

del primo ordine, meno del secondo.<br />

Gli operatori piu' conosciuti e usati sono:<br />

●<br />

Roberts<br />

●<br />

Prewitt<br />

●<br />

Sobel<br />

●<br />

Kirsch<br />

●<br />

Laplaciano


Roberts<br />

Roberts, Prewitt e Sobel hanno sviluppato delle tecniche di rilevamento<br />

<strong>dei</strong> contorni basate sullo studio della derivata prima o per essere piu'<br />

precisi del gradiente (dato che siamo in due dimensioni).<br />

∇ f x , y= ∂ f x , y<br />

∂ x<br />

, ∂ f x , y <br />

∂ y<br />

Nei tre metodi si riconoscono pero' differenti approssimazioni del<br />

gradiente. Quella proposta da Roberts e':<br />

f x<br />

i , j = f i , j− f i1, j1<br />

f y<br />

i , j= f i1, j− f i , j1


Roberts<br />

Le approssimazioni appena viste ci conducono alle seguenti matrici:<br />

0 0 0<br />

0 0 1<br />

0 −1 0<br />

0 0 0<br />

0 1 0<br />

0 0 −1<br />

..che spiegano come mai questo operatore viene anche detto Roberts'<br />

Cross Operator. Le matrici individuate agiscono lungo le diagonali.<br />

Vediamo il risultato dell'applicazione delle due matrici:


Prewitt<br />

Le matrici proposte da Roberts sono in fin <strong>dei</strong> conti delle matrici 2x2...<br />

Aumentando il numero di elementi coinvolti nello studio della derivata si<br />

aumenta la precisione nell'opera di rilevamento <strong>dei</strong> bordi. Prewitt fa<br />

esattamente questo, proponendo un metodo di approssimazione del<br />

gradiente differente da quello di Roberts:<br />

f x i , j = 1 2<br />

f y i , j= 1 2<br />

[ f i1, j − f i−1, j]<br />

[ f i , j1− f i , j−1]<br />

Supponendo di prendere il gradiente orientato lungo il semiasse positivo<br />

delle x, otteniamo una matrice di convoluzione come la seguente (dalla<br />

quale con rotazioni di 45 gradi otteniamo tutte le altre):<br />

−1 0 1<br />

−1 0 1<br />

−1 0 1


Prewitt<br />

Esempio: con la matrice precedente abbiamo ottenuto il rilevamento <strong>dei</strong><br />

contorni lungo l'asse x, direzione positiva. Si puo' notare come il numero<br />

<strong>dei</strong> contorni rilevati sia maggiore rispetto a quanto fatto dal'operatore<br />

crociato di Roberts.


Sobel<br />

Le matrici costruite da Sobel si basano sullo stesso metodo proposto da<br />

Prewitt, ma introducono un nuovo importante elemento: ai pixel piu' vicini<br />

a quello di applicazione viene attribuito un peso maggiore. Le matrici<br />

cosi' ottenute sono (rispettivamente con angoli pari a 0, 90, 180 e 270<br />

gradi per la prima riga e 45, 135, 225 e 315 per la seconda):<br />

−1 0 1<br />

−2 0 2<br />

−1 0 1<br />

1 2 1<br />

0 0 0<br />

−1 −2 −1<br />

1 0 −1<br />

2 0 −2<br />

1 0 −1<br />

−1 −2 −1<br />

0 0 0<br />

1 2 1<br />

0 1 2<br />

−1 0 1<br />

−2 −1 0<br />

2 1 0<br />

1 0 −1<br />

0 −1 −2<br />

0 −1 −1<br />

1 0 −2<br />

2 1 0<br />

−2 −1 0<br />

−1 0 1<br />

0 1 2


Sobel<br />

Vediamo nella pratica come cambia l'effetto rispetto al metodo di Prewitt:<br />

I bordi sono nettamente piu' nitidi...


Kirsch<br />

L'operatore di Kirsch, meno conosciuto rispetto ai precedenti, non calcola<br />

esplicitamente il gradiente, ma le derivate prime in direzioni specifiche e<br />

approssimando quella con il risultato maggiore si ottiene l'orientazione<br />

del gradiente.<br />

L'approssimazione proposta da Kirsch e' esprimibile come:<br />

7<br />

Dove:<br />

G j , k= Max [∣5S −3T∣]<br />

i =0 i i<br />

S i<br />

= A i<br />

A i1<br />

A i 2<br />

T i<br />

= A i<br />

A i 1<br />

A i 2<br />

A i 3<br />

A i5<br />

A i 5<br />

Si originano matrici come la seguente (che e' diretta lungo il semiasse<br />

positivo delle x):<br />

5 −3 −3<br />

5 0 −3<br />

5 −3 −3


Kirsch<br />

Vediamo nella pratica come cambia l'effetto rispetto al metodo di Sobel:<br />

Aumenta la quantita' di bordi rilevati, ma con essi anche il rumore<br />

catturato (che puo' essere poi pulito con <strong>filtri</strong> di noise cleaning che pero'<br />

sono non lineari!)


Proprieta' ...<br />

I <strong>filtri</strong> analizzati fino a questo momento hanno due caratteristiche:<br />

●<br />

Sono direzionali e per questo non invarianti: questo vuol dire che la<br />

loro applicazione su un'immagine avra' effetti diversi a seconda di come<br />

l'immagine viene ruotata.<br />

●<br />

Hanno somma <strong>dei</strong> coefficienti pari 0, e questo e' il motivo del loro<br />

aspetto prevalenemente nero.


Laplaciano<br />

Il primo filtro invariante che vediamo e' costituito da un'approssimazione<br />

dell'operatore laplaciano che e' definito come:<br />

e approssimato da:<br />

∇ 2 f x , y= ∂2 f x , y<br />

∂2 f x , y<br />

∂ x 2<br />

∂ y 2<br />

ai , j1ai , j−1ai1, j a i−1, j −4 a i , j<br />

da cui ricaviamo:<br />

0 1 0<br />

1 −4 1<br />

0 1 0


Laplaciano<br />

Si puo' notare che il laplaciano agisce in ogni direzione allo stesso modo:


Rilievo e Bassorilievo


Rilievo e Bassorilievo<br />

Gli effetti di rilievo e bassorilievo si ottengono con la sovrapposizione di<br />

matrici di rilevamento <strong>dei</strong> contorni ad una matrice kernel neutra.<br />

Prendiamo ad esempio la matrice di Sobel orientata lungo la bisettrice<br />

direzione nord-est e sovrapponiamola alla matrice neutra:<br />

0 0 0<br />

0 1 0<br />

0 0 0<br />

<br />

0 1 2<br />

−1 0 1<br />

−2 −1 0<br />

=<br />

0 1 2<br />

−1 1 1<br />

−2 −1 0<br />

A seconda della direzione scelta per il gradiente nella matrice di Edge<br />

Detection variera' l'effetto ottenuto. Vediamo cosa succede applicando la<br />

matrice ottenuta alla nostra immagine di esempio...


Rilievo e Bassorilievo


Blurring / Smoothing


Sfocatura<br />

Esistono vari metodi per sfocare un'immagine. Quello piu' intuitivo e' dato<br />

dal filtro cosiddetto N-Box, un altro e' ad esempio il filtro gaussiano.


Filtro N-Box<br />

Si ottiene semplicemente calcolando la media <strong>dei</strong> valori <strong>dei</strong> pixel nel<br />

vicinato del punto di applicazione. Risulta quindi che nel caso di una<br />

maschera 3x3 la matrice avra' il seguente aspetto:<br />

...e produrra' il seguente risultato:<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9


Filtro N-Box<br />

Maggiore e' l'ordine della matrice di sfocatura maggiormente evidente<br />

sara' l'effetto, come dimostra quest'immagine elaborata con una<br />

maschera 5x5 con coefficienti pari a 1/25:


Filtro Gaussiano<br />

Piu' elaborato del filtro N-Box e' il filtro gaussiano che sfrutta la funzione<br />

gaussiana definita da:<br />

La gaussiana ha il seguente aspetto:<br />

g i , j=c⋅e − i 2 j 2<br />

2 2


Filtro Gaussiano<br />

Proprieta' evidente della gaussiana e' quella di dare un peso maggiore<br />

tanto piu' i pixel sono vicini a quello centrale. Il parametro σ definisce la<br />

larghezza della campana, c definisce quanto peso assegnare ai termini.<br />

Un esempio di matrice gaussiana con parametri σ=1 e c=10 e':<br />

3,68 6,06 3,68<br />

6,06 10 6,06<br />

3,68 6,06 3,68<br />

Che produce la seguente sfocatura:


Filtro Gaussiano<br />

Aumentare c aumenta il tasso di sfocatura.<br />

Incrementare σ vuol dire aumentare la larghezza della campana e di<br />

conseguenza aumentare il peso dato ai pixel circostanti.


Sharpening


Sharpening<br />

Lo sharpening e' l'operazione che ci consente di migliorare la qualita'<br />

dell'immagine.<br />

Quest'operazione, anche detta edge crispening, agisce come un filtro<br />

passa alto che fa passare soltanto le alte frequenze spaziali di variazione<br />

del colore.<br />

Anche qui abbiamo a disposizione vari metodi piu' o meno intuitivi:<br />

●<br />

Unsharp masking<br />

●<br />

Laplaciano<br />

●<br />

Laplaciano di Gaussiana


Unsharp Masking<br />

Da quanto appreso in segnali e sistemi sappiamo che lo stesso risultato<br />

di un filtro passa alto si puo' ottenere sottraendo all'immagine originale,<br />

opportunamente amplificata, una sua versione filtrata con un filtro passabasso<br />

(e quindi una versione sfocata):<br />

0 0 0<br />

a⋅0 1 0<br />

0 0 0<br />

−<br />

1<br />

9<br />

1<br />

b⋅<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

1<br />

9<br />

=<br />

−b 1 9<br />

−b 1 9<br />

−b 1 9<br />

−b 1 9<br />

−b 1 9<br />

a−b 1 9 −b 1 9<br />

−b 1 9<br />

−b 1 9<br />

I coefficienti a e b si possono scegliere arbitrariamente a patto di<br />

mantenere la somma degli elementi del kernel pari a 1 per non variare il<br />

livello di luminosita' dell'immagine.


Unsharp Masking


Sharpening con Laplaciano<br />

In questo filtro si sfrutta la derivata seconda (o in due dimensioni il<br />

laplaciano) per rendere l'andamento <strong>dei</strong> contorni piu' simile a quello<br />

ideale (cioe' netto) e diverso da quello reale (dove i colori vaiano in<br />

maniera graduale).<br />

0 0 0<br />

0 1 0<br />

0 0 0<br />

−<br />

0 1 0<br />

1 −4 1<br />

0 1 0<br />

=<br />

0 −1 0<br />

−1 5 −1<br />

0 −1 0<br />

Come tutti i <strong>filtri</strong> passa alto non elimina il rumore e in alcuni casi lo<br />

accentua. Nella nostra immagine il rumore e' leggermente aumentato<br />

con l'applicazione di un filtro di sharpening laplaciano...


Sharpening con Laplaciano


Shifting


Filtri di Shifting<br />

I <strong>filtri</strong> di shifting sono i piu' semplici ed intuitivi. Come dice il termine<br />

servono a shiftare, spostare dunque l'immagine.<br />

Generalmente un filtro di shifting ha quest'aspetto:<br />

0 0 0<br />

1 0 0<br />

0 0 0


Applicazioni pratiche


Plugin di esempio<br />

Per mettere in pratica quanto imparato con lo studio delle matrici di<br />

convoluzione sono stati realizzati due script-fu per il software di grafica<br />

raster The Gimp.<br />

Entrambe i plugin sono stati scritti in Scheme, linguaggio basato su Lisp<br />

supportato nativamente da The Gimp sin dalla prima versione.


Plugin di esempio: warholize<br />

Il primo plugin e' warholize che data un'immagine la trasforma creando<br />

un'opera in stile pop-art.<br />

Per fare cio' ci si costruiscono quattro livelli ognuno di un quarto dell'area<br />

dell'immagine e ci si avvale di matrici di Edge Detection (di Prewitt o<br />

Sobel) applicate su diversi canali. Per far si che il risultato sia migliore<br />

pero' si applica prima una matrice di sharpening, di modo tale che il<br />

rilevamento <strong>dei</strong> contorni agisca in maniera piu' efficace.


Plugin di esempio: warholize<br />

Guardiamo alcuni esempi:<br />

Immagine originale senza Edge Detection Sobel Edge Detection


Plugin di esempio: warholize<br />

Guardiamo alcuni esempi:<br />

i<br />

Prewitt Edge Detection<br />

Prewitt Edge Detection, w=5<br />

Sobel Edge Detection, w=5


Plugin di esempio: warholize<br />

Con warholize l'utente non soltanto puo' decidere se applicare o meno<br />

un operatore di Edge Detection, ma puo' scegliere quale utilizzare (fra<br />

Prewitt e Sobel), in che direzione applicarlo (Nord, Sud, Ovest, Est,<br />

Tutte), che peso dare ad ogni elemento nella matrice.


Plugin di esempio: shifting blur<br />

Shifting Blur invece implementa una particolare sfocatura (o per meglio<br />

dire disturbo) basata sulle matrici di convoluzione di shifting.<br />

Ogni canale viene sottoposto ad una differente maschera di shifting che<br />

lo trasla in una particolare direzione. L'utente puo' scegliere se applicare<br />

il plugin alle sole direzioni orizzontale e verticale, alle sole direzioni<br />

diagonali o a tutte le direzioni possibili e quante volte iterare.


Plugin di esempio: shifting blur<br />

Nella pratica:<br />

Immagine originale Direzioni Tutte – iterazioni 1


Plugin di esempio: shifting blur<br />

Nella pratica:<br />

Direzione V/O – 3 iterazioni<br />

Direzione Diag. – 3 iterazioni


...oltre la convoluzione<br />

Sebbene i <strong>filtri</strong> di convoluzione, oggetto dello studio, permettano di<br />

realizzare un numero quasi infinito di effetti, non sono gli unici <strong>filtri</strong> che<br />

esistono. Un esempio e' dato dai <strong>filtri</strong> non lineari, come ad esempio quelli<br />

usati per ottenere effetti quali erosione, dilatazione, noise cleaning...<br />

Nonostante si basino su maschere, il procedimento adoperato e' ben<br />

diverso da quello utilizzato nella convoluzione...


Conclusione<br />

Lo scopo di questa panoramica sulle matrici di convoluzione e' far<br />

comprendere la potenza di questo strumento matematico applicato alla<br />

grafica. Analizzare nel dettaglio tutti i possibili <strong>filtri</strong> realizzabili con questo<br />

procedimento e' pressoche' impossibile dal momento che l'unico limite e'<br />

la fantasia e l'inventiva dell'utente!<br />

Questa presentazione e' rilasciata con licenza Creative Commons 2.5 –<br />

Attribuzione, Non commerciale, Condividi allo stesso modo<br />

I plugin di esempio sono rilasciati con licenza GNU GPL 3

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!