Vous êtes sur la page 1sur 12

Groupe:

 ABAINOU Yassine ;
 EL HADEG Ibrahim ;
 JAA El Ouali ;
 TARRAQ Mohammed ;

Compte-rendu du TP 02
Filtrage de bruit :
Avant d’entamer les procédés de filtrage, il faut tout d’abord importer l’image :
Instructions sous MATLAB pour importer l’image de base :
originalImage = imread('cameraman.gif');
Pour afficher n’importe quelle image, on utilise l’instruction suivante :
figure, imshow(originalImage);
L’image sujette :

Figure 1: Image de base du TP


Application des bruits :
Pour bruiter l’image sujette, nous utiliserons la fonction suivante :
outputImage = imnoise(inputImage, TYPE, ...);
La fonction retourne une image bruitée, en se basant sur ce qui est fourni comme paramètre :
• inputImage : L’image à bruiter ;
• TYPE : Le type de bruit à appliquer ;
• ... : D’autres paramètres qui diffèrent d’un filtre à un autre ;
 Pour le bruit sel et poivre, nous spécifions de plus la densité ;
 Pour le bruit gaussien, nous spécifions de plus la moyenne et le sigma (la déviation
standard qui détermine la largeur de la cloche gaussienne) ;
Trois types de bruit sont demandés :
Le bruit sel et poivre (ligne 1), le bruit gaussien (ligne 2) et le bruit poisson (ligne 3).
1 resultImageSP = imnoise(originalImage,'salt & pepper', 0.02);
2 resultImageGS = imnoise(originalImage,'gaussian', 0, 0.01);
3 resultImagePS = imnoise(originalImage,'poisson');
Filtre moyenneur :
À quoi sert le filtre moyenneur ?
C’est un filtre passe-bas linéaire, qui permet d’enlever le bruit en lissant les contours, il est
adéquat aux bruits blancs (plus précisément gaussiens de moyenne nulle) et utile pour les
prétraitements.
Pour filtrer nos images bruitées en utilisant un filtre moyenneur, nous utilisons la fonction imfilter :
outputImage = imfilter(inputImage,kernel);
Le noyau de convolution est une matrice qu’on déclare comme ceci :
kernel = ones(5,5) / 25;
Sous MATLAB, la déclaration ci-dessous nous permet de créer le noyau de convolution suivant :

Avec ce noyau, nous obtenons :

Figure 2: Filtration des images bruitées avec un filtre moyenneur d’un noyau de convolution de taille 5x5
Avec ce noyau, nous avons arrivé à adoucir les contours, et cela s’applique sur ceux qui ont
produits suites aux différents types de bruits appliqués sur l’image sujette. Nous remarquons aussi
que ce filtre est plus adapté au bruit Poisson et à un degré inférieur au bruit gaussien. Dans le cas
des bruits du type sel et poivre, le filtre moyenneur reste inefficace.
Avec un noyau plus large, par exemple :

Nous obtenons :

Figure 3: Filtration des images bruitées avec un filtre moyenneur d’un noyau de convolution de taille 7x7
En augmentant la taille du noyau de convolution du filtre, le bruit est mieux enlevé mais l’image
devient floue suite aux moyennes effectuées sur un nombre important des pixels, ce qui provoque
une réduction importante des détails.

Filtre gaussien :
À quoi sert le filtre gaussien ?
Dans le champ du traitement d’images, ce filtre est utilisé principalement pour lisser les images,
c’est-à-dire, atténuer le bruit en lissant les contours ! Dans le contexte de ce TP, nous appliquerons
ce filtre sur les trois types de bruit indiqués préalablement.
Pour filtrer nos images bruitées en utilisant le filtre gaussien, nous utilisons la fonction imgaussfilt :
outputImage = imgaussfilt(inputImage,sigma);
Nous utilisons cette surcharge, parce qu’elle nous permet de spécifier le sigma.
Avec un sigma = 2, nous obtenons :

Figure 4: Filtration des images bruitées avec un filtre gaussien de sigma = 2


Le filtre gaussien fournit des résultats mieux que celles du filtre moyenneur, toujours avec les
présences des granules (dans le cas des bruits sel et poivre et gaussiens) moins importantes que
celles présentes sur l’image résultante d’une filtration par un filtre moyenneur.
En augmentant le sigma, par exemple sigma = 4

Figure 5: Filtration des images bruitées avec un filtre gaussien de sigma = 4


Ce défaut est présent dans la majorité des filtres, le lissage des contours avec un sigma plus grand
conduira à la perte des informations (stockées dans les pixels), ce qui rend l’image floue.
L’image devient plus floue en augmentant sigma !
Filtre médian :
À quoi sert le filtre médian ?
C’est un filtre passe-bas non linéaire qui élimine parfaitement les pixels isolés. En principe, il se
base sur un noyau pour remplacer chaque pixel de l’image filtrée par la valeur médiane de la série
composée du pixel et ses voisins.
Afin de filtrer les images bruitées en utilisant le filtre médian, nous utilisons la fonction medfilt2 :
1 outputImage = medfilt2(inputImage);
2 outputImage = medfilt2(inputImage,kernel);
Nous utiliserons la deuxième surcharge de cette fonction qui comprend deux paramètres :
• L’image à filtrer (image2Filter dans ce cas) ;
• La taille du noyau de convolution (kernel dans notre cas) ;

Figure 6: Filtration des images bruitées avec un filtre médian d’un noyau de convolution de taille 3x3
On remarque que le filtre médian est adapté aux bruits du type sel et poivre, il a parfaitement
enlevé tout le bruit, il fournit aussi des résultats acceptables dans le cas du bruit gaussien et bruit
Poisson.
Figure 7: Filtration des images bruitées avec un filtre médian d’un noyau de convolution de taille 5x5
En augmentant la taille du noyau de convolution, les détails fins sont beaucoup plus détériorés.

Conclusion :
Le tableau comparatif suivant résume les manipulations qu’on a accompli dans ce paragraphe :
Sel et poivre Gaussien Poisson
Filtre Médian X
Filtre Gaussien X
Filtre moyenneur X
La croix correspond au filtre convenable à chaque type de bruit.
Détection des contours :
Introduction des filtres :
Cette famille des filtres est conçue dans le but de détecter avec la plus grande précision les
contours dans une image, le TP aborde trois filtres de cette famille : Prewitt, Sobel et Canny.
Sous MATLAB, il y a une fonction qui permet de les appliquer sur une image donnée :
outputImage = edge(inputImage,TYPE);
Tel que TYPE est le nom du filtre à appliquer, nous nous limiterons au entrées suivantes :
 ‘Prewitt’ pour le filtre Prewitt ;
 ‘Sobel’ (la première lettre en majuscule) pour le filtre Sobel ;
 ‘canny’ pour le filtre Canny ;

Manipulation 01 : Application sur l’image sujette :


En appliquant ces filtres sur l’image de base (Figure 1), nous obtenons :

Figure 8: Filtres de détection des contours appliqués sur l'image de base


Les résultats de filtration par les filtres Prewitt et Sobel sont similaires, c’est tout à fait normal
car leurs noyaux de convolutions sont très proches ! La meilleure filtration est celle du filtre de
Canny, sa précision était grande par rapport à celles de Prewitt et Sobel.

Manipulation 02 : Application sur l’image bruitée :


En appliquant de nouveaux ces filtres, mais cette fois-ci sur la version bruitée de l’image de base
(bruit gaussien), nous obtenons :

Figure 9: Filtres de détection des contours appliqués sur l'image bruitée

C’est une confirmation de ce qu’on cité précédemment, le filtre de Canny est le plus adapté aux
détections des contours.
Ideal and Butterworth Filters:
1 function [U,V] = dftuv(M,N)
2 % DFTUV Computes medhgrid frequency matrices
3 % [U,V] = DFTUV(M,N) computes meshgrid frequency matrices U and V.
4 % U and V are useful for computing frequency-domain filter functions
5 % that can be used with DFTFILT. U and V are both M-by-N
6
7 % Set up range of variables
8 u = 0:(M-1);
9 v = 0:(N-1);
10
11 % Compute the indices for use in meshgrid
12 idx = find(u > M/2);
13 u(idx) = u(idx) - M;
14 idy = find(v > N/2);
15 v(idy) = v(idy) - N;
16
17 % Compute the meshgrid arrays.
18 [V,U] = meshgrid(v,u);

Tout au long de cette partie, nous nous baserons sur le code ci-dessus, il nous permettra de générer
les matrices des filtres indépendamment de leurs fonctions qui seront appliquées pour adapter les
matrices des filtres. Ce code est tiré de la 2ème édition du livre « Digital Image Processing Using
MATLAB » des auteurs Rafael C. Gonzalez, Richard E. Woods et Steven L. Eddins.

Ideal low-pass filter with radius D = 32:


À quoi sert le filtre passe-bas idéal ?
Ce filtre est utile dans les opérations d’élimination du bruit granuleux et d’adoucissement des
détails. Il s’applique dans le domaine fréquentiel et il est caractérisé par le rayon de son noyau.
Il est basé sur l’équation suivante :
Soit 𝐷𝐷0 le rayon de disque du filtre et 𝐷𝐷(𝑢𝑢, 𝑣𝑣) la distance entre le pixel des coordonnées 𝑢𝑢
et 𝑣𝑣 le centre de noyau du filtre.
Le filtre est défini par la fonction suivante :
𝟏𝟏 𝒔𝒔𝒔𝒔 𝑫𝑫(𝒖𝒖, 𝒗𝒗) ≤ 𝑫𝑫𝟎𝟎
𝑯𝑯(𝒖𝒖, 𝒗𝒗) = �
𝟎𝟎 𝒔𝒔𝒔𝒔 𝑫𝑫(𝒖𝒖, 𝒗𝒗) > 𝑫𝑫𝟎𝟎
Tel que: 𝑫𝑫(𝒖𝒖, 𝒗𝒗) = √𝒖𝒖𝟐𝟐 + 𝒗𝒗𝟐𝟐
Afin d’expérimenter ce filtre, et grâce au livre cité ci-dessus, nous avons pu développer le script
suivant :
1 originalImage = imread('cameraman.gif');
2
3 D0=32;
4 ImageSize = size(originalImage);
5
6 FourierImage = fft2(double(originalImage));
7
8 [V,U] = dftuv(ImageSize(1),ImageSize(2));
9 func = sqrt(U.^2+V.^2);
10
11 IdealLowPassFilter = double(func<=D0);
12 ShifftedIdealLowPassFilter = fftshift(IdealLowPassFilter);
13 FiltredFourierImage =IdealLowPassFilter.*FourierImage;
14 FiltredImage = real(ifft2(double(FiltredFourierImage)));
18
15 figure, imshow(originalImage);
16 figure, imshow(ShifftedIdealLowPassFilter);
17 figure,imshow(FiltredImage,[ ]);
Nous passons au domaine fréquentiel grâce à l’instruction de la ligne 6, et la construction de la
matrice du filtre se fait dans la ligne 11. En fin nous appliquons une multiplication point à point afin
d’appliquer le filtre sur notre image et nous affichons les figures.
En appliquant ce script sur l’image sujette, nous obtenons :

Figure 10: Le filtre passe-bas idéal appliqué sur l'image sujette


Le bruit granuleux est quasiment enlevé de l’image sujette, ainsi elle est adoucie de sorte que les
détails sont difficiles à identifier dans l’image filtrée. L’inconvénient de ce filtre est la production des
artéfacts (atténuation des hautes fréquences) ! Ce problème sera résolu à l’aide du filtre de Butterworth
qu’on étudiera dans le paragraphe suivant.

Butterworth low-pass filter with n=1 and radius D = 32:


À quoi sert le filtre passe-bas de Butterworth ?
Le filtre passe-bas idéal et comme l'indique son nom n'est pas réalisable ! La solution consiste à
faire donc une approximation qui sera le filtre passe-bas de Butterworth.
Soit 𝑫𝑫𝟎𝟎 le rayon de disque du filtre, 𝒏𝒏 son ordre et 𝑫𝑫(𝒖𝒖, 𝒗𝒗) la distance entre le pixel des
coordonnées 𝑢𝑢 et 𝑣𝑣 le centre de noyau du filtre.
Le filtre est défini par la fonction suivante :
𝟏𝟏
𝑯𝑯(𝒖𝒖, 𝒗𝒗) =
𝑫𝑫(𝒖𝒖, 𝒗𝒗) 𝟐𝟐𝟐𝟐
𝟏𝟏 + 𝟎𝟎. 𝟒𝟒𝟒𝟒𝟒𝟒 ∗ �
𝑫𝑫𝟎𝟎 �
Tel que : 𝑫𝑫(𝒖𝒖, 𝒗𝒗) = √𝒖𝒖𝟐𝟐 + 𝒗𝒗𝟐𝟐
Pour le mettre en pratique, nous avons préparé le script suivant :
1 originalImage = imread('cameraman.gif');
2
3 D0=32;
4 order = 1;
5 ImageSize = size(originalImage);
6
7 FourierImage = fft2(double(originalImage));
8
9 [V,U] = dftuv(ImageSize(1),ImageSize(2));
10
11 for i = 1: ImageSize(1)
12 for j = 1:ImageSize(2)
13 UVw = double((U(i,j)*U(i,j) + V(i,j)*V(i,j))/(D0*D0));
14 ButterworthLowPass(i,j) = 1/(0.414*(1 + UVw^(2*order)));
15 end
16 end
17
18 ShifftedButterworthLowPassFilter = fftshift(ButterworthLowPass);
19 FiltredFourierImage =ButterworthLowPass.*FourierImage;
20 FiltredImage = real(ifft2(double(FiltredFourierImage)));
21
22 figure, imshow(originalImage);
23 figure, imshow(ShifftedButterworthLowPassFilter);
24 figure,imshow(FiltredImage,[ ]);
Nous passons au domaine fréquentiel grâce à l’instruction de la ligne 7, et la construction de la
matrice du filtre se fait dans la ligne de 11 à 16. En fin nous appliquons une multiplication point à
point afin d’appliquer le filtre sur notre image et nous affichons les figures.
En appliquant ce script sur l’image sujette, nous obtenons :

Figure 11: Le filtre passe-bas de Butterworth appliqué sur l'image sujette


On constate que ce filtre nous a fourni une filtration - du filtre passe-bas idéal – améliorée. Cela
est dû au nouveau disque qui est conçu pour éliminer les artéfacts.
High-Emphasis filter:
À quoi sert le filtre High-Emphasis ?
Ce filtre est destiné aux opérations du sharpening c’est-à-dire souligner les hautes fréquences,
dans notre cas, on va procéder à cela par la soustraction d’un filtre passe-bas de Butterworth.
Soit 𝐷𝐷0 le rayon de disque du filtre passe-bas de Butterworth à soustraire, 𝑛𝑛 son ordre et 𝐷𝐷(𝑢𝑢, 𝑣𝑣)
la distance entre le pixel des coordonnées 𝑢𝑢 et 𝑣𝑣 le centre de noyau du filtre.
Le filtre est défini par la fonction suivante :
𝑮𝑮(𝒖𝒖, 𝒗𝒗) = 𝟏𝟏. 𝟐𝟐 − 𝑯𝑯(𝒖𝒖, 𝒗𝒗)
Tel que
𝟏𝟏
𝑯𝑯(𝒖𝒖, 𝒗𝒗) = et 𝑫𝑫(𝒖𝒖, 𝒗𝒗) = �𝒖𝒖𝟐𝟐 + 𝒗𝒗𝟐𝟐
𝑫𝑫(𝒖𝒖, 𝒗𝒗) 𝟐𝟐𝟐𝟐
𝟏𝟏 + 𝟎𝟎. 𝟒𝟒𝟒𝟒𝟒𝟒 ∗ � �
𝑫𝑫𝟎𝟎
Pour le mettre en pratique, nous avons préparé le script suivant :
1 originalImage = imread('cameraman.gif');
2
3 D0=24;
4 order = 1;
5 ImageSize = size(originalImage);
6
7 FourierImage = fft2(double(originalImage));
8
9 [V,U] = dftuv(ImageSize(1),ImageSize(2));
10
11 for i = 1: ImageSize(1)
12 for j = 1:ImageSize(2)
13 UVw = double((U(i,j)*U(i,j) + V(i,j)*V(i,j))/(D0*D0));
14 HighEmphasis(i,j) = 1.2 - (1/(0.414*(1 + UVw^(2*order))));
15 end
16 end
17
18 ShifftedHighPassFilter = fftshift(HighEmphasis);
19 FiltredFourierImage =HighEmphasis.*FourierImage;
20 FiltredImage = real(ifft2(double(FiltredFourierImage)));
21
22 figure, imshow(originalImage);
23 figure, imshow(ShifftedHighPassFilter);
24 figure,imshow(FiltredImage,[ ]);
Nous passons au domaine fréquentiel grâce à l’instruction de la ligne 6, et la construction du noyau
du filtre se fait dans la ligne 11. En fin nous appliquons une multiplication point à point afin d’appliquer
le filtre sur notre image et nous affichons les figures.
En appliquant ce script sur l’image sujette, nous obtenons :
Figure 12: Le filtre High-Emphasis appliqué sur l'image sujette

Grâce à la matrice du filtre, nous avons pu aboutir à une image filtrée qui contient seulement les
informations issues des hautes fréquences, le disque noir a permis d’enlever les basses fréquences et
son entourage a permis de garder les hautes !