title: Convolving image with kernel in Fourier domain
body: <p>I'm using zero padding around my image and convolution kernel, converting them to the Fourier domain, and inverting them back to get the convolved image, see code below. The result, however, is wrong. I was expecting a blurred image, but the output is four shifted quarters. Why is the output wrong, and how can I fix the code?</p>
  
  <p>Input image:</p>
  
  <p><img src="https://i.stack.imgur.com/n9xrI.png" alt="input image"></p>
  
  <p>Result of convolution:</p>
  
  <p><img src="https://i.stack.imgur.com/ZQLmv.png" alt="output image"></p>
  
  <pre><code>from PIL import Image,ImageDraw,ImageOps,ImageFilter
  import numpy as np 
  from scipy import fftpack
  from copy import deepcopy
  import imageio
  ## STEP 1 ##
  im1=Image.open("pika.jpeg")
  im1=ImageOps.grayscale(im1)
  im1.show()
  print("s",im1.size)
  ## working on this image array
  im_W=np.array(im1).T
  print("before",im_W.shape)
  if(im_W.shape[0]%2==0):
  im_W=np.pad(im_W, ((1,0),(0,0)), 'constant')
  if(im_W.shape[1]%2==0):
  im_W=np.pad(im_W, ((0,0),(1,0)), 'constant')
  print("after",im_W.shape)
  Boxblur=np.array([[1/9,1/9,1/9],[1/9,1/9,1/9],[1/9,1/9,1/9]])
  dim=Boxblur.shape[0]
  
  ##padding before frequency domain multipication
  pad_size=(Boxblur.shape[0]-1)/2
  pad_size=int(pad_size)
  ##padded the image(starts here)
  
  p_im=np.pad(im_W, ((pad_size,pad_size),(pad_size,pad_size)), 'constant')
  t_b=(p_im.shape[0]-dim)/2
  l_r=(p_im.shape[1]-dim)/2
  t_b=int(t_b)
  l_r=int(l_r)
  
  ##padded the image(ends here)
  
  ## padded the kernel(starts here)
  k_im=np.pad(Boxblur, ((t_b,t_b),(l_r,l_r)), 'constant')
  print("hjhj",k_im)
  print("kernel",k_im.shape)
  
  ##fourier transforms image and kernel
  fft_im = fftpack.fftshift(fftpack.fft2(p_im))
  fft_k  = fftpack.fftshift(fftpack.fft2(k_im))
  con_in_f=fft_im*fft_k
  ifft2 = abs(fftpack.ifft2(fftpack.ifftshift(con_in_f)))
  convolved=(np.log(abs(ifft2))* 255 / np.amax(np.log(abs(ifft2)))).astype(np.uint8)
  final=Image.fromarray(convolved.T)
  final.show()
  u=im1.filter(ImageFilter.Kernel((3,3), [1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9], scale=None, offset=0))
  u.show()
  </code></pre>