Прежде всего, нет необходимости сдвигать результат FFT, просто чтобы сдвинуть его обратно перед выполнением IFFT. Это просто означает, что они не влияют на результат. Умножение двух массивов происходит одинаково, независимо от того, сдвигаете ли вы их оба или нет.
Проблема, которую вы заметили в своих выходных данных, заключается в том, что четыре квадранта поменялись местами. Причина этого заключается в том, что фильтр смещен наполовину по своему размеру, вызывая такое же смещение на выходе.
Почему это смещено? Ну, потому что БПФ помещает начало координат в верхний левый угол изображения. Это верно не только для вывода БПФ, но и для его ввода. Таким образом, вам нужно сгенерировать ядро, источник которого находится в верхнем левом углу. Как? Просто примените ifftshift
к нему до вызова fft
:
freq = fp.fft2(im)
freq_kernel = fp.fft2(fp.ifftshift(kernel))
convolved = freq*freq_kernel
im_out = fp.ifft2(convolved).real
Обратите внимание, что ifftshift
смещает начало координат от центра к верхнему левому углу, тогда как fftshift
смещает его от угла к центру.