Что вам нужно сделать, это решить, какое граничное условие вы используете.
Естественное значение для частотной области (для дискретных данных): Круговая / циклическая свертка , что означает круговое граничное условие.
Как только вы настроите это и подготовите данные соответствующим образом, все будет работать как нужно.
Я создал небольшой скрипт 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
.