我一直在阅读使用维纳过滤器进行去模糊或恢复"一个3D图像。我的方法与MATLAB函数中使用的方法之间的区别" deconvwnr"是我对仅在z维度中对所有3D尺寸(x,y,z)中的图像进行去模糊感兴趣。我的理论是,如果我知道z维度(LSF_z)中的线扩散函数(LSF),那么我可以使用维纳滤波器和LSF_z来对z维度中的图像进行去模糊。
close all
% Define LSF (i.e. gaussian with mean = 0.5 & FWHM = 0.2)
space=linspace(0,1,50)';
space=fftshift(space);
FWHM=.2;
sigma=FWHM/2.3548;
c=0.5;
h = gaussmf(space,[sigma c]); % LSF
% Define degradation function frequency cutoff
Hcut=1e-7; %
Flpcut=1e-7;
% Define Transfer Function
H=fftshift(fft(h)');
[nx ny nz]=size(I);
Ideconv=zeros(size(I)); % allocate memory for "true" image
eps=1e6; % regularization parameter (i.e. constant noise to signal ratio)
% Loop over all voxels in 2D space
for j=1:ny
for i=1:nx
% Flp: FFT of line profile in z-dimension
lp=squeeze(I(i,j,:));
Flp=fftshift(fft(lp));
% cut-off all frequences below Flpcut
Flp=(Flp>Flpcut).*Flp;
% Define power spectrum of degradation function and cut-off all
% frequences below Hcut
magsquared=(H>Hcut).*abs(H).^2;
% Inverse FFT of (Wiener Filter x Flp)
Ideconv_1D_z=ifft(ifftshift((H2>Hcut.*magsquared./(H.*(magsquared+eps))).*Flp));
% Place "deblurred" line profile into true image matricx
Ideconv(i,j,:)=Ideconv_1D_z;
end
end
数据样本:
a=squeeze(I(250,500,:));
a=[70
64
64
57
57
54
58
59
55
55
51
52
51
52
55
57
58
66
64
66
69
68
65
66
66
62
56
55
54
54
55
58
63
69
65
52
52
53
55
58
58
58
59
60
60
56
56
55
55
57
60
58
61
61];
用于绘制结果的伪代码:
注意:为简单起见,这只是绘制单线轮廓的结果(i = 400和j = 600)
subplot(2,2,1);
plot(real(Flp),'b')
plot(imag(Flp),'r')
title('FT of line profile')
legend('real(Flp)','imag(Flp')
subplot(2,2,2);
plot(real(H),'b')
plot(imag(H),'r')
title('FT of LSF')
legend('real(H)','imag(H)')
subplot(2,2,3)
plot(magsquared,'b');
title('Power Spectrum: magsquared')
subplot(2,2,4)
plot(lp,'r')
plot(I,'b');
legend('original','deconvolved')
title(sprintf('Line Profile results with FWHM=%1.2f',FWHM))
我认为我的问题在于索引和/或频率截止。当我绘制结果时,它们不是我想要的。具体来说,它们几乎不依赖于LSF的FWHM。
此外,我很惊讶高斯的FT具有虚部,因为高斯是真实的甚至是fxn,它应该产生真实的甚至是FT。