Anda di halaman 1dari 13

COMPTE RENDUS

DES TRAVAUX
PRATIQUES DE LA
PREMIERE PARTIE DU
TRAITEMENT
DIMAGE
Par Mahmoud Zyate
Et Abdelhalim Kamrani

Enseignants :
M. ZARGHILI
Arsalane

Sommaire
Sommaire.....................................................................................................2
Introduction..................................................................................................3
TP2 : Histogramme et Binarisation..............................................................4
Histogramme............................................................................................4
Egalisation dhistogramme....................................................................4
Etirement de lhistogramme..................................................................5
Comparaison entre ltirement et lgalisation.....................................5
Binarisation...............................................................................................6
Binarisation locale.................................................................................6
Binarisation globale : mthode dOTSU.................................................7
TP 3 : Filtrage Spatial...................................................................................9
Filtrage linaire.........................................................................................9
Filtre moyenneur...................................................................................9
Filtre gaussien......................................................................................10
Filtrage non linaire................................................................................11
Filtre mdian........................................................................................11
TP 4 : Filtrage frquentiel...........................................................................13
Filtre passe-bas, filtre passe-haut........................................................13

Introduction
Lobjectif de ces travaux pratiques est de nous faire manipuler les
diffrentes techniques de traitement dimage tout en utilisant Matlab. Il
nous faudra crer des scripts et des fonctions selon le contexte sur Matlab
afin de raliser les diffrents exercices.

En accompagnement de ce document, les fonctions et scripts


expliqus dans ce rapport.

TP2 : Histogramme et
Binarisation
Dans ce TP, nous tudierons lhistogramme, la binarisation que ce
soit globale, locale ou hybride, ltirement et lgalisation.

Histogramme
Lhistogramme dune image en niveau de gris associe chaque
valeur dintensit le nombre de pixels prenant cette valeur. Pour crer
lhistogramme dune image en niveau de gris, il suffit de parcourir limage
pour compter le nombre de pixels de chaque valeur. Voici, en langage
Matlab, la mthode de calcul de lhistogramme dune image en niveau de
gris dans une fonction quon nomme im_histo.
function[W]=im_histo(A)
%fonction permettant de calculer l'histogramme de l'image A
%On commence par initialiser une matrice d'une ligne et 256 colonne
%avec des zeros
W=zeros(1,256);
[p,q]=size(A);
%on parcours ensuite notre image
for i=1: p
for j=1: q
%pour chaque pixel rencontr, on incrmente sa valeur de 1 dans
%notre vecteur W
x=A(i,j)+1;
W(x)=W(x)+1;
end
end
%bar(W) % ajouter si on veut que la fonction retourne le dessin du
%vecteur en bars plutt que le vecteur uniquement
End

La fonction Matlab imhist permet galement de calculer


lhistogramme dune image. Cette fonction est plus optimise par rapport
la ntre.

Egalisation dhistogramme
Cette transformation consiste rendre le plus plat possible
lhistogramme des niveaux de gris de limage, de faon harmoniser la
rpartition des niveaux de luminosit de limage. Cette opration vise
augmenter les nuances dans limage, cest--dire renforcer le contraste
sur des dtails de limage qui sont masqus par des variations dintensit
de plus grande amplitude et plus grande chelle.
Le code correspondant cette opration est le suivant, sachant que
MATLAB a dj implment ce fonctionnement dans sa fonction histeq :

function[Ieq]=Histo_eq(A)
%fonction permetant d'galiser une image A passe en paramtre
[p,q]=size(A);
Hn=im_histo(A)/(p*q);
function[v]=C(k)
%fonction qui va nous permetre de calculer la densit de
%probabilit cumulative.
v=0;
for l=1: k+1
v=v+Hn(l);
end
end
for i=1: p
for j=1: q
Ieq(i,j)=C(A(i,j))*255;
end
end
Ieq=uint8(Ieq); %rendre les valeurs de Ieq des entiers.
end

Etirement de lhistogramme
Cette mthode lmentaire consiste utiliser au mieux lchelle de
niveaux de gris disponibles sur le systme dacquisition dimage. Ceci
revient tendre lhistogramme afin que la valeur dintensit la plus faible
soit zro et que la valeur la plus haute soit la valeur maximale.
De cette faon, si les valeurs de lhistogramme sont trs proches les
unes des autres, ltirement va permettre de fournir une meilleure
rpartition afin de rendre les pixels clairs encore plus clairs et les pixels
foncs proches du noir. Il est ainsi possible daugmenter le contraste dune
image.
On peut coder ce procd sous MATLAB de la manire suivante :
function[Iet]=Histo_Etire(A)
%fonction permetant l'tirement d'un histogramme
[p,q]=size(A);
B=double(A);
pmax=max(max(B)); % la valeur maximale dans l'image
pmin=min(min(B)); % la valeur minimale dans l'image

end

for i=1: p
for j=1: q
a=double(B(i,j)-pmin);
b=double(pmax-pmin);
c=double(a/b);
d=double(255*c);
Iet(i,j)=uint8(d);
end
end

Bien entendu, lquivalent MATLAB est la fonction imadjust.

Comparaison entre ltirement et lgalisation


Ces deux traitements ont pour but de renforcer le contraste dune
image. Dans les deux cas, limage traite prsente cependant du bruit,
chose aisment contournable laide dun filtre. Lgalisation
dhistogramme semble plus utile avec une image complexe, en effet
ltirement dhistogramme na rien faire sur une image possdant dj
les 255 niveaux de gris, et le changement de contraste est alors trs peu
visible.

Binarisation
La binarisation est un procd qui produit seulement deux types de
pixels dans une image : des pixels noirs et des pixels blancs. La
binarisation permet donc de transformer une image ou un flux en noir et
blanc.
Il faut pour cela dterminer un seuil : quels sont les pixels qui
doivent-tre noirs et ceux qui doivent-tre blancs ? Nous pouvons pour
cela utiliser lhistogramme. Une fois lhistogramme de limage en notre
possession, il faut tablir une somme cumule des intensits, cest dire
faire la somme du nombre de pixels pondr par leurs intensits. Pour
tablir le seuil, il suffit alors de diviser cette somme par la taille de la
matrice de notre image. Il existe galement dautres mthodes.
La fonction MATLAB, im2bw, permet de binariser une image selon un
seuil donn en paramtres. Son code ressemble au suivant :
function[Ibin]=im_bin(I,s)
%fonction qui binarise une image selon un seuil donn
[p,q]=size(I);
for i=1: p
for j=1: q
if I(i,j)>s
Ibin(i,j)=255;
else
Ibin(i,j)=0;
end
end
end
Ibin=uint8(Ibin);
end

Binarisation locale
Dans la binarisation locale, le choix de seuil se fait sur une fentre
de limage : on divise limage dans notre traitement en blocs. En dautres
termes, le seuil est la valeur moyenne de cette fentre.

On a implment sous MATLAB une fonction qui permet de binariser


une image localement avec la taille de fentre qui faut prendre en
considration passe en paramtre :
function[bnl]=binarisation_locale(Im,tb)
%fonction de binarisation locale
%Im tant l'image binariser et tb la taille du bloc pour dterminer
%le seuil local
[p,q]=size(Im);
nbrbloci=(p-mod(p,tb))/tb;% Quantification du nombre de blocs compris
nbrblocj=(q-mod(q,tb))/tb;% dans l'image
%check=1;
cptbloci=0;
for i=1:tb: p
cptblocj=0;
for j=1:tb: q
%vrifier si on a dpass le dernier bloc des lignes
if cptbloci==nbrbloci
n=i+mod(p,tb)-1;
else
n=i+tb-1;
end
%vrifier si on a dpass le dernier bloc des colonnes
if cptblocj==nbrblocj
m=j+mod(q,tb)-1;
else
m=j+tb-1;
end
bloc=Im([i:n],[j:m]);
[x,y]=size(bloc);
mi=min(min(bloc));
ma=max(max(bloc));
S=(mi+ma)/2;
%bnl([i:n],[j:m])=im_bin(bloc,s); appel de la fonction
%prcdente

%%%
%
%
%
%
%
%
%
%%%

for r=1: x
for s=1: y
if bloc(r,s)> S
bnl(i+r-1,j+s-1)=255;
else
bnl(i+r-1,j+s-1)=0;
end
end
end
Code utilis pour confirmer que la division en blocks est juste
if(check==0)
bnl([i:n],[j:m])=zeros(x,y);
check=1;
else
bnl([i:n],[j:m])=ones(x,y)*255;
check=0;
end
%calculer le nombre de blocs des colonnes
cptblocj=cptblocj+1;

end
%calculer le nombre de blocs des lignes
cptbloci=cptbloci+1;

end

end

Binarisation globale : mthode dOTSU


Comme on a cit avant, quand on binarise globalement, le choix de
seuil se fait au dpend de tous les pixels de limage. Lalgorithme de OTSU
se base surtout sur lhistogramme dintensit.
function [ Ibn ] = binarisation_globale( Image )
%fonction de binarisation globale selon le modle d'OTSU
H=im_histo(Image); %vecteur d'histogramme o pour la valeur i d'un
pixel
%on calcule sa frquence dans H(i+1)
N=size(Image,1)*size(Image,2); % nombre total des pixels
pct = 0;
for i=1:256
pct = pct + (i-1)* H(i); %produit cummulable total de la valeur x et
sa frquence.
end
pcB=0; %produit cumulable du background
VarBmax=0;
seuil=0;
wB = 0;
wF = 0;
for i=1:256
wB = wB+ H(i);
if wB==0
continue;
end
wF = N- wB;
if wF==0
break;
end
pcB = pcB + (i-1)*H(i);
MeanB= pcB/wB;
MeanF= (pct-pcB)/wF;
varB= wB/N * wF/N * MeanB * MeanF;
if varB>VarBmax
VarBmax=varB;
seuil=i-1;
end
%une fois notre seuil calcul, on peut maintenant binariser l'image
Ibn=im2bw(Image,seuil/256);
end

end

Sous MATLAB, la fonction graytresh utilise la mthode dOtsu. Pour


utiliser cette mthode, il faut commencer par tablir le seuil avec la

fonction graytresh, puis binariser limage en utilisant ce seuil laide de la


fonction im2bw.
otsu=graythresh(ndg);
bw=im2bw(ndg,otsu);

TP 3 : Filtrage Spatial
Le terme spatial se rfre lensemble des pixels composant
limage. Tout traitement spatial peut sexprimer comme
O I est limage originale, J limage traite, et T est un oprateur sur I,
dfini sur un voisinage de (x, y).
Si ce voisinage est de taille 1, T agit pixel par pixel, et on parle alors
danalyse point point. On rcupre alors entre autres les mthodes
danalyse dhistogramme, auxquelles on adjoint toute transformation
mathmatique i T(i) (logarithmique, exponentielle, ...)
Nous allons nous intresser aux filtres linaires et non linaires

Filtrage linaire
Les filtres linaires sont fonds sur lhypothse de linarit du
systme dacquisition. Les filtres dits passe-bas attnuent ou liminent les
hautes frquences spatiales dans limage, en laissant les basses
frquences intactes. Au contraire, un filtre passe haut laisse intactes les
hautes frquences, et attnue les basses.
Ce filtre transforme un ensemble de donnes d'entre en un
ensemble de donnes de sortie selon lopration mathmatique appele
convolution.

Filtre moyenneur
Ce filtre lisseur part du principe que la valeur d'un pixel est
relativement similaire son voisinage. Il fait donc en sorte que chaque
pixel est remplac par la moyenne pondre de ses voisins. Si on applique
un filtre moyenneur de taille d=3, cela signifie qu'on additionne la valeur
de tous les pixels du voisinage du pixel trait.

On a implment ce principe dans la fonction suivante, bien sr il


faut donner en paramtre la matrice du filtre.
function[Ifil]=filt_moy(I,h)
%filtre de moyennage
[p,q]=size(I);
d=length(h); %dimention du filtre
%puisque les bords seront remplis par des 0, on calcul la taille de ces
%bord en dpend de la dimention du filtre
lim=(d-1)/2;
Ifil=zeros(p,q);
%on cre ensuite une duplication o on insre des bords fictifs , si par
%exemple l'image est de taille 200*200 et le filtre 3*3, on insre l'image
%dans une matrice de taille 202*202.
Idup=zeros(p+2*lim,q+2*lim);
Idup([1+lim:p+lim],[1+lim:q+lim])=I;

for i=1+lim:p+lim
for j=1+lim:1:q+lim
for k=-lim:lim
for l=-lim:1:lim
Ifil(i-lim,j-lim)=Ifil(i-lim,j-lim)+Idup(i+k,j+l);
end
end
Ifil(i-lim,j-lim)=Ifil(i-lim,j-lim)/power(d,2);
end
end
Ifil= uint8(Ifil); %transformer les valeurs de l'image filtre en entiers.
end

Les effets du filtre moyenneur varient avec la taille du noyau : plus


les dimensions du noyau seront importantes, plus le bruit sera limin ;
mais en contrepartie, les dtails fins seront eux-aussi effacs et les
contours tals.

Filtre gaussien
Leffet de ce filtre sur limage est assez similaire au filtre
moyenneur, mais la moyenne est pondre : les pixels prs du centre ont
un poids plus important que ceux que les autres. En gnral, un filtre
Gaussien avec <1 est utilis pour rduire le bruit, et si >1 cest dans le
but de flouter volontairement l'image. Il faut noter que plus est grand,
plus la cloche Gaussienne est large et plus le flou appliqu limage sera
marqu.
On a implment le filtre de la faon suivante en se basant sur la
mme logique du filtre prcdant :
function [ Ifil ] = Gaussian(I, sigma )
matrice = [exp(-2/(power(sigma,2))) ,exp(-1/2*(sigma*sigma)),exp(-2/
(power(sigma,2))),
exp(-1/2*(sigma*sigma)),1,exp(-1/2*(sigma*sigma)),
exp(-2/(power(sigma,2))),exp(-1/2*(sigma*sigma)),exp(-2/(power(sigma,2)))

]; %on a concider la matrice comme vecteur pour faciliter le balayage


coef = 1/(2*pi*power(sigma,2));
[p,q]=size(I);
lim=1; % (d-1)/2 , puisque d = 3 lim =1
%mme logique que pour le filtre median et moyenneur concernnt les bordures
Ifil=zeros(p,q);
Idup=zeros(p+2*lim,q+2*lim);
Idup([1+lim:p+lim],[1+lim:q+lim])=I;

for i=1+lim:p+lim
for j=1+lim:1:q+lim
v=1;
for k=-lim:lim
for l=-lim:1:lim
Ifil(i-lim,j-lim)=Ifil(i-lim,j-lim)
+Idup(i+k,j+l)*matrice(v);
v=v+1;
end
end

end

Ifil(i-lim,j-lim)=Ifil(i-lim,j-lim)/coef; %normalisation

end
Ifil = uint8(Ifil);
end

Filtrage non linaire


Cette opration a t dveloppe pour pallier aux insuffisances des
filtres linaires : principalement la mauvaise conservation des contours.
Elle a le dfaut d'infliger des dformations irrversibles l'image. Nous ne
dvelopperons pas ici de thorie des filtres non-linaires : ils sont chacun
bass sur des bases mathmatiques ou empiriques diffrentes. Ainsi on
sest intress dans ce TP au filtre mdian.

Filtre mdian
Le niveau de gris du pixel central est remplac par la valeur mdiane
de tous les pixels de la fentre d'analyse centre sur le pixel. La taille du
noyau dpend de la frquence du bruit et de la taille des dtails
significatifs de l'image traite.
Limplmentation MATLAB quivalente est la suivante :
function [ Ifil ] = filt_med(I, dim)
%fonction permettant d'appliquer le filtre median sur une image I suivant
%une dimention dim donne.

[p,q]=size(I);
%puisque les bords seront remplis par des 0, on calcul la taille de ces
%bord en dpend de la dimention du filtre
lim=(dim-1)/2;
Ifil=zeros(p,q);
Vecteur=zeros(1,dim*dim);
%on cre ensuite une duplication o on insre des bords fictifs , si par
%exemple l'image est de taille 200*200 et le filtre 3*3, on insre l'image
%dans une matrice de taille 202*202.
Idup=zeros(p+2*lim,q+2*lim);
Idup([1+lim:p+lim],[1+lim:q+lim])=I;

for i=1+lim:p+lim
for j=1+lim:1:q+lim
v=1; %indice de notre vecteur
for k=-lim:lim
for l=-lim:1:lim
%pour chaque valeur de notre fentre ou bloc, on l'ajoute
%au vecteur.
Vecteur(v)=Idup(i+k,j+l);
v=v+1;
end
end
Vecteur=sort(Vecteur); % il faut trier notre vecteur de valeurs
indiceMedian=(power(dim,2)-1)/2 +1; %indice o se trouve la valeur
mediane
Ifil(i-lim,j-lim)=Vecteur(indiceMedian);
end
end
Ifil= uint8(Ifil); %transformer les valeurs de l'image filtre en entiers.
end

TP 4 : Filtrage frquentiel
Bien entendu, Une image est avant tout un signal. Les signaux 2D
prsentent des variations d'intensit (lumineuse) dans l'espace.
La transforme de Fourier permet de passer du domaine spatial dans
le domaine frquentiel.
La transforme de Fourier du produit de convolution de deux
fonctions n'est autre que le produit (classique celui-l) de leur transforme
de Fourier et rciproquement.
On peut donc utiliser de faon quivalente un filtre spatial ou
frquentiel. Ce dernier n'tant qu'une simple multiplication, il est moins
coteux.
Sous MATLAB, la transformation de limage se fait par la fonction fft2,
pour la transformation inverse on excute la fonction ifft2. La fonction
fftshift nous permet de rarranger le rsultat de fft2.
Lexcution de cette partie-l du TP est en attachement (Script
TP4PartieI.m).

Filtre passe-bas, filtre passe-haut


Concernant la partie o on doit raliser le filtre passe-bas et le filtre
passe-haut. On a essay dappliquer au maximum le cours mais on nest
pas aussi certain des rsultats. Le script TP4PartieII.m concerne ce
traitement.