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
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