import numpy as np
import matplotlib.pyplot as plt
import cv2
plt.rcParams['figure.figsize'] = [15, 15]
u = plt.imread('images/hill.png').astype(float)
plt.subplot(1,2,1)
plt.imshow(u,cmap='gray')
v = plt.imread('images/ytile0006.png').astype(float)
plt.subplot(1,2,2)
plt.imshow(v,cmap='gray')
plt.show()
fu = np.fft.fft2(u)
fv = np.fft.fft2(v)
modfu = np.abs(fu)
argfu = np.angle(fu)
modfv = np.abs(fv)
argfv = np.angle(fv)
fw1 = modfu * np.exp(1j*argfv)
fw2 = modfv * np.exp(1j*argfu)
w1= np.real(np.fft.ifft2(fw1))
w2= np.real(np.fft.ifft2(fw2))
plt.subplot(1,2,1)
plt.imshow(w1,cmap='gray')
plt.subplot(1,2,2)
plt.imshow(w2,cmap='gray')
<matplotlib.image.AxesImage at 0x10d7c5710>
u = plt.imread('images/denim.bmp')
u = cv2.cvtColor(u, cv2.COLOR_BGR2GRAY).astype(float)/256
plt.rcParams['figure.figsize'] = [15, 15]
plt.subplot(2,2,1)
plt.imshow(u,cmap='gray')
v = plt.imread('images/mer.bmp')
v = cv2.cvtColor(v, cv2.COLOR_BGR2GRAY).astype(float)/256
v = v[:334,:334]
plt.subplot(2,2,2)
plt.imshow(v,cmap='gray')
fu = np.fft.fft2(u)
fv = np.fft.fft2(v)
modfu = np.abs(fu)
argfu = np.angle(fu)
modfv = np.abs(fv)
argfv = np.angle(fv)
fw1 = modfu * np.exp(1j*argfv)
fw2 = modfv * np.exp(1j*argfu)
w1= np.real(np.fft.ifft2(fw1))
w2= np.real(np.fft.ifft2(fw2))
plt.subplot(2,2,3)
plt.imshow(w1,cmap='gray')
plt.subplot(2,2,4)
plt.imshow(w2,cmap='gray')
plt.show()
def zoom_fourier(u,r):
M, N = u.shape
fv = np.zeros((r*M,r*N)).astype(complex)
fu = np.fft.fft2(u)
fv[r*M//2-M//2:r*M//2+M//2,r*N//2-N//2:r*N//2+N//2] = np.fft.fftshift(fu)
fv = np.fft.fftshift(fv)
v = np.fft.ifft2(fv)
v = np.real(v)
return v
u = plt.imread('images/ytile0006.png').astype(float)
u = u[:160,:160]
v = zoom_fourier(u,2)
plt.rcParams['figure.figsize'] = [15, 15]
plt.subplot(1,2,1)
plt.imshow(u,cmap='gray')
plt.subplot(1,2,2)
plt.imshow(v,cmap='gray')
plt.show()
plt.rcParams['figure.figsize'] = [15, 15]
plt.subplot(1,2,1)
plt.imshow(u[100:200,100:200],cmap='gray')
plt.subplot(1,2,2)
plt.imshow(v[200:400,200:400],cmap='gray')
plt.show()
v = zoom_fourier(u,8)
plt.rcParams['figure.figsize'] = [15, 15]
plt.subplot(1,2,1)
plt.imshow(u,cmap='gray')
plt.subplot(1,2,2)
plt.imshow(v,cmap='gray')
plt.show()
def translation_fourier(u,tau):
M, N = u.shape
fu = np.fft.fft2(u)
fv = np.zeros((M,N)).astype(complex)
fu = np.fft.fftshift(fu)
for k in range(-M//2,M//2):
for l in range(-N//2,N//2):
indk = k+M//2
indl = l+N//2
fv[indk,indl] = fu[indk,indl] * np.exp(-1j*k*tau[0]*2*np.pi/M) * np.exp(-1j*l*tau[1]*2*np.pi/N)
fv = np.fft.fftshift(fv)
v = np.real(np.fft.ifft2(fv))
return v
def translation_fourier(u,tau):
M, N = u.shape
fu = np.fft.fft2(u)
fu = np.fft.fftshift(fu)
e1 = np.exp(-1j*np.arange(-M//2,M//2)*tau[0]*2*np.pi/M).reshape(M,1)
e2 = np.exp(-1j*np.arange(-N//2,N//2)*tau[1]*2*np.pi/N).reshape(1,N)
fv = fu * e1 * e2
fv = np.fft.fftshift(fv)
v = np.real(np.fft.ifft2(fv))
return v
u = plt.imread('images/ytile0006.png').astype(float)
v = translation_fourier(u,[101.21,51.32])
plt.imshow(v,cmap="gray")
plt.show()
# bonus : on visualise les translations fractionnaires intermediaires
# entre 0 et 1 pixel sur une image d'un carre blanc sur fond noir
# de taille 10x10
u = np.zeros((10,10))
u[2:6,2:6] = 1
plt.rcParams['figure.figsize'] = [15, 5]
for k in range(10):
plt.subplot(2,5,k+1)
v = translation_fourier(u,[k/9,k/9])
plt.imshow(v,cmap="gray")
plt.show()
def rotation_fourier(u,theta):
# rotation d'une image discrete u par un angle theta
# question p.47 des slides
M, N = u.shape
fu = np.fft.fft(u, axis=0)
fu = np.fft.fftshift(fu)
# On construit maintenant fv = DFT de v.
fv = np.zeros((M,N)).astype(complex)
ks = np.arange(-M//2,M//2).reshape(M,1)
ls = np.arange(-N//2,N//2).reshape(1,N)
e1 = np.exp(-1j*ks*2*np.pi*(-np.tan(theta/2)*ls)/M)
fv = fu * e1
fv = np.fft.fftshift(fv)
v = np.real(np.fft.ifft(fv, axis=0))
fv = np.fft.fft(v, axis=1)
fv = np.fft.fftshift(fv)
e2 = np.exp(1j*(np.sin(theta)*ks)*ls*2*np.pi/N)
fv = fv * e2
fv = np.fft.fftshift(fv)
v = np.real(np.fft.ifft(fv, axis=1))
fv = np.fft.fft(v, axis=0)
fv = np.fft.fftshift(fv)
fv = fv * e1
fv = np.fft.fftshift(fv)
v = np.real(np.fft.ifft(fv, axis=0))
return v
u = plt.imread('images/ytile0006.png').astype(float)
v = rotation_fourier(u,np.pi/3)
plt.imshow(v,cmap="gray")
plt.show()