Fourierova transformace

Spojitá fourierova tranformace

$$ F(u,v)=\int \int_{-\infty}^{\infty} f(x,y) e^{-j2\pi(ux+vy)} dx dy $$

Kde $u$ a $v$ jsou souřadnice ve frekvenčním prostoru a $x$ a $y$ jsou souřadnice v obrazovém prostoru. $F(u,v)$ je 2D spektrum obrazové funkce $F(x,y)$

Diskrétní fourierova transformace

$$ F(u,v)=\sum_{m=-\infty}^{\infty} \sum_{n=-\infty}^{\infty} f[m,n]e^{-j2\pi(umx_o+vny_o)} $$
In [1]:
%pylab inline
import numpy as np
import matplotlib.pyplot as plt

from skimage import data
import skimage.io
Populating the interactive namespace from numpy and matplotlib
/Users/mjirik/miniconda/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
In [13]:
 

Výstup fourierovy transformace je (relativně) souměrný podle středu a má běžně nízké frekvence na okrajích. Pro vizualizaci a lepší představu se kvadranty obrazu přehazují pomocí funkce fftshift()

fft shift

In [2]:
im = data.camera()

ft = np.fft.fft2(im)
ftshift = np.fft.fftshift(ft)
spek = 20*np.log(np.abs(ftshift))

# vizualizace
plt.subplot(121)
plt.imshow(spek, cmap = 'gray')
plt.title('Spektrum')

plt.subplot(122)
plt.imshow(im, cmap='gray')
Out[2]:
<matplotlib.image.AxesImage at 0x7f1f2c0f1310>

Filtrace

In [15]:
x, y = np.indices(im.shape)
center1 = (256, 256)
radius1 = 20
mask = (x - center1[0])**2 + (y - center1[1])**2 < radius1**2

plt.imshow(mask)
Out[15]:
<matplotlib.image.AxesImage at 0x7871b50>
In [16]:
#ftshift * mask
ftshift_mask = ftshift*(mask)
ftishift_back = np.fft.ifftshift(ftshift_mask)
im_back = np.fft.ifft2(ftishift_back)
im_back = np.abs(im_back)

# Visualization
plt.figure(figsize=(9, 4))
plt.subplot(121)
plt.imshow(im_back, cmap='gray')
plt.subplot(122)
plt.imshow(np.log(np.abs(ftshift_mask)), cmap='gray')
Out[16]:
<matplotlib.image.AxesImage at 0x59e4310>
In [17]:
# Vytvoření filtru
x, y = np.indices(im.shape)
center2 = (256, 256)
radius2 = 80
mask2 = (x - center1[0])**2 + (y - center1[1])**2 < radius1**2



# Filtrace a zpětná FT
ftshift_mask = ftshift*(1-mask2)
ftishift_back = np.fft.ifftshift(ftshift_mask)
im_back2 = np.fft.ifft2(ftishift_back)
im_back2 = np.abs(im_back2)

# Visualization
plt.figure(figsize=(9, 4))
plt.subplot(121)
plt.imshow(im_back2, cmap='gray')
plt.subplot(122)

plt.imshow(np.log(np.abs(ftshift_mask)), cmap='gray')
Out[17]:
<matplotlib.image.AxesImage at 0x5d4eb10>

Přílkad

In [33]:
clown = skimage.io.imread('http://www.imagemagick.org/Usage/fourier/clown.jpg')
twigs = skimage.io.imread('http://www.imagemagick.org/Usage/fourier/twigs.jpg')