Elaborazioni nel dominio frequenziale

Transcript

Elaborazioni nel dominio frequenziale
Elaborazione dei Segnali Multimediali
a.a. 2009/2010
Elaborazione nel dominio della frequenza
L.Verdoliva
In questa esercitazione esamineremo la trasformata di Fourier discreta monodimensionale e bidimensionale.
Useremo la DFT-2D per analizzare il contenuto frequenziale di un’immagine e per elaborarla realizzando il
filtraggio direttamente nel dominio della frequenza.
1
La Trasformata discreta 1D
La DFT (Discrete Fourier Transform) di una sequenza causale x(n) di durata finita N è definita come:
X(k) =
N
−1
X
x(n) e−j2πnk/N
k = 0, · · · , N − 1
n=0
L’equazione di sintesi (IDFT) invece è:
x(n) =
N −1
1 X
Xk ej2πnk/N
N
n = 0, · · · , N − 1
k=0
Alcune considerazioni. I coefficienti dello sviluppo sono numeri complessi e contengono le informazioni sull’ampiezza e la fase delle N sinusoidi discrete che rappresentano il segnale. E’ importante sottolineare che la
sequenza dei coefficienti di Fourier è periodica, cioè Xk+N = Xk . Teniamo poi presente che Xk e XN −k sono
componenti a frequenza numerica k/N e −k/N , rispettivamente, e che per segnali reali risultano complesse
coniugate (hanno la stessa ampiezza, ma fase opposta), in modo da dar luogo alla ricostruzione mediante
sinusoidi. Anche il segnale ricostruito risulta periodico sempre di periodo N .
Per il calcolo dei coefficienti DFT sfruttiamo il fatto che ogni campione dello spettro può essere determinato
come il prodotto scalare tra i campioni nel tempo e gli esponenziali complessi:
n = [0:N-1];
for k=0:N-1
X(k+1) = x*exp(-j*2*pi*k*n/N).’;
end;
Si noti che per vettori complessi x.’ indica il trasposto hermitiano, mentre x’ solo il trasposto. Il prodotto
scalare può anche essere valutato come:
X(k+1) = sum(x.*exp(-j*2*pi*k*n/N));
1
La Trasformata discreta 1D
2
In realtà, è possibile evitare del tutto i cicli for se si riconosce che il calcolo degli N coefficienti di Fourier
può essere visto come un prodotto matriciale, infatti detti i vettori colonna X = [X0 , X1 , . . . , XN −1 ]T ,
x = [x0 , x1 , . . . , xN −1 ]T e W la seguente matrice:


1
1
1
...
1

 1
e−j2π/N
e−j4π/N
...
e−j2π(N −1)/N

W=

 ...
...
...
...
...
−j2π(N −1)/N
−j4π(N −1)/N
−j2π(N −1)(N −1)/N
1 e
e
... e
risulta che X = Wx. In Matlab si ha:
n = [0:N-1];
k = [0:N-1];
W = exp(-j*2*pi*k’*n/N);
x=x.’;
X = W*x;
% necessario se x è un vettore riga
Con ragionamento analogo si perviene alla formula di ricostruzione: x =
1
∗
N W X.
x = (W’*X)/N;
In realtà in Matlab esiste già un comando per il calcolo della DFT, che risulta computazionalmente molto
efficiente perchè implementato mediante algoritmi veloci, noti come FFT (Fast Fourier Transform). Basta
allora scrivere il seguente codice dove x è il vettore di cui si vuole valutare la DFT su N punti:
x=boxcar(L);
% genera un impulso rettangolare lungo L
X=fft(x,N);
v=[0:(1/N):(N-1)/N];
subplot(2,1,1); stem(v,abs(X));
subplot(2,1,2); stem(v,angle(X));
Notate che è possibile specificare il numero di punti su cui calcolare la DFT. Di default tale valore è proprio
pari alla durata del segnale x(n), in caso contrario la sequenza è allungata con N − L zeri (zero padding),
che corrisponde, di fatto, ad effettuare un sovracampionamento in frequenza. Per comprendere meglio questo
fenomeno utilizziamo il comando fft per stimare lo spettro X(ν) del segnale RL (n):
v = [0:(1/N):1-1/N];
figure; plot(v,abs(X));
Scegliete L = 8 e fate variare il valore di N assegnando 10, 20, 50, 100, 1000. Notate come per valori piccoli
di N non sia possibile visualizzare correttamente lo spettro, nonostante risulti N ≥ L. Tenete infatti presente
che il vincolo di Nyquist richiede che poi venga realizzata un’interpolazione con le funzioni di Dirichlet (e non
lineare come fa il plot). Per questo motivo è necessario sovracampionare lo spettro, considerando N molto più
grande di L. Notate, infine, come i valori della DFT risultino strettamente dipendenti dal numero di punti su
cui la si valuta. Infatti quando si considera N maggiore di L il campionamento è più fitto, anche se lo spettro
X(ν) non varia.
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
La trasformata discreta 2D
3
Fate attenzione alla visualizzazione dello spettro che è stato rappresentato nell’intervallo [0, N [, ovvero
nell’intervallo [0, 1[ se si fa riferimento al valore di ν (frequenza normalizzata). Poiché le basse frequenze
si trovano intorno a 0 e 1 (agli estremi dell’intervallo), mentre le alte frequenze intorno a 1/2 (al centro
dell’intervallo), questa visualizzazione non è quella abituale, in cui le basse frequenze si trovano intorno
all’origine e le alte frequenze lontano dall’origine. D’altra parte è del tutto lecito, vista la periodicità dei
coefficienti, riportare a sinistra della componente continua le componenti della seconda metà dello spettro, in
modo da avere uno spettro più leggibile:
v = [-1/2:(1/N):1/2-1/N];
X = fftshift(X);
figure; plot(v,abs(X));
% asse temporale centrato nell’origine
% traslazione dei coefficienti di Fourier
Calcolate lo spettro di x(n) = RL (n) e visualizzate il modulo su di un grafico facendo aumentare il valore di
L = 2, 10, 20, 30. Considerate poi una finestra rettangolare in cui si cambia il segno ai coefficienti di posto
dispari, cioè y(n) = (−1)n RL (n). A parità di valore di L confrontate lo spettro di ampiezza di questo segnale
con quello di x(n). Che considerazioni potete trarre?
2
La trasformata discreta 2D
Data un’immagine x(m, n) di dimensioni M × N , la DFT-2D (equazione di analisi) è definita come:
X(k, l) =
M
−1 N
−1
X
X
mk
x(m, n)e−j2π( M
+ nl
N )
k = 0, · · · , M − 1
l = 0, · · · , N − 1
m = 0, · · · , M − 1
n = 0, · · · , N − 1
m=0 n=0
mentre l’equazione di sintesi è:
x(m, n) =
M −1 N −1
mk
nl
1 X X
X(k, l)ej2π( M + N )
NM
k=0 l=0
In Matlab la DFT bidimensionale è implementata tramite il comando fft2, che di default valuta la DFT su
un numero di punti pari proprio alle dimensioni dell’immagine. Scriviamo il codice per realizzare e visualizzare
il modulo della trasformata di Fourier dell’immagine costituita da un rettangolo bianco su sfondo nero:
x=double(imread(’Fig4.03(a).jpg’));
X=fft2(x);
figure; imagesc(abs(X)); colormap(gray(256)); axis image;
L’immagine visualizzata è tutta nera eccetto per pochissimi valori chiari agli angoli dell’immagine. In effetti
per una più corretta visualizzazione è necessario usare il comando fftshift per traslare le basse frequenze
della DFT al centro dell’immagine, e poi realizzare l’operazione di logaritmo per migliorare la visualizzazione
dei coefficienti, che presentano una dinamica estremamente ampia.
X=fftshift(X);
figure; imagesc(log(1+abs(X))); colormap(gray(256)); axis image;
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
Uso della DFT per il filtraggio lineare
4
Un altro modo per rappresentare il modulo della trasformata di Fourier è utilizzando il comando mesh(Y).
Il comando fft2 consente anche di specificare il numero di punti su cui calcolare la DFT, e se superiori
alle dimensioni dell’immagine, realizza automaticamente lo zero-padding: X = fft2(x,P,Q). A tal proposito notate che la visualizzazione effettuata non vi dà informazioni sulle frequenze spaziali, essendo funzione
solamente del numero di punti su cui è calcolata la DFT. Allora per poter visualizzare la trasformata di Fourier
di un’immagine al variare delle frequenze spaziali nel range [−1/2, 1/2]×[−1/2, 1/2], è necessario prima creare
la griglia di punti su cui definire la trasformata:
[M,N]=size(x);
P=2*M; Q=2*N;
du=1/P; dv=1/Q;
m=-1/2:du:1/2-du; n= -1/2:dv:1/2-dv;
[l,k] = meshgrid(n,m);
X=fft2(x,P,Q);
Y=log(1+abs(fftshift(X)));
mesh(k,l,Y);
Provate a traslare l’immagine Fig4.03(a).jpg e visualizzate sia lo spettro di ampiezza che quello di fase (con
il comando angle) cercando di interpretare ciò che avete ottenuto. Quindi ripetete l’esperimento ruotando
l’immagine di 45o .
2.1
Esercizi proposti
1. Importanza dello spettro di fase. Per comprendere l’importanza dello spettro di fase provate a realizzare
il seguente esperimento. Considerate l’immagine Fig0427(a).tif e dopo averne calcolato e visualizzato
spettro di ampiezza e di fase, ricostruite l’immagine con la sola informazione di ampiezza e poi solo con
quella di fase e confrontate le due immagini.
Infine, provate a ricostruire l’ immagine usando una volta il suo spettro di ampiezza, ma quello di fase
relativo all’immagine Fig4.03(a).jpg e una seconda volta il suo spettro di fase, ma quello di ampiezza
sempre relativo all’immagine Fig4.03(a).jpg.
2. Risposta in frequenza del filtro media aritmetica. Calcolate la DFT del filtro media aritmetica di dimensione k = 5, 10, 15, utilizzando per la FFT un numero di punti relativamente elevato, allo scopo di
ottenere un campionamento fine di H(ν, µ). Verificate il comportamento passa-basso del filtro.
3. Risposta in frequenza dei filtri di smoothing e di sharpening. Ripetete l’analisi dell’esercizio 2 considerando un filtro spaziale che realizza lo sharpening, verificando che si tratta di un passa-alto. (N.B. Provate
anche ad usare il comando freqz2 di matlab che realizza automaticamente un plot 3-D della risposta
armonica del filtro).
3
Uso della DFT per il filtraggio lineare
Lo studio dei segnali e dei sistemi nel dominio della frequenza è uno strumento fondamentale per l’elaborazione dei segnali, infatti nel dominio della frequenza il prodotto tra la trasformata di Fourier dell’ingresso
e quella della risposta impulsiva equivale alla convoluzione realizzata nel dominio spaziale. Il filtraggio nel
dominio frequenziale risulta computazionalmente molto efficiente grazie proprio ad algoritmi veloci (FFT) per
il calcolo della DFT. In realtà se si realizza il prodotto delle DFT dell’immagine di ingresso, X(k, l), e della
risposta impulsiva H(k, l) si ottiene la convoluzione circolare delle immagini, che in generale non è uguale alla
convoluzione lineare, operazione a cui siamo interessati per realizzare il filtraggio nel discreto. Tuttavia, si
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
Uso della DFT per il filtraggio lineare
5
può dimostrare, che realizzando opportunamente uno zero padding dell’immagine di partenza la convoluzione
circolare coincide con quella lineare. Quindi pur di effettuare il riempimento con zeri, la DFT può essere usata
per realizzare il filtraggio lineare.
Cominciamo ad esplorare questi concetti nel caso monodimensionale per poi passare alle immagini. Proviamo allora a determinare attraverso la DFT e la IDFT la risposta del filtro con x(n) = [1, 2, 3, 4] e h(n) =
[1, 1, 1], entrambe causali. In questo caso bisogna calcolare la DFT almeno su N = 4 + 3 − 1 = 6 punti per
garantire la correttezza del risultato:
x=[1 2 3 4];
h=[1 1 1];
X=fft(x,6);
H=fft(h,6);
Y=X.*H;
y=ifft(Y,6)
% vettore di ingresso
% risposta impulsiva
% realizza la DFT su 6 punti
Verificate che l’uscita è la stessa che fornisce il comando y=conv(x,h), ripetete quindi l’operazione di filtraggio
in frequenza calcolando la DFT su 4 punti, e verificando che il risultato è lo stesso di quello che otterreste con
un’estensione periodica ai bordi.
Se si considera invece un’immagine, x(m, n), di dimensioni M ×N e un filtro h(m, n) di dimensioni A×B,
è necessario calolare la DFT-2D su un numero di punti P e Q che soddisfino le condizioni P ≥ M + A − 1 e
Q ≥ N + B − 1. Vediamo un esempio di implementazione nel dominio della frequenza del filtro di Sobel per
la rivelazione dei bordi orizzontali. La risposta impulsiva del filtro è:
1
h(m, n) = 2
1
0
0
0
-1
-2
-1
Il codice Matlab per filtrare in frequenza un’immagine contenuta nella variabile x con tale filtro è il seguente:
h = [1 0 -1; 2 0 -2; 1 0 -1];
[M,N] = size(x);
[A,B] = size(h);
P=M+A-1;
Q=N+B-1;
X=fft2(x,P,Q);
H=fft2(h,P,Q);
Y=H.*X;
y=real(ifft2(Y));
figure; imagesc(y); colormap(gray(256)); axis image;
A rigore, il risultato della DFT inversa dovrebbe essere puramente reale, in quanto equivalente alla convoluzione
nel dominio dello spazio di due segnali reali. In pratica, errori dovuti alla precisione limitata comportano che
l’antitrasformata possieda una piccola parte immaginaria, che viene trascurata usando il comando real.
Questa procedura risulta computazionalmente più efficiente del calcolo diretto della convoluzione, solo se il
filtro è molto lungo (almeno maggiore di 32). Verificate che il risultato ottenuto nel dominio della frequenza è
praticamente uguale a quello che si può ottenere nel dominio spaziale (fate attenzione al fatto che la maschera
non è simmetrica).
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
Progetto dei filtri in frequenza
4
6
Progetto dei filtri in frequenza
Proviamo adesso a progettare un filtro direttamente nel dominio della frequenza, e consideriamo un filtro
passa-basso ideale, che ha come funzione di trasferimento:
½
1
D(µ, ν) ≤ D0
H(µ, ν) =
0
altrimenti
p
dove D(µ, ν) = µ2 + ν 2 e rappresenta la distanza dal punto (ν, µ) al centro del filtro, mentre D0 rappresenta
la frequenza di cut-off. Questo filtro ideale può essere simulato al calcolatore col seguente codice:
[M N] = size(x);
% dimensioni dell’immagine che si vuole elaborare
du = 1/M; dv = 1/N;
m = -1/2:du:1/2-du;
n = -1/2:dv:1/2-dv;
[l,k] = meshgrid(n,m);
D = sqrt(k.^2+l.^2);
D0 = 0.1;
H = (D <= D0);
figure; mesh(k,l,double(H));
A questo punto usiamo questo filtro per elaborare in frequenza l’immagine lena.jpg, visualizzando il risultato
sia nel dominio frequenziale che in quello spaziale:
x = double(imread(’lena.jpg’));
X = fft2(x,M,N);
X = fftshift(X);
figure; mesh(k,l,log(1+abs(X)));
Y=H.*X;
figure; mesh(k,l,log(1+abs(Y)));
Y=fftshift(Y);
y=real(ifft2(Y,M,N));
figure; imagesc(y); colormap(gray(256)); axis image; axis off;
Provate a cambiare la dimensione del raggio e visualizzate l’uscita. Noterete l’effetto di ringing che caratterizza un filtraggio ideale e che può essere sensibilmente ridotto se si usano filtri gaussiani con funzione di
trasferimento:
2
2
H(µ, ν) = e−D (µ,ν)/2σ
dove al crescere di σ aumenta la banda del filtro. Scrivete una funzione Matlab con il prototipo function y
= gaussLPF(x,sigma) che implementa il filtraggio passa-basso gaussiano con un assegnato valore di σ.
Infine, implementate i filtri ideali passa-alto ed elimina-banda la cui risposta armonica visualizzata come
immagine è mostrata in figura 1. Usateli per filtrare l’immagine lena.jpg e osservate il risultato al variare del
raggio.
4.1
Esercizi proposti
1. Testo a bassa risoluzione e pubblicità. l’immagine Fig.4.19(a).jpg, che mostra un esempio di testo a
bassa risoluzione che caratterizza di solito un fax o una fotocopia. Il testo in questa forma si presta poco
Elaborazione dei Segnali Multimediali
a.a. 2009-2010
Progetto dei filtri in frequenza
7
Figura 1: Esempio di filtro passa-alto ed elimina-banda (bianco è 1 e nero è 0).
ad essere elaborato da un calcolatore che effettua riconoscimento automatico, dato che sono presenti dei
vuoti nei caratteri. Un approccio usato per affrontare questo problema è quello di realizzare un filtraggio
passa-basso gaussiano. Questo filtro può anche essere usato per per ringiovanire l’aspetto della donna
raffigurata nell’immagine Fig.4.20(a).jpg. Fate degli esperimenti, in entrambi i casi, al variare di σ.
2. Impronta digitale. Considerate l’immagine di un’impronta digitale Fig0457(a).tif in cui sono presenti delle
macchie. L’enhancement di questo tipo di immagini è un’operazione fondamentale per poterne effettuare
il riconoscimento automatico e quindi individuare correttamente le biforcazioni e le terminazioni presenti.
Applicate all’immagine un filtro passa-alto di Butterworth di ordine 4 con σ = 0.02, quindi realizzate
un’operazione di thresholding sul risultato ponendo tutti i valori negativi a zero e quelli positivi pari a
255. Visualizzate il risultato dell’elaborazione.
3. Filtraggio di rumore periodico. Aggiungete rumore sinusoidale, z(m, n) = A sin(2π(µ0 m + ν0 n)),
all’immagine lena.jpg fissando il valore di µ0 = ν0 = 0.25 e scegliendo il valore di A. Quindi progettate
un filtro notch in grado di rimuovere il rumore; visualizzate la trasformata di Fourier dell’immagine
filtrata e l’immagine elaborata.
4. Filtraggio notch. L’immagine Fig4.65(a).tif mostra una parte degli anelli che circondano Saturno. Il rumore sinusoidale è dovuto ad un segnale AC sovrapposto a quello della fotocamera prima di digitalizzare
l’immagine. Tale interferenza è semplice da rimuovere se si progetta un filtro notch in grado di cancellare il contributo del rumore. Calcolate quindi la trasformata di Fourier dell’immagine, analizzatela,
individuate il contributo realtivo al segnale sinusoidale e cercate di eliminarlo con il filtraggio.
Elaborazione dei Segnali Multimediali
a.a. 2009-2010