Vous êtes sur la page 1sur 2

Deconvoluzione di immagini tramite la trasformata di Fourier

Introduzione

Lacquisizione di una immagine avviene attraverso sistemi ottici che non sono perfetti. Una sorgente perfettamente puntiforme viene vista da parte del sistema
ottico con un piccolo grado di sfocatura. Questa sfocatura in uscita `e descritta matematicamente da una
funzione chiamata PSF (Point Spread Function). Supponiamo di avere una immagine monocromatica descritta da una funzione che in ogni punto dello spazio
associa la sua luminosit
a a(x, y). Allora, in uscita dal
sistema ottico di acquisizione si avr
a il risultato di una
operazione di convoluzione della funzione a(x, y) con la
PSF f (x, y), ovvero:
Z KZ L
b(x, y) =
dx0 dy 0 a(x0 , y 0 )f (x x0 , y y 0 ),
0

dove b(x, y) e la funzione che descrive limmagine come


vista in uscita dal sistema ottico, K L e la dimensione
dellimmagine.
Se si esprime la funzione b(x, y) attraverso la sua
serie di Fourier bidimensionale, definita come

1 1 X
b(x, y) =
LK

k= l=

Figura 1: Immagine sfocata




 y = len(img[1,:])
bkl exp i 2kx exp i 2ly x = len(img[:,1])
K
L

Il risultato e che entrambe le lunghezze sono uguali e


pari a 1024 pixel.


Z L
Dato che una immagine digitale e praticamente una
2kx
bk = 1
b(x) exp
x
matrice di punti campionati dallimmagine reale, in
L 0
L
realta quello che si fa e la trasformata di Fourier dirisulta che
screta. Come SPF si e assunto una funzione di tipo
bkl = KL a
kl fkl
gaussiano, del tipo:

 2
ovvero i coefficienti di fourier della funzione b sono
x + y2
dati semplicemente dal prodotto dei coefficienti della
f (x, y) = exp
,
2 2
funzione a e i coefficienti della PSF. Questo ci suggerisce un metodo per ottenere una immagine definita a con = 25. Tramite questa funzione si e calcolata
partire dallimmagine sfocata: se si conoscesse la PSF una matrice con le stesse dimensioni x,y dellimmagine
basterebbe calcolare la sua serie di Fourier e quindi caricata con i valori campionati della funzione f. La
calcolare per tutte le k e le l i coefficienti a
kl dallequa- SPF e una gaussiana centrata nellorigine, ma la DFT
zione 1; una volta trovati tutti i coefficienti compiendo richiede implicitamente che la funzione sia periodica.
la trasformazione inversa di Fourier si otterrebbe la Quindi imponiamo la periodicitari alle dimensioni delfunzione a(x, y), ovvero limmagine reale (quindi non la foto nella direzione x e y copiando la funzione a fine
sfocata) delloggetto.
intervallo. Per farlo si sono definiti 4 cilci for in questa
dove

maniera:

Realizzazione del programma


def f(i,j,sigma):

Il programma carica una matrice di valori di luminoreturn exp(-(i**2+j**2)/(2*sigma**2))


sit
a di una immagine. Il risultato rappresentato come
density plot e riportato in figura 1.
blur = zeros((x,y))
Per calcolare le dimensioni dellimmagine si e usata
for i in range(int(x/2)):
listruzione len:
1

corrispondente della matrice dei coefficienti di fourier


dellimmagine non e compiuta la divisione.

for j in range(int(y/2)):
blur[i,j] = f(i,j,sigma)
for i in range(int(x/2),x):
for j in range(int(y/2),y):
blur[i,j] = f(i-1024,j-1024,sigma)
for i in range(int(x/2)):
for j in range(int(y/2),y):
blur[i,j] = f(i,j-1024,sigma)
for i in range(int(x/2),x):
for j in range(int(y/2)):
blur[i,j] = f(i-1024,j,sigma)

for i in range(x_fft):
for j in range(y_fft):
if abs(blur_fft[i,j])<=1e-3:
img_fft[i,j]*=1e3
continue
else:
img_fft[i,j] /= blur_fft[i,j]

Della nuova matrice dei coefficienti ottenuta si fa quindi


la trasformazione di Fourier inversa per tornare alla
campionatura spaziale della funzione a(x, y) tramite la
funzione irff2, come illustrato nel codice seguente

Il risultato pu
o essere visto sempre tramite un
density plot ed e riportato in figura 2

img = irfft2(img_fft)

Il risultato si puo mostrare sempre con un density


plot. Quello che si ottiene e quindi una immagine non
sfocata

Figura 2: Spread Point function. Le quattro macchie


agli angoli sono dovuti alla periodicit
a della funzione
Il pacchetto numpy.fft fornisce una serie di funzioni
per calcolare trasformate e antitrasformate di Fourier
di diversi tipi. In particolare nellesercizio, dato che la
matrice della luminosit`
a e composta da numeri reali, si
sono utilizzate le funzioni rfft2 e irfft2 che rispettivamente calcolano la trasformata di Fouier di una matrice
bidimensionale a coefficienti reali tramite lalgoritmo
della Fast Fourier Transform. Si sono calcolati quindi
i coefficienti di Fourier della matrice dellimmagine e
della matrice con i campionamenti della SPF.

Figura 3: Immagine iniziale ripristinata

from numpy.fft import rfft2,irfft2


img_fft = rfft2(img)
blur_fft = rfft2(blur)

Una volta fatto questo, dato che bkl = KL a


kl fkl ,
si sono calcolati i coefficienti dellimmagine non sfocata a
k l dividendo i coefficienti bkl per i coefficienti fkl .
Questa operazione per
o pu
o presentare un problema:
pu
o darsi che i coefficienti siano nulli e la divisione ritornerebbe un errore. Per evitare questo problema si `e
impostato un controllo sul valore assoluto di ogni elemento di matrice. Se il valore dellelemento e inferiore
ad un epslon impostato a 103 , allora su quellelemento
2

Vous aimerez peut-être aussi