Код matlab: размытие по Гауссу в области Фурье

Я смотрю на код, который выполняет размытие изображений. Однако у меня проблемы с пониманием кода, и мне было интересно, может ли кто-нибудь помочь мне примерно понять, что делает код.

Здесь переменная 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 к изображению, которое еще не находится в области Фурье. Итак, я могу сказать, что он выполняет преобразование Фурье по каждой из осей, но почему он выполняет 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 преобразованием Фурье ядра свертки Гаусса или, по крайней мере, не могу сказать это из кода.

Итак, я немного сбит с толку относительно того, как достигается размытие по Гауссу. Приветствуется любая помощь в понимании этого кода.


person Luca    schedule 23.10.2014    source источник


Ответы (1)


Вы правы в том, что в этом коде не происходит БПФ гауссианы, но нужно запомнить (или изучить) это the Fourier space representation of a Gaussian is also a Gaussian, только с обратным стандартным отклонением. Кто бы ни писал этот код, вероятно, знал это, или они просто забыли и им повезло.

См. Раздел 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 как пространства Фурье сразу, без выполнения и БПФ, приравнивается к окну Гаусса в с гораздо большей сигмой в пространственной области.

person chappjc    schedule 23.10.2014
comment
Спасибо за такой ответ! Итак, очень быстрый вопрос. Скажем, стандартное отклонение моего гауссовского ядра в пространственной области равно 2, тогда стандартное отклонение ядра с преобразованием Фурье равно 0,5? - person Luca; 24.10.2014
comment
@Luca Я думаю, это пропорционально стандартному отклонению. Возможно, проверьте онлайн или на math.stackexchange.com или dsp.stackexchange.com для получения математических подробностей. - person chappjc; 24.10.2014