2013-10-03 36 views
5

Mam zawiłe obraz utworzony w Matlab z funkcją 2D Gaussian, które również zdefiniowałem w Matlab i teraz próbuję dekonwolucji wynikowej macierzy, aby zobaczyć, czy dostaję funkcję 2D Gaussian wróć używając poleceń fft2 i ifft2. Jednak macierz, którą otrzymuję w rezultacie jest niepoprawna (według mojej wiedzy). Oto kod do tego, co zrobić w ten sposób pory:Dekonwolucji 2D przy użyciu FFT w Matlab Problemy

% kodu na obraz wejściowej (IMG) [300x300 tablicy]

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

% kodu 2D funkcją Gaussa z C = 0 porządek = 1/64 (z) [300x300 tablica]

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

% kodu 2D splotu img z z (C) [599x599 tablica]

C = conv2(img,Z); 

% mam przetestowali, że ten splot jest poprawny przy użyciu wektorów profilu przekroju dla img i C, a powstałe spekulacje x-y są tym, czego oczekuję od splotu.

% Z mojej znajomości splotu algorytm działa jako mnożnik w przestrzeni Fouriera, dlatego przez podzielenie transformaty Fouriera mojego wyjścia (zawiłego obrazu) przez moje wejście (img) powinienem odzyskać funkcję rozproszenia punktu (Z - funkcja 2D Gaussa) po odwrotnej transformacji Fouriera zastosowanej do tego wyniku przez podział.

% Kod dekonwolucji próbował 2D

Fimg = fft2(img,599,599); 

% zerowy wyściółka dodany do zwiększenia wynik 599x599 tablicy

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

% teraz uzyskać ten monit o błędzie: Ostrzeżenie: Matrix jest blisko pojedynczej lub źle skalowane. Wyniki mogą być niedokładne. RCOND = 2.551432e-22

iFR = ifft2(R); 

Czekam IFR być blisko do Z, ale ja dostaję coś zupełnie innego. Może to być przybliżenie Z do złożonych wartości, ale nie mogę tego sprawdzić, ponieważ nie wiem, jak narysować trójwymiarową macierz złożoną w programie Matlab. Jeśli więc ktoś może mi powiedzieć, czy moja odpowiedź jest poprawna czy niepoprawna i jak uruchomić tę dekonwolucję? Byłbym bardzo doceniony.

+2

Lekko off topic nitpick: ty convolve sygnał, nie skręcony – chappjc

+0

ponieważ wyniki dywizji w 599x599 matrycy, jak masz Gaussa funkcji 2D, który jest 300x300? – Curious

+0

@IssamLaradji wynikowy obraz to 599x599 z 2D Gaussian zawartym w pierwszych 300x300 rzędach. Użyłem indeksowania macierzy, aby odzyskać tablicę 300x300. –

Odpowiedz

2

R = FC/Fimg musi być R = FC./Fimg; Musisz zrobić podział na elementy.

+0

Oczywiście ma to o wiele więcej sensu; co za błąd debiutanta. Czy istnieje sposób na wykreślenie wynikowej macierzy złożonej jako powierzchni, tak, że mogę to porównać z moim Gaussianem? –

+0

@SeanJamesJamieson Myślę, że nie powinno być żadnych złożonych składników ... Nie jestem pewien.Ale wystarczy przykryć tablicę "abs" przed jej narysowaniem. – Justin

+0

Tak, zrobiłem to i zindeksowałem matrycę dla pierwszych 300 wierszy i kolumn i odzyskałem swoją funkcję z powrotem z maksymalną zdefiniowaną punktowo niepewnością 4 x 10^-13. Dzięki za pomoc faceci –

0

Oto niektóre wykresy oktaw (wersja 3.6.2) tego dekonwolucji Gaussa.

% 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