A-TRAVAUX PRATIQUES DE TRAITEMENT NUMERIQUES D'IMAGES
TP II : REPRESENTATION ET FILTRAGE FREQUENTIELLES
Ce TP a pour objectif d’apprendre à :
Afficher, et manipuler la représentation fréquentiel d’une image
Identifier les hautes et basses fréquences sur la représentation fréquentielle
Appliquer un seuillage fréquentiel
1. Rappel :
1.1 Transformée de Fourier d’une image
Soit g(m, n) une image (renormalisée) de dimension M × N, où g(m, n) est l’intensité (valeur entre 0 et 1)
du pixel à la position (m, n). On définit sa transformée de Fourier comme la transformée de Fourier discrète
bidimensionnelle suivante :
𝑁−1 𝑀−1
1 𝑢𝑥 𝑣𝑦
𝐺(𝑢, 𝑣) = ∑ ∑ 𝑔(𝑚, 𝑛)𝑒 −𝑖2𝜋( 𝑁 +𝑀 )
𝑀𝑁
𝑛=0 𝑚=0
Le choix du coefficient (1/MN) est dans une certaine mesure arbitraire, il garantit ici que la composante
constante G(0, 0) est la moyenne du signal image.
Cette transformée de Fourier se calcule sous MATLAB avec la commande fft2, qui prend en paramètre
une image renormalisée (à valeurs comprises entre 0 et 1) et renvoie une matrice complexe de même taille
que l’image et qui contient les différents coefficients de la transformée de Fourier. En revanche, cette
transformée ne tient pas compte du fait que les images sont à valeurs réelles et que leur spectre possède
donc une symétrie hermitienne. Il faut donc comme en traitement du signal utiliser l’instruction fftshift pour
placer la fréquence nulle au centre de l’image et ainsi mieux visualiser les propriétés de symétrie.
1.2 Visualisation de la transformée de Fourier d’une image
Pour afficher la transformée de Fourier d’une image sous la forme d’une image, il y a deux problèmes :
cette quantité est complexe, et ses valeurs ne sont pas comprises entre 0 et 1.
Pour répondre à la première problématique, on représente souvent non pas la transformée de Fourier
mais son module. Il y a plusieurs façons de faire cela : tout comme en traitement du signal, on peut
visualiser le module soit avec une échelle linéaire soit avec une échelle logarithmique (décibel).
• L’échelle linéaire rend compte effectivement de la proportion avec laquelle la forme de l’image
résulte des différentes sinusoïdes élémentaires. Elle permet de mettre en évidence les phénomènes
fréquentiels majeurs. En revanche, souvent l’essentiel du spectre est localisé sur la fréquence nulle
(qui correspond à la moyenne de l’image) ce qui peut masquer certains phénomènes plus fins que
l’on veut observer.
• L’échelle logarithmique permet de visualiser avec précision le spectre pour les fréquences où il
prend des valeurs très faibles (ce qui est impossible avec l’échelle linéaire). En revanche, comme elle
amplifie la dynamique de visualisation, elle peut aussi conduire à des erreurs d’interprétation. On
1
introduit dans cette échelle un paramètre C qui permet de contrôler la dynamique et d’éviter de
prendre des logarithmes de 0!
Pour répondre à la deuxième problématique, il faut, après avoir calculé le module (en échelle linéaire ou
Logarithmique), ramener toutes les valeurs entre 0 et 1. Pour cela, on peut utiliser la fonction mat2gray de
MATLAB, qui renormalise la matrice en fixant le minimum à 0 et le maximum à1.
1.3 Transformée de Fourier inverse
La transformée de Fourier discrète inverse est :
Cette formule exprime le fait que les images sont des combinaisons linéaires d’images formées de sinusoïdes.
Etant donnée une transformée de Fourier (avant fftshift !), on calcule la transformée de Fourier inverse grâce à la
fonction ifft2 de MATLAB. Etant données les erreurs de précision de MATLAB, il est plus prudent de prendre ensuite la
partie entière pour s’assurer que l’image reconstruite est bien réelle.
1.4 Interprétations
En observant le spectre (réarrangé) d’une image, on peut dire les choses suivantes :
• Les fréquences situées proche du centre du spectre (donc proches de la fréquence nulle) sont appelées
basses fréquences : elles correspondent aux zones uniformes de l’image ou contenant peu de d´détails.
• Les fréquences ´éloignées du centre du spectre correspondent aux hautes fréquences, c’est à dire aux
détails de l’image
• Si l’on voit apparaitre des lignes sur le spectre, cela signifie qu’on peut retrouver des éléments assimilables à
des lignes ou des directions privilégiées dans l’image, dans la direction perpendiculaire à celle donnée par le
spectre.
2. Application Matlab
1. Transformée de Fourier :
Nous allons travailler dans cette partie sur trois peintures très célèbres (Monet, Picasso et Mondrian) et observer
leur spectre.
2
1.1. Ouvrir l’image [Link], la stocker dans une matrice X1, la renormaliser (diviser l’image par 2𝑏 −
1, 𝑙𝑜𝑟𝑠𝑞𝑢𝑒 𝑙 ′ 𝑖𝑚𝑎𝑔𝑒𝑒𝑠𝑡 𝑞𝑢𝑎𝑛𝑡𝑖𝑓𝑖é 𝑠𝑢𝑟 𝑏 𝑏𝑖𝑡𝑠) et l’afficher.
-Quels sont les types de fréquences dominantes dans cette image ? Y’a-t-il dans l’image des directions
privilégiées ?
1.2. Calculer la transformée de Fourier Y1 de l’image. Réarranger cette transformée (grâce à fftshift) et
calculer son module.
1.3. En utilisant la commande mat2gray pour renormaliser les valeurs, afficher le spectre d’abord en échelle
linéaire, puis en échelle logarithmique (on prendra C = 100).
1.4. Quelle échelle vous semble la plus appropriée ici ?
1.5. Vérifiez vos observations en regardant le spectre ? Commenter.
1.6. Réaliser le même processus pour [Link] (stockée dans X2) et [Link] (stockée dans X3).
Comparer les résultats et commenter.
2. Images synthétiques
2.1. Pour chacune de ces images, générer une image de taille 256 × 256 et afficher sur la même figure
l’image, son spectre en échelle linéaire et son spectre en échelle logarithmique (On prendra C = 100).
Commenter et interpréter les résultats obtenus.
a. X4 Carré gris clair centré sur un fond uniforme gris foncé (vous choisirez le côté)
Pour créer une image vide sous matlab de taille M*N, on utilise la commande :
I=zeros(M,N) ; %Matrice vide de M lignes et N colonnes
Pour modifier les valeurs d’une matrice sous MATLAB, on peut utiliser selon les cas :
X(3,10)=0; % Le pixel appartenant à la ligne 3 et a la colonne 10 est mis a 0
X(4,:)=0; % Tous les pixels appartenant à la ligne 4 sont mis a 0
X(:,5)=0; % Tous les pixels appartenant à la colonne 5 sont mis a 0
X(4:9,:)=0; % Tous les pixels appartenant aux lignes de 4 à 9 sont mis a 0
X(:,3:8)=0; % Tous les pixels appartenant aux colonnes de 3 à 8 sont mis a 0
X(5:9,6:10)=0; % Tous les pixels appartenant à la fois aux lignes de 5 à 9 et % aux colonnes de 6 à 10 sont
mis a 0
Pour créer un vecteur y ligne contenant toutes les valeurs entre début et fin avec un pas de pas, on peut
utiliser
y = debut:pas:fin;
% Exemples d'utilisation :
x1 = 0:0.1:1; % Vecteur ligne 0, 0.1, 0.2, ...
x2 = 3:8; % Vecteur ligne 3, 4, 5, ...
x3 = (0:5)'/2; % Vecteur colonne 0 1/2 1, ...
Si la valeur de pas n’est pas spécifiée, MATLAB la fixe automatiquement à 1.
Afin d’éviter de faire une double boucle for pour remplir la matrice, on peut utiliser une commande ndgrid qui
va générer automatiquement deux matrices X et Y répliquant les valeurs de x et y :
Donc, pour générer une image de la forme I(m,n)=3x(m)+4y(n), il suffit de faire appel à la fonction ndgrid pour
générer X et Y puis définir I=3*X+4*Y.
b. X5 Image d’équation :
3
c. X6 Image d’équation :
Pour afficher plusieurs images de même taille sur une même figure sous MATLAB, on peut utiliser
% X, Y, Z : images renormalisees de meme taille
figure
imshow([X Y Z])
3. Seuillage : sélection des basses/fréquences
Afin de mieux comprendre à quoi correspondent les basses et hautes fréquences, nous allons faire
l’expérience suivante. Nous avons vu que les basses fréquences étaient proches de la fréquence centrale (sur
un spectre réarrangé). Nous allons essayer de ne conserver que les basses fréquences (ou hautes) dans le
spectre et de reconstruire l’image par transformée de Fourier inverse. Pour sélectionner les basses (ou hautes
fréquences), nous allons considérer un cercle de rayon R centré sur la fréquence nulle, et ne garder que les
coefficients de Fourier correspondant aux fréquences comprises (ou non comprises) dans le cercle.
La fonction SeuillageFrequencesFourier(X,R,param) fournie, réalise les étapes suivantes :
• Prend en entrée une image renormalisée X, un rayon R (entier), et un paramètre param (égal à 0 ou 1)
• Calcule la transformée de Fourier réarrangée
• Deux cas :
• Si param = 0, annule toutes les coefficients de Fourier associés aux fréquences situées à une distance de
plus de R pixels de la fréquence centrale
• Si param = 1, annule toutes les coefficients de Fourier associés aux fréquences situées à une distance de
moins de R pixels de la fréquence centrale
• Reconstruit une image par transformée de Fourier inverse
• Affiche sur la même image, de gauche à droite et de haut en bas :
• L’image originelle (en haut à gauche)
• Le spectre de l’image originelle en échelle linéaire (en haut au milieu)
• Le spectre de l’image originelle en échelle logarithmique (en haut à droite)
• L’image reconstruite (en bas à gauche)
• Le spectre de l’image reconstruite en échelle linéaire (en bas au milieu)
• Le spectre de l’image reconstruite en échelle logarithmique (en bas à droite)
4
a. Ouvrir l’image [Link], la stocker dans une matrice Z1 et la renormaliser.
b. Lancer la fonction SeuillageFrequencesFourier.m avec R = 20 et param = 0. Commenter.
c. Relancer la même simulation avec param = 1. Commenter.
d. Faire varier R et commenter.
e. Recommencer ces opérations avec une image naturelle ou synthétique de votre choix. Commenter.
4. Seuillage : sélection des zones d’énergie faibles/ élevées
Afin de comprendre à quelles parties de l’image correspondent les zones d’énergies élevées dans le spectre,
nous allons faire une deuxième expérience. Nous n’allons garder que les fréquences où l’énergie est élevée
(ou faible), et reconstituer l’image ainsi obtenue par transformée de Fourier inverse. A priori, si l’on
sélectionne effectivement les coefficients de Fourier concentrant le plus d’énergie, la reconstitution devrait
donner une bonne approximation de l’image. Nous allons donc définir un seuil T et mettre tous les
coefficients de la transformée de Fourier dont le module est inférieur (ou supérieur) à T à 0. On reconstruira
ensuite l’image en prenant la transformée de Fourier inverse de ce spectre modifié.
La fonction SeuillageEnergieFourier(X,T,param) fournie réalise les étapes suivantes :
• Prend en entrée une image renormalisée X, un seuil T (réel), et un paramètre param (égal à 0 ou 1)
• Calcule la transformée de Fourier
• Deux cas :
• Si param = 0, annule toutes les coefficients de Fourier dont le module est inférieur à T
• Si param = 1, annule toutes les coefficients de Fourier dont le module est supérieur à T
• Reconstruit une image par transformée de Fourier inverse
• Affiche sur la même image, de gauche à droite et de haut en bas :
• L’image originelle (en haut à gauche)
• Le spectre de l’image originelle en échelle linéaire (en haut au milieu)
• Le spectre de l’image originelle en échelle logarithmique (en haut à droite)
• L’image reconstruite (en bas à gauche)
• Le spectre de l’image reconstruite en échelle linéaire (en bas au milieu)
• Le spectre de l’image reconstruite en échelle logarithmique (en bas à droite)
f. Ouvrir l’image [Link], la stocker dans une matrice Z1 et la renormaliser.
g. Lancer la fonction SeuillageEnergieFourier.m avec T = 0.001 et param = 0. Commenter.
h. Relancer la même simulation avec param = 1. Commenter.
5
i. Faire varier T et commenter.
j. Recommencer ces opérations avec une image naturelle ou synthétique de votre choix présentant des
directions privilégiées. Commenter.
5. Quelques transformations de l’image
Nous allons ici tester rapidement l’influence de quelques transformations de l’image sur le spectre :
redimensionnement, rotation, translation...
Pour afficher les spectres, on utilisera la fonction AffichageSimultane(X1,Y1,X2,Y2) fournie où X1 et X2 sont
deux images (par exemple l’image originale et l’image transformée) et Y1 et Y2 leurs spectres respectifs (Y1 =
fft2(X1) et Y2 = fft2(X2)).
k. Ouvrir l’image [Link], la stocker dans une matrice Z1 et la renormaliser.
l. Créer une image Z2 correspondant à l’image Z1 redimensionnée de taille 128 × 128. Créer ensuite
une image Z3 correspondant à l’image Z2 redimensionnée de taille 256 × 256. Comparer les spectres
de Z1, Z2 et Z3 et commenter.
Pour redimensionner une image en une image de taille M × N, on peut utiliser
% X : Image originelle
Y = imresize(X,[M N]);
% Y : Image redimensionnee de taille M x N
m. Créer une image Z4 correspondant à l’image Z1 tournée d’un angle de 90 degrés. Comparer les
spectres de Z1 et Z4 et commenter.
Pour appliquer une rotation d’angle dans le sens trigonométrique sur une image, on peut utiliser
% X : Image originelle
Y = imrotate(X,theta);
% Y : Image obtenue apres rotation
n. Créer une image Z5 correspondant à l’image Z1 translatée avec Tx = 30 pixels (selon l’axe x) et Ty = 40
pixels (selon l’axe y). Comparer les spectres de Z1 et Z5 et commenter.
Pour appliquer une translation de vecteur [Tx, Ty] sur une image, on peut utiliser
% X : Image originelle
Y = circshift(X,[Tx Ty]);
% Y : Image obtenue apres translation