MATLAB Answers


Why image is shifted when using ifft2

Asked by Khang Truong on 2 Oct 2019
Latest activity Commented on by Cris LaPierre
on 3 Oct 2019
Hi, I'm implementing 2-D convolution by using FFT. Here is my code:
img = im2single(imread('dog.bmp'));
filter = fspecial('gaussian', 53, 3);
F = fft2(img);
mask = fft2(filter, size(img, 1), size(img, 2));
filtered_img = ifft2(F .* mask);
Here is the original image: dog.bmp
And the result:
Why this happens? How can I fix it? Please help me.
Many thanks.


Sign in to comment.

1 Answer

Answer by Cris LaPierre
on 3 Oct 2019
Edited by Cris LaPierre
on 3 Oct 2019

The shift is related to your hsize value in fspecial (shifted ~0.5*hsize in both X and Y).
I'm not sure I can do any better explaining than what you can find googling, but you need to center your frequency domain in the center of the image. You can do this using fftshift and ifftshift. See here, and here.
Also note that, in the comment of the second link, there is a recommendation to use psf2otf to take the FFT of a point spread function.
After some playing around with a built in image, I came up with this code:
img = im2single(imread('autumn.tif'));
filter = fspecial('gaussian', 53, 2);
F = fftshift(fft2(img));
mask = fftshift(psf2otf(filter,[size(img, 1), size(img, 2)]));
filtered_img = ifft2(ifftshift(F .* mask));

  1 Comment

A little more playing suggests that you really only need to replace
mask = fft2(filter, size(img, 1), size(img, 2));
mask = psf2otf(filter, [size(img, 1), size(img, 2)]);
in your code.

Sign in to comment.