Trasformata Wavelet

Transcript

Trasformata Wavelet
Elaborazione dei Segnali Multimediali
a.a. 2009/2010
La trasformata Wavelet
L.Verdoliva
In questa esercitazione realizziamo la la trasformata wavelet monodimensionale, diretta e inversa, mediante un
banco di filtri. Inoltre estendiamo l’analisi alle immagini, evidenziando la capacità della wavelet di localizzazione
tempo-frequenza e la possibilità di fornire una gerarchia di immagini a diversa risoluzione. Infine,mostriamo
un esempio di watermarking nel dominio wavelet.
1
La Trasformata Wavelet monodimensionale
La trasformata Wavelet può essere realizzata semplicemente ed efficacemente mediante un banco di filtri.
In particolare la fase di analisi (decomposizione) prevede un filtraggio passa basso e passa alto seguiti da
un’operazione di decimazione per 2, mentre la fase di sintesi (ricostruzione) elabora separatamente gli ingressi,
attraverso un’espansione ed un filtraggio, per poi sommarli. Queste operazioni devono essere iterate a seconda
del numero di livelli di decomposizione con cui si vuole realizzare la trasformata.
1.1
Fase di analisi
Per calcolare la trasformata Wavelet diretta bisogna definire innanzitutto i filtri di analisi. Il filtro passa-basso
di analisi ha risposta impulsiva h̃(n) = h(−n), mentre il filtro passa-alto g̃(n) = g(−n). Se consideriamo la
wavelet di Haar: h(n) = [ √12 , √12 ], e g(n) = [ √12 , − √12 ]. Si ha:
h =
g =
lpf
hpf
[1/sqrt(2), 1/sqrt(2)];
[1/sqrt(2),-1/sqrt(2)];
= fliplr(h);
= fliplr(g);
% filtro passa-basso
% filtro passa-alto
A questo punto bisogna realizzare il filtraggio del segnale; in matlab è disponibile il comando conv per effettuare
la convoluzione tra due segnali di durata finita. Si ricordi che l’uscita di tale operazione, se N è la durata
del segnale e F L quella del filtro, ha lunghezza pari a N + F L − 1, cioè a causa della memoria del filtro la
lunghezza del segnale in ingresso si allunga di F L − 1 campioni. Per questo stesso motivo la determinazione
del primo coefficiente in uscita richiede la definizione del segnale per istanti di tempo “negativi”, cioè in punti
in cui il segnale non esiste (problema dei bordi). E’ necessario allora estendere il segnale negli istanti di tempo
in cui non è definito, a tal fine ci sono diverse possibilità:
• estensione con zeri (zero padding);
• estensione periodica (wraparound);
• estensione simmetrica (symmetric extension).
1
La Trasformata Wavelet monodimensionale
2
Sia lo zero padding che l’estensione periodica introducono una brusca discontinuità nel segnale; tuttavia l’estensione periodica per filtri ortogonali garantisce la perfetta ricostruzione del segnale (l’estensione simmetrica è
usata per filtri biortogonali). Quindi, prima di filtrare il segnale, bisogna estenderlo ai bordi periodicamente
con un numero di coefficienti pari a F L − 1. Supponiamo per semplicità di dover effettuare la trasformata
Wavelet di Haar di un vettore di dati x:
x = [1:8];
N = length(x);
FL = length(lpf);
xext = padarray(x’,FL-1,’circular’);
x_low = conv(xext,lpf);
ldec = x_low(FL+1:2:N+FL-1);
x_high = conv(xext,hpf);
hdec = x_high(FL+1:2:N+FL-1);
w(1:N) = [ldec,hdec];
subplot(211); stem(0:7,x);
subplot(212); stem(0:7,w);
%
%
%
%
%
%
%
%
%
segnale di prova
lunghezza del segnale
lunghezza del filtro
estensione periodica ai bordi
filtraggio passabasso
decimazione
filtraggio passaalto
decimazione
coefficienti wavelet
axis([-.5 7.5 -1 10]); title(’Segnale’);
axis([-.5 7.5 -1 15]); title(’WT’);
Notate come, dal momento che la convoluzione allunga la durata dei segnali, è stato necessario troncare il
vettore elaborato (prendendo solo la parte centrale) per fare in modo che avesse, a valle della decimazione,
una durata pari proprio alla metà di quella del segnale originale.
1.2
Fase di sintesi
Nella fase di sintesi bisogna invece definire i filtri, che, a meno di un ribaltamento, coincidono con quelli di
analisi e corrispondono proprio con h(n) e g(n):
ilp = h;
ihp = g;
Il codice matlab che realizza la fase di ricostruzione è il seguente:
ewlp = zeros(1,N); ewlp(1:2:N) = w(1:N/2);
ewlpext = padarray(ewlp’,FL-1,’circular’);
lrec = conv(ilp,ewlpext);
ewhp = zeros(1,N); ewhp(1:2:N)=w(N/2+1:N);
ewhpext = padarray(ewhp’,FL-1,’circular’);
hrec = conv(ihp,ewhpext);
xrec = lrec + hrec;
xrec=xrec(2*FL-2:2*FL-2+N-1);
%
%
%
%
%
%
%
espansione
estensione ai bordi
filtraggio passa-basso
espansione
estensione ai bordi
filtraggio passa-alto
ricostruzione
Anche in questo caso a valle del filtraggio è stato necessario troncare il segnale elaborato per garantire che la
lunghezza del vettore ricostruito fosse identica a quella del segnale originale. Verificate che effettivamente il
vettore xrec è perfettamente uguale a quello originale x.
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
La Trasformata Wavelet bidimensionale
1.3
3
Esercizi proposti
1. Funzioni FWT e IWT. Create due funzioni Matlab function [w] = fwt(x,lev) (Forward Wavelet
Transform) e function [x] = iwt(w,lev) (Inverse Wavelet Transform) che realizzano la trasformata
wavelet di Haar monodimensionale con lev livelli di decomposizione.
2. Analisi wavelet. Cambiate il segnale di prova con il seguente: x=[ones(1,11)*4 ones(1,5)*16];
e verificate la capacità della trasformata wavelet di Haar di localizzare le discontinuità, calcolando e
visualizzando la trasformata wavelet di x su 4 livelli di decomposizione.
3. Wavelet di Daubechies. Calcolate la trasformata Wavelet di Haar, a diversi livelli di decomposizione, di
una riga di un’immagine e visualizzate l’uscita, verificate inoltre la proprietà di perfetta ricostruzione.
Infine provate a sostituire la Wavelet di Haar con quella di Daubechies di lunghezza 4 i cui coefficienti h(n)
sono: daub4=[1+sqrt(3) 3+sqrt(3) 3-sqrt(3) 1-sqrt(3)]/(4*sqrt(2)) e vedete quali effetti
ha questo cambiamento sul segnale trasformato.
N.B. Tenete presente che i coefficienti di analisi h(n) sono legati a quelli di sintesi mediante la seguente
relazione: g(n) = (−1)n h(F L − 1 − n), con F L lunghezza del filtro.
2
La Trasformata Wavelet bidimensionale
L’estensione al caso bidimensionale risulta molto semplice, in quanto la trasformata wavelet è separabile,
pertanto è possibile operare prima lungo le righe e poi lungo le colonne (figura 1).
Si noti come ad ogni livello di decomposizione l’immagine che viene elaborata è la versione passa-basso
di quella originale che ha dimensioni 4 volte più piccole dell’immagine di partenza. Se indichiamo con lev il
numero dei livelli di decomposizione e con X l’immagine, una possibile struttura del codice è:
In alternativa, è possibile realizzare la trasformata bidimensionale usando le funzioni che effettuano la
trasformata wavelet monodimensionale scritte precedentemente, nel seguente modo:
W=double(imread(’Fig7.01.jpg’));
[M,N]=size(W);
for i=1:lev,
for i=1:M
riga=W(i,1:N);
[wtriga]=fwt(riga,1);
W(i,1:N)=wtriga;
end
for j=1:N,
riga = W(1:M,j);
[wtriga] = fwt(riga’,1);
W(1:M,j) = wtriga’;
end;
M=M/2;
N=N/2;
end;
%
%
%
%
filtraggio lungo le righe
riga da trasformare
WT monodimensionale con lev=1
posizionamento
% filtraggio lungo le colonne
% colonna da trasformare
% posizionamento
% dimezza le dimensioni
% per il passo successivo
Fate molta attenzione alla visualizzazione della trasformata wavelet, in quanto le varie sottobande hanno
dinamiche anche molto diverse. In particolare le bande con i dettagli assumono generalmente valori prossimi
allo zero eccetto in corrispondenza dei bordi (orizzontali, verticali o obliqui) dell’immagine (figura 2).
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
La Trasformata Wavelet bidimensionale
4
~
hn
~
hn
2
~
gn
~
hn
~
gn
2
2
2
2
~
gn
2
Figura 1: Implementazione wavelet 2D mediante banco di filtri
Figura 2: Trasformata wavelet a uno e due livelli di decomposizione
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
La Trasformata Wavelet bidimensionale
2.1
5
Esercizi proposti
1. Funzioni FWT2D e IWT2D. Create due funzioni Matlab function [w] = fwt2d(x,lev) (Forward
Wavelet Transform) e function [x] = iwt2d(w,lev) (Inverse Wavelet Transform) che realizzano la
trasformata wavelet bidimensionale con lev livelli di decomposizione. Verificate la proprietà di perfetta
ricostruzione, sia visualizzando l’immagine antitrasformata sia calcolando il rapporto segnale rumore tra
immagine originale e ricostruita.
2. Visualizzazione wavelet 2D. Scrivete una funzione function wtview(w,lev) che visualizza la trasformata wavelet di un’immagine con numero di livelli di decomposizione assegnato. Per consentire un’adeguata visualizzazione, ogni sottobanda deve essere sottoposta ad un FSHS indipendentemente dalle altre.
Applicate questa funzione usando sia la wavelet di Haar che quella di Daubechies. Che tipo di differenze
riuscite a notare?
3. Strategia di codifica. Realizzate la stessa strategia di codifica per i coefficienti Wavelet che avete adottato
per i coefficienti DCT, vale a dire: azzerate i coefficienti wavelet (in valore assoluto) inferiori ad una
certa soglia relativi alle sole bande dettaglio, e poi realizzate la trasformata wavelet inversa. Ricordate
di determinare la percentuale dei coefficienti posti a zero e di visualizzare l’immagine originale, quella
ricostruita e la maschera relativa.
4. Watermarking. Un modo possibile per inserire una firma digitale in un’immagine è mediante l’uso
della trasformata wavelet. Si può pensare di aggiungere il watermark (che in questo caso si genera
come una sequenza casuale) solo ai coefficienti wavelet significativi (che superano cioè una determinata
soglia) delle bande dettaglio. In questo modo vengono alterati solo quei coefficienti che sono legati alle
discontinuità dell’immagine cui l’occhio umano risulta meno sensibile (visual masking). Scrivete quindi
il codice matlab per realizzare i seguenti passi:
(a) trasformata wavelet diretta dell’immagine su 3 livelli di decomposizione usando la wavelet di
Daubechies;
(b) modifica dei coefficienti wavelet w(i, j) superiori (in modulo) ad una soglia T1 relativi solo alle
bande dettaglio usando la seguente regola (casting del watermark):
w0 (i, j) = w(i, j) + α |w(i, j)| wm(i, j)
Il watermark wm(i, j) può essere generato con il comando rand, specificando anche il seme.
(c) trasformata wavelet inversa dell’immagine.
Applicate l’algoritmo all’immagine cowper.bmp, usando α = 0.2 e T1 = 40, visualizzate l’immagine
originale e quella marcata.
5. Toolbox wavelet. In matlab esiste il toolbox wavelet che permette di realizzare la wavelet diretta e inversa
monodimensionale (dwt e idwt) e bidimensionale (dwt2 e idwt2) per un singolo livello di decomposizione. Usate la funzione dwt2 con wavelet di Haar ed estensione periodica (leggete attentamente l’help
di matlab) e verificate che ottenete lo stesso risultato visto in precedenza. Generalizzate il codice per
lev livelli di decomposizione usando le funzioni wavedec e waverec.
Elaborazione dei Segnali Multimediali
a.a. 2009-2010