matlab代码:傅立叶域中的高斯模糊

时间:2014-10-23 15:58:20

标签: matlab image-processing fft convolution

我正在查看一些执行图像模糊的代码。但是,我无法理解代码,我想知道是否有人可以帮助我理解代码的作用。

这里变量“Iref”是图像。

Imin = min(Iref(:));

Iref_fft = Iref-Imin;
Iref_fft = fftshift(Iref_fft,1);
Iref_fft = fftshift(Iref_fft,2);

Iref_fft = fft(Iref_fft,[],1);
Iref_fft = fft(Iref_fft,[],2);

Iref_fft = fftshift(Iref_fft,1);
Iref_fft = fftshift(Iref_fft,2);

在这里,我已经对将fftshift应用于尚未进入傅立叶域的图像意味着什么感到困惑。所以,我可以说它是沿着每个轴进行傅里叶变换,但为什么它在前后进行了一次移位?

代码如下:

Nx_r = 32;
Ny_r = 32;
sigma = 1.5;
wx      = reshape(gausswin(Nx_r,sigma), [1 Nx_r]);
wy      = reshape(gausswin(Ny_r,sigma), [Ny_r 1]);
wx_rep  = repmat(wx, [Ny_r 1]);
wy_rep  = repmat(wy, [1 Nx_r]);
Window  = wx_rep .* wy_rep;

xIndices = floor((Nx-Nx_r)/2)+1 : floor((Nx-Nx_r)/2)+Nx_r;
yIndices = floor((Ny-Ny_r)/2)+1 : floor((Ny-Ny_r)/2)+Ny_r;

Iref_blurred = zeros(Ny,Nx);
Iref_blurred(yIndices,xIndices,:) = Iref_fft(yIndices,xIndices) .* Window;
Iref_blurred = fftshift( ifft2( fftshift(Iref_blurred) ) );
Iref_blurred = abs(Iref_blurred)+Imin;

在随后的步骤中,我认为我们正在进行高斯模糊。但是,我认为内核必须在傅立叶域中生成,然后我们才能像线一样将它们相乘:

Iref_blurred(yIndices,xIndices,:) = Iref_fft(yIndices,xIndices) .* Window;

我不确定Window是否是高斯卷积核的傅里叶变换,或者至少无法从代码中告诉它。

所以,我对这是如何实现高斯模糊感到有点困惑。任何理解此代码的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

你是正确的,在这段代码中没有高斯的FFT,但要记住(或学习)的是the Fourier space representation of a Gaussian is also a Gaussian,只是相互标准偏差。编写此代码的人可能知道这一点,或者他们只是忘了并且很幸运。

请参阅名为Gaussian Window and the Fourier转化的gausswin文档部分。文档中的gausswin示例的简明版本:

N = 64; n = -(N-1)/2:(N-1)/2; alpha = 8;
w = gausswin(N,alpha);
nfft = 4*N; freq = -pi:2*pi/nfft:pi-pi/nfft;
wdft = fftshift(fft(w,nfft));
plot(n,w)
hold on
plot(freq/pi,abs(wdft) / 10,'r')
title('Gaussian Window and FFT')
legend({'win = gausswin(64,8)','0.1 * abs(FFT(win))'})

enter image description here

因此,将gausswin的输出立即解释为傅立叶空间,而不执行和FFT,相当于空间域中具有更大sigma的高斯窗口。