Fourier transform of 2D Gaussian kernel is not matching up with its counterpart in the spatial domain

Question:

We know the Fourier transform of a Gaussian filter is again Gaussian in the frequency domain, I have written the following method to build a Gaussian kernel:

def get_gaussian(size, sigma):
  g_kernel = np.zeros((size,size))
  x_center = size // 2
  y_center = size // 2
  for i in range(size):
    for j in range(size):
      g_kernel[i,j] = np.exp(-((i - x_center)**2 + (j - y_center)**2) / (2*sigma**2))
  return 1/(2*np.pi * sigma**2)* g_kernel

plt.figure(figsize=(8, 10))
sigma = 20
g_spatial = get_gaussian(img2.shape[0],sigma)
plt.imshow(g_spatial)

plt.figure(figsize=(8, 10))
g_frequnecy = fft.fftshift(fft.fft2(g_spatial))
plt.imshow(np.abs(g_frequnecy))

plt.figure(figsize=(8, 10))
g_spatial = get_gaussian(img2.shape[0],sigma / (np.sqrt(2) * np.pi))
plt.imshow(g_spatial)

The second and third Gaussians don’t seem to match up at all. I will attach the pictures of all three Gaussian kernels below. I’m pretty sure I have calculated the variance of each Gaussian kernel such that they would match based on the 2D Fourier transform of a Gaussian kernel. Where have I made a mistake?

enter image description here

enter image description here

enter image description here

Asked By: nothatcreative5

||

Answers:

In the frequency domain, the Gaussian has a sigma of size / (2 * pi * sigma), with size the size of the image, and sigma the spatial-domain sigma. Yes, for a non-square image, an isotropic Gaussian in the spatial domain is not isotropic in the frequency domain.

Your computation sigma / (np.sqrt(2) * np.pi) is wrong. One quick way to tell it’s not correct is that a larger sigma in the spatial domain also produces a larger sigma in the frequency domain using your computation. But we know that scaling up (==making larger) in the spatial domain scales the frequency domain down, as larger wavelengths have smaller frequencies.

Answered By: Cris Luengo