""" Simple image blur by convolution with a Gaussian kernel """ import numpy as np from scipy import fftpack import matplotlib.pyplot as plt # read image img = plt.imread('../../data/elephant.png') # prepare an 1-D Gaussian convolution kernel t = np.linspace(-10, 10, 30) bump = np.exp(-0.1*t**2) bump /= np.trapz(bump) # normalize the integral to 1 # make a 2-D kernel out of it kernel = bump[:, np.newaxis] * bump[np.newaxis, :] # padded fourier transform, with the same shape as the image kernel_ft = fftpack.fft2(kernel, shape=img.shape[:2], axes=(0, 1)) # convolve img_ft = fftpack.fft2(img, axes=(0, 1)) img2_ft = kernel_ft[:, :, np.newaxis] * img_ft img2 = fftpack.ifft2(img2_ft, axes=(0, 1)).real # clip values to range img2 = np.clip(img2, 0, 1) # plot output plt.imshow(img2) plt.show() # Further exercise (only if you are familiar with this stuff): # # A "wrapped border" appears in the upper left and top edges of the # image. This is because the padding is not done correctly, and does # not take the kernel size into account (so the convolution "flows out # of bounds of the image"). Try to remove this artifact.