2013-10-03 9 views
5

Ho convoluto un'immagine che ho creato in MATLAB con una funzione gaussiana 2D che ho anche definito in MATLAB e ora sto provando a deconvolgere la matrice risultante per vedere se ottengo la funzione Gaussiana 2D indietro usando i comandi fft2 e ifft2. Tuttavia la matrice che ottengo di conseguenza non è corretta (a mia conoscenza). Ecco il codice per quello che ho fatto finora: CodiceDeconvoluzione 2D usando FFT in Matlab Problemi

% dell'immagine in ingresso (img) [300x300 gamma]

N = 100; 
t = linspace(0,2*pi,50); 
r = (N-10)/2; 
circle = poly2mask(r*cos(t)+N/2+0.5, r*sin(t)+N/2+0.5,N,N); 
img = repmat(circle,3,3); 

% Codice in 2D funzione gaussiana con c = 0 in ordine a = 1/64 per (Z) [300x300 matrice] Codice

x = linspace(-3,3,300); 
y = x'; 
[X Y] = meshgrid(x,y); 
Z = exp(-((X.^2)+(Y.^2))/(2*1/64)); 

% per 2D convoluzione di img con Z (C) [599x599 matrice]

C = conv2(img,Z); 

% ho abbiamo verificato che questa convoluzione è corretta usando i vettori di profili di sezione trasversale per img e C e i grafici x-y risultanti sono ciò che mi aspetto dalla convoluzione.

% Dalla mia conoscenza della convoluzione, l'algoritmo funziona come un moltiplicatore nello spazio di Fourier, quindi dividendo la trasformata di Fourier del mio output (immagine convoluta) dal mio input (img) dovrei riprendere la funzione di diffusione dei punti (Z - Funzione gaussiana 2D) dopo che la trasformata di Fourier inversa viene applicata a questo risultato per divisione.

% Codice in materia di deconvoluzione tentato 2D

Fimg = fft2(img,599,599); 

% zero padding aggiunto per aumentare risultato da 599x599 gamma

FC = fft2(C); 
R = FC/Fimg; 

% ora ottengo questo prompt errore: Warning: Matrix è vicino al singolare o mal ridimensionato. I risultati potrebbero essere inaccurati. Rcond = 2.551432e-22

iFR = ifft2(R); 

mi aspetto IFR per essere vicino alla Z, ma sto ottenendo qualcosa di completamente diverso. Potrebbe essere un'approssimazione di Z con valori complessi ma non riesco a controllarlo poiché non so come tracciare una matrice 3D complessa in MATLAB. Quindi, se qualcuno può dirmi se la mia risposta è corretta o errata e come far funzionare questa deconvoluzione? Sarei molto apprezzato

+2

Leggermente fuori tema nitpick: si Convolve un segnale, non convolute – chappjc

+0

Poiché i risultati di divisione in una matrice 599x599, come si ottiene la funzione gaussiana 2D che è 300x300? – Curious

+0

@IssamLaradji l'immagine risultante è 599x599 con il gaussiano 2D contenuto nelle prime 300x300 righe. Ho usato l'indicizzazione a matrice per ottenere un array 300x300 –

risposta

2

R = FC/Fimg deve essere R = FC./Fimg; È necessario eseguire la divisione in base agli elementi.

+0

Naturalmente, questo ha molto più senso; che errore da principiante. C'è un modo per tracciare la matrice complessa risultante come una trama di superficie in modo da poter confrontare questo con il mio gaussiano? –

+0

@SeanJamesJamieson Penso che non ci dovrebbero essere componenti complessi ... Non sono sicuro.Ma in questo caso puoi avvolgere l'array con un 'abs' prima di tracciarlo. – Justin

+0

Sì, l'ho fatto e ho indicizzato la matrice per le prime 300 righe e colonne e ho ripristinato la mia funzione con un'incertezza massima definita in senso orario di 4 x 10^-13. Grazie per l'aiuto ragazzi –

0

Ecco alcuni diagrammi di Ottava (versione 3.6.2) di quel gaussiano deconvolato.

% deconvolve in frequency domain 
Fimg = fft2(img,599,599); 
FC = fft2(C); 
R = FC ./ Fimg; 
r = ifft2(R); 

% show deconvolved Gaussian 
figure(1); 
subplot(2,3,1), imshow(img), title('image'); 
subplot(2,3,2), imshow(Z), title('Gaussian'); 
subplot(2,3,3), imshow(C), title('image blurred by Gaussian'); 
subplot(2,3,4), mesh(X,Y,Z), title('initial Gaussian'); 
subplot(2,3,5), imagesc(real(r(1:300,1:300))), colormap gray, title('deconvolved Gaussian'); 
subplot(2,3,6), mesh(X,Y,real(r(1:300,1:300))), title('deconvolved Gaussian'); 

% show difference between Gaussian and deconvolved Gaussian 
figure(2); 
gdiff = Z - real(r(1:300,1:300)); 
imagesc(gdiff), colorbar, colormap gray, title('difference between initial Gaussian and deconvolved Guassian'); 

enter image description here enter image description here