我正在查看一些执行图像模糊的代码。但是,我无法理解代码,我想知道是否有人可以帮助我理解代码的作用。
这里变量“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是否是高斯卷积核的傅里叶变换,或者至少无法从代码中告诉它。
所以,我对这是如何实现高斯模糊感到有点困惑。任何理解此代码的帮助都将不胜感激。
答案 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))'})
因此,将gausswin
的输出立即解释为傅立叶空间,而不执行和FFT,相当于空间域中具有更大sigma的高斯窗口。