Применение фильтра низких частот и Лапласа гауссовского фильтра в частотной области - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь применить эти два фильтра в частотной области.Сначала фильтр нижних частот, затем фильтр Лапласа Гаусса.Хотя мое изображение фильтруется правильно, вывод оборачивается.Кроме того, выходное изображение смещено (выглядит так, как если бы изображение было дублировано).

Вот вход и выход: Фильтр до и после

Вот мой код:

# Padding the image
image = Pad(image)

# The mask for low-pass filter
rows, cols = image.shape
center = (rows, cols)
crow, ccol = rows/2, cols/2
Low_mask = np.zeros((rows, cols), dtype=np.float32)
Low_mask[crow-cutoff:crow+cutoff, ccol-cutoff:ccol+cutoff] = 1

# Shifting the mask (low-pass)
Low_mask_dft = np.fft.fft2(Low_mask)
Low_mask_dft_shift  = np.fft.fftshift(Low_mask_dft)

# Shifting the image
image_dft = np.fft.fft2(image)
image_dft_shift = np.fft.fftshift(image_dft)

# Performing the convolution
image_fdomain = np.multiply(image_dft_shift, Low_mask_dft_shift)

# Shifting the mask (LOG)
LOGmask = GaussKernel(center)
LOGmask_dft = np.fft.fft2(LOGmask)
LOGmask_dft_shift = np.fft.fftshift(LOGmask_dft)

# Performing the convolution
frequency_image = np.multiply(image_fdomain, LOGmask_dft_shift)

# Now, return the image back to it's original form
result = np.fft.ifftshift(frequency_image)
result = np.fft.ifft2(result)
result = np.absolute(result)

return result

1 Ответ

0 голосов
/ 31 мая 2018

Что вам нужно сделать, это решить, какое граничное условие вы используете.
Естественное значение для частотной области (для дискретных данных): Круговая / циклическая свертка , что означает круговое граничное условие.

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

Я создал небольшой скрипт MATLAB (вы сможете легко скопировать его в Python), чтобы показать, как это должно быть сделано.

Главное:

numRows = size(mI, 1);
numCols = size(mI, 2);

% Convolution in Spatial Domain
% Padding for Cyclic Convolution
mOGaussianRef = conv2(PadArrayCircular(mI, kernelRadius), mGaussianKernel, 'valid');
mOLogRef = conv2(PadArrayCircular(mI, kernelRadius), mLog, 'valid');

% Convolution in Frequency Domain
% Padding and centering of the Kernel
mGaussianKernel(numRows, numCols) = 0;
mGaussianKernel = circshift(mGaussianKernel, [-kernelRadius, -kernelRadius]);

mLog(numRows, numCols) = 0;
mLog = circshift(mLog, [-kernelRadius, -kernelRadius]);

mOGaussian  = ifft2(fft2(mI) .* fft2(mGaussianKernel), 'symmetric');
mOLog       = ifft2(fft2(mI) .* fft2(mLog), 'symmetric');

convErr = norm(mOGaussianRef(:) - mOGaussian(:), 'inf');
disp(['Gaussian Kernel - Cyclic Convolution Error (Infinity Norm) - ', num2str(convErr)]);

convErr = norm(mOLogRef(:) - mOLog(:), 'inf');
disp(['LoG Kernel - Convolution Error (Infinity Norm) - ', num2str(convErr)]);

Что приводит к:

Gaussian Kernel - Cyclic Convolution Error (Infinity Norm) - 3.4571e-06
LoG Kernel - Convolution Error (Infinity Norm) - 5.2154e-08

А именно, что он должен делать.

Полныйкод в моем переполнении стека Q50614085 Github Repository .

Если вы хотите увидеть, как это должно быть сделано для других граничных условий (или линейной свертки), взгляните на FreqDomainConv.m.

...