0% ont trouvé ce document utile (0 vote)
10 vues8 pages

TFD d'images avec Python

Le document traite de la transformée de Fourier d'une image monochrome, en expliquant la transformée de Fourier continue et discrète, ainsi que les méthodes d'échantillonnage et d'approximation. Il présente également des fonctions Python pour manipuler des images, calculer la TFD, et effectuer des filtrages, en utilisant des bibliothèques comme PIL et NumPy. Enfin, il décrit comment centrer la fréquence nulle et restituer l'ordre initial des fréquences après filtrage.

Transféré par

hasina.donatien22
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
10 vues8 pages

TFD d'images avec Python

Le document traite de la transformée de Fourier d'une image monochrome, en expliquant la transformée de Fourier continue et discrète, ainsi que les méthodes d'échantillonnage et d'approximation. Il présente également des fonctions Python pour manipuler des images, calculer la TFD, et effectuer des filtrages, en utilisant des bibliothèques comme PIL et NumPy. Enfin, il décrit comment centrer la fréquence nulle et restituer l'ordre initial des fréquences après filtrage.

Transféré par

hasina.donatien22
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Frédéric Legrand Licence Creative Commons 1

Transformée de Fourier d'une image

1. Transformée de Fourier et transformée de Fourier discrète

On considère une image monochrome (niveaux de gris) représentée par une fonction
de deux variables réelles, à valeurs complexes, notée u(x, y).
La transformée de Fourier de cette image est la fonction à deux variables réelles et à
valeurs complexes dénie par :
Z ∞ Z ∞
S(fx , fy ) = u(x, y) exp(−i2π(fx x + fy y)) dxdy
−∞ −∞

On considère à présent un échantillonnage de l'image sur un domaine rectangulaire de


dimensions (Lx , Ly ) centré en (x, y) = (0, 0) et comportant (Nx , Ny ) points. La matrice
U est dénie par :

Lx Lx
xk = − +k 0 ≤ k ≤ Nx − 1
2 Nx
Ly Ly
ym = − +m 0 ≤ m ≤ Ny − 1
2 Ny
Um,k = u(xk , ym )

La matrice U a donc Nx colonnes et Ny lignes.


Considérons une approximation de la transformée de Fourier obtenue par la méthode
des trapèzes sur le domaine considéré :

N x −1 Ny −1    
Lx Ly X X Lx Ly
S(fx , fy ) ' exp (iπ(fx Lx + fy Ly )) Um,k exp −i2πfx k exp −i2πfy m
Nx Ny k=0 m=0
Nx Ny

En pratique, on calcule cette approximation pour les fréquences spatiales suivantes :

n
fx,n = 0 ≤ n ≤ Nx − 1
Lx
l
fy,l = 0 ≤ l ≤ Ny − 1
Ly

La transformée de Fourier discrète (TFD) associe à la matrice U une matrice V de mêmes


dimensions, dénie par :
Nx −1 N y −1    
1 X X n l
Vn,l = Um,k exp −i2πk exp −i2πm
Nx Ny k=0 m=0 Nx Ny
Remarque : les TFD calculées par les fonctions FFT des logiciels omettent parfois l'in-
verse de Nx Ny en facteur.
L'approximation de l'intégrale est :

S(fx,n , fy,l ) ' Lx Ly exp (iπ(n + l)) Vn,l


Frédéric Legrand Licence Creative Commons 2

La fréquence d'échantillonnage est constituée par la paire :


 
Nx Ny
fe = ,
Lx Ly
On vérie facilement la propriété suivante de la TFD :

Vn+Nx ,l = Vn,l
Vn,l+Ny = Vn,l
Cette propriété correspond à la périodicité du spectre de l'image échantillonnée. La
période du spectre est égale à la fréquence d'échantillonnage. En général, on cherche à
calculer une approximation de la transformée de Fourier ne faisant pas apparaitre cet
eet de l'échantillonnage. Pour cela, il faut limiter la plus haute fréquence à la moitié
de la fréquence d'échantillonnage. Pour simplier, on suppose que Nx et Ny sont pairs.
La TFD donne une approximation de la transformée de Fourier pour les fréquences
suivantes :

n Nx
fx,n = 0≤n≤
Lx 2
l Ny
fy,l = 0≤l≤
Ly 2
De plus, la périodicité de la TFD permet d'accéder aux opposées de ces fréquences. En
eet :

V−n,l = V−n+Nx ,l
Vn,−l = Vn,−l+Ny
Les Nx indices n correspondent aux fréquences suivantes :
Nx Nx
1 2 −1 2 1
0, , ,..., 2 , − 2 ,...,− , −
Lx Lx Lx Lx Lx Lx
La même relation est valable pour les fréquences de l'axe y .
Pour certains calculs (ltrage, diraction), il est utile de placer la fréquence nulle
au milieu de la matrice, de manière à obtenir des fréquences croissantes en fonction des
indices. Notons V C cette matrice centrée. Dans cette matrice, le point de fréquence nulle
doit être placé aux indices suivants :
Ny Nx
( − 1, − 1)
2 2
Pour l'axe x, il y a donc N2x + 1 indices correspondant à des fréquences positives (ou
nulle) et N22 − 1 indices correspondant à des fréquences strictement négatives.
Pour construire la matrice V C , il faut utiliser la transformation d'indice suivante :

Nx Nx
nc = − 1 + n si 0 ≤ n ≤
2 2
Nx Nx
nc = − − 1 + n si + 1 ≤ n ≤ Nx − 1
2 2
Frédéric Legrand Licence Creative Commons 3

2. TFD avec Python

Le module PIL permet de manipuler des images. L'image suivante a 200x100 pixels.

Chargement de l'image :
import Image
imA = [Link]("[Link]")

print([Link])
--> (200, 100)

Les données de l'image sont récupérées sous forme d'une liste par :
imAdata = list([Link]())

print(imAdata[50])
--> (0, 0, 0)

Le module [Link] dénit quelques fonctions utiles pour manipuler ces données
et calculer la TFD :
La fonction suivante construit une matrice à partir d'une des couches RGB de l'image.
from numpy import *
from pylab import *
from math import *

def image2matrice(im,c):
data = list([Link]())
s = [Link]
Nx = s[0]
Ny = s[1]
U = zeros((Ny,Nx),dtype=float)
for k in range(Nx):
Frédéric Legrand Licence Creative Commons 4

for m in range(Ny):
U[m,k] = float(data[m*Nx+k][c])/255.0
return U

La fonction suivante permet de centrer la fréquence nulle :


def matriceCentre(matrice):
s = [Link]
Nx = s[1]
Ny = s[0]
nx = Nx/2
ny = Ny/2
Mat = zeros((Ny,Nx),dtype=complex)
for n in range(Nx):
for l in range(Ny):
if n<=nx:
nc=nx-1+n
else:
nc=-nx-1+n
if l<=ny:
lc=ny-1+l
else:
lc=-ny-1+l
Mat[lc,nc] = matrice[l,n]
return Mat

Pour la représentation graphique, on peut calculer le module au carré de chaque


valeur (spectre de puissance) :
def matricePuissance(matrice):
s = [Link]
P = zeros(s,dtype=float)
for k in range(s[1]):
for m in range(s[0]):
a = abs(matrice[m,k])
P[m,k] = a*a
return P

La fonction suivante fournit le module :


def matriceModule(matrice):
s = [Link]
P = zeros(s,dtype=float)
for k in range(s[1]):
for m in range(s[0]):
P[m,k] = abs(matrice[m,k])
return P
Frédéric Legrand Licence Creative Commons 5

La fonction suivante permet de convertir une matrice en matrice image RGB (liste
python standard), en eectuant une normalisation et une correction gamma. La correc-
tion gamma permet de simuler la réponse de l'oeil pour les gures de diraction.
def matriceImage(matrice,gamma,rgb):
s = [Link]
a=1.0/gamma;
norm=[Link]()
im = []
for m in range(s[0]):
L = []
for k in range(s[1]):
v = pow(float(matrice[m,k])/norm,a)
[Link]([v*rgb[0],v*rgb[1],v*rgb[2]])
[Link](L)
return im

La fonction suivante eectue la même opération avec un facteur de normalisation


fourni en argument. Les valeurs supérieures à 1 sont ramenées à 1.
def matriceImageN(matrice,gamma,rgb,norm):
s = [Link]
a=1.0/gamma;
im = []
for m in range(s[0]):
L = []
for k in range(s[1]):
v = pow(float(matrice[m,k])/norm,a)
if (v>1):
v=1
[Link]([v*rgb[0],v*rgb[1],v*rgb[2]])
[Link](L)
return im

La fonction suivante ache le spectre avec le module Matplotlib. Les axes sont
gradués avec les fréquences spatiales. Les dimensions de l'image sont données en ar-
gument :
def plotSpectre(matrice,Lx,Ly):
Nx = len(matrice[0])
Ny = len(matrice)
fxm = Nx/(2*Lx)
fym = Ny/(2*Ly)
imshow(matrice,extent=[-fxm,fxm,-fym,fym])

Ci-dessous le calcul de la TFD de l'image précédemment chargée et l'achage du


spectre de puissance après centrage de la fréquence nulle.
Frédéric Legrand Licence Creative Commons 6

from TfdImage import *


from math import *
from [Link] import fft2, ifft2
U=image2matrice(imA,0)
V=fft2(U)
VC = matriceCentre(V)
P = matricePuissance(VC)
imP = matriceImage(P,2.5,[1.0,0,0])
plotSpectre(imP,2.0,1.0)

Pour eectuer un ltrage sur la transformée de Fourier de l'image, on doit dénir une
fonction de transfert. Voici par exemple un ltrage passe-bas :

def transfert(fx,fy):
fc=20.0
return 1.0/pow((1+pow(fx/fc,2))*(1+pow(fy/fc,2)),2)

La fonction suivante eectue le ltrage sur une matrice de TFD dont la fréquence
nulle est centrée. Les dimensions de l'image et la fonction de transfert sont données en
argument.

def matriceFiltre(matrice,Lx,Ly,H):
s = [Link]
Nx = s[1]
Ny = s[0]
Frédéric Legrand Licence Creative Commons 7

nx = Nx/2
ny = Ny/2
Mat = zeros((Ny,Nx),dtype=complex)
for n in range(Nx):
for l in range(Ny):
fx = float(n-nx-1)/Lx
fy = float(l-ny-1)/Ly
Mat[l,n] = matrice[l,n]*H(fx,fy)
return Mat

Voyons l'utilisation de cette fonction pour la fonction de transfert dénie plus haut :

VCF = matriceFiltre(VC,2.0,1.0,transfert)
PF = matricePuissance(VCF)
imPF = matriceImage(PF,2.5,[1.0,0,0])
plotSpectre(imPF,2.0,1.0)

Pour obtenir l'image ltrée, il faut tout d'abord restituer l'ordre initial des fréquences,
c'est-à-dire placer les fréquences nulles sur les bords. La fonction suivante eectue cette
opération :

def matriceBords(matrice):
s = [Link]
Nx = s[1]
Ny = s[0]
Frédéric Legrand Licence Creative Commons 8

nx = Nx/2
ny = Ny/2
Mat = zeros((Ny,Nx),dtype=complex)
for nc in range(Nx):
for lc in range(Ny):
if nc<nx-1:
n=nc+nx+1
else:
n=nc-nx+1
if lc<ny-1:
l=lc+ny+1
else:
l=lc-ny+1
Mat[l,n]=matrice[lc,nc]
return Mat

Voyons le résultat après application de la TFD inverse :

VF = matriceBords(VCF)
UF=ifft2(VF)
imageF = matriceImage(UF,1.0,[1.0,1.0,1.0])
figure()
imshow(imageF)

Vous aimerez peut-être aussi