Чтобы вычислить свертку через область Фурье, сначала нужно заполнить ядро нулями, чтобы иметь тот же размер, что и изображение, затем вычислить БПФ как изображения, так и дополненного ядра, а затем умножить эти два частотных спектра.Важно, чтобы при заполнении источник ядра был в правильном месте.См. этот ответ для получения подробной информации о том, как правильно выполнить заполнение.
Однако для вычисления производных вы не хотите делать это таким образом.Вместо этого используйте свойство Фурье , согласно которому производная в пространственной области является умножением на jω .
Фильтр [1,0,-1]
(или [0,1,-1]
или любое другоехочу использовать) представляет собой дискретное приближение к производной.Если вы пройдете через область Фурье, вы также можете вычислить точные производные.
Например, в MATLAB вы должны сделать:
a = imread('cameraman.tif');
A = fft2(a);
N = size(A,2); % we're computing the x-derivative here, that is dimension 2 in MATLAB
w = ifftshift((0:N-1)-floor(N/2)) * (pi / N);
B = A .* (1i * w); % for MATLAB R2016a and older, use bsxfun here
b = real(ifft2(B));