You are on page 1of 6

Travaux pratiques de traitement dimage O.

Strauss
Traitement dimages 1 M1 Vision et commande avance

DDD D

RRR RIII IVVV VAAA ATTT TIII IOOO ONNN N



DDD DEEE ESSS S



III IMMM MAAA AGGG GEEE ESSS S

:: : :

CCC CAAA ALLL LCCC CUUU ULLL L



DDD DUUU U



GGG GRRR RAAA ADDD DIII IEEE ENNN NTTT T



DDD DEEE E

SSS S

HHH HEEE ENNN N

--- -CCC C

AAA ASSS STTT TAAA ANNN N

... .

111 1 OOO O

BBB BJJJ JEEE ECCC CTTT TIII IFFF F



DDD DEEE E



CCC CEEE E



TTT TRRR RAAA AVVV VAAA AIII ILLL L

... .

Beaucoup dalgorithmes de traitement ou danalyse dimages sont bass sur un oprateur
de drivation spatiale, ou plus exactement destimation du gradient dillumination. Lex-
traction (ou le rhaussement) des contours, la dtection de lorientation dune images
sont deux exemples dapplications de cet algorithme. Lobjet de ce travail est de raliser
un calcul de drivation dimages bas sur lestimateur de gradient de Shen-Castan.

222 2 GGG G

RRR RAAA ADDD DIII IEEE ENNN NTTT T



DDD D



UUU UNNN NEEE E



III IMMM MAAA AGGG GEEE E

... .

Pour bien comprendre cette notion de gradient, il suffit de se reprsenter une image
comme une carte de relief (figure 1).
Les contours des cubes correspondent des

falaises

de limage 3D, cest dire des
endroits o le relief 3D est trs accident. Un estimateur de gradient calcule la pente
de tout point de cette image 3D dans les deux directions x (lignes) et y (colonnes). La
direction du vecteur obtenu est celle de la plus grande pente.

Figure 1 : image de cubes en ponge et leur visualisation en 3D.

333 3 RRR R

EEE EPPP PRRR R SSS SEEE ENNN NTTT TAAA ATTT TIII IOOO ONNN N

333 3DDD D

DDD D



UUU UNNN NEEE E



III IMMM MAAA AGGG GEEE E

... .

Chargez une des images qui vous sont proposes en saisissant :

MonImage=imread('CubesNG.jpg') ;

Affichez-la avec :

figure(1) ; image(MonImage) ;

puis affichez sa version 3D avec :

figure(2) ; surf(double(MonImage)) ; shading interp ;

Utilisez licone de rotation pour faire tourner limage et essayer de relier ces deux re-
prsentations. Fates la relation entre contours et

falaises

.

Travaux pratiques de traitement dimage O. Strauss
Traitement dimages 2 M1 Vision et commande avance

444 4 AAA A

LLL LGGG GOOO ORRR RIII ITTT THHH HMMM MEEE E



DDD DEEE E

SSS S

HHH HEEE ENNN N

--- -CCC C

AAA ASSS STTT TAAA ANNN N

... .
444 4... .111 1 FFF Fii i illl lttt trrr reee e ddd deee e rrr reee eccc cooo onnn nsss sttt trrr ruuu uccc cttt tii i iooo onnn n... .

Lalgorithme de Shen-Castan considre le signal chantillonn dillumination comme le r-
sultat de lchantillonnage dun signal dillumination continu (ce quil est la plupart du
temps) et les contours comme des variations brutales du signal dillumination. Pour pou-
voir travailler sur le signal chantillonn comme sil tait continu, il faut utiliser un
filtre de reconstruction. Shen et Castan ont propos un filtre particulier (et simple)
permettant une reconstruction garantissant la non-dgradation des contours. Il a pour
expression :
avec .
Vous pouvez facilement visulaliser ce filtre :
Figure 2 : Filtre de Shen-Castan.

alpha = 0.8 ; x = -5:0.01:5 ; y = x ; Filtre = exp(-alpha*x


) * exp(-alpha*y) ;
figure(6) ; surf(x,y,Filtre) ; shading interp ;

444 4... .222 2 UUU Unnn n ppp peee euuu u ddd deee e ttt thhh h ooo orrr rii i ieee e ddd duuu u fff fii i illl lttt trrr raaa aggg geee e... .

Cest une approche simplifie qui vous est propose ici. Soit I

*

(x,y) limage chantillon-
ne, cest un signal qui vaut 0 partout sauf aux endroits o x et y sont entiers. Si I

*

(x,y)
est lchantillonnage de I(x,y) (la

vraie

image continue), alors ces deux fonctions con-
cident chaque fois que x et y sont des entiers. Il est possible destimer la valeur de
I(x,y) en dehors de valeurs entires de x et y par :
o <.> reprsente une opration de convolution
(un mlange des deux fonctions). Ces filtres sont censs garantir une certaine cohrence
cest dire que si x et y sont entiers, on doit avoir .
f x y , ( )
1
2 e

---------------e
x y + ( )
= 0 >
I x y , ( ) I

x y , ( ) I
*
x y , ( ) f x y , ( ) | =
I

x y , ( ) I
*
x y , ( )

Travaux pratiques de traitement dimage O. Strauss
Traitement dimages 3 M1 Vision et commande avance

La proprit remarquable qui est utilise ici est la suivante : supposons quon recherche
la drive partielle de I(x,y) par rapport x en chaque point de limage, il est impossible
de calculer cette grandeur partir dune information discrte puisquil y a discontinuit
en chaque point. Dit autrement nexiste pas (la fonction nest pas drivable).
Par contre, (x,y) est drivable en tout point (si elle est bien choisie) au moins au sens
des distributions (un espace qui contient celui des fonctions). Or
et aussi
On peut calculer, au sens des distributions, les deux drives de (x,y) en tout point
(au sens des fonctions, cette drive nexiste pas en 0).

444 4... .333 3 AAA Alll lggg gooo orrr rii i ittt thhh hmmm meee e ddd deee e SSS Shhh heee ennn n--- -CCC Caaa asss sttt taaa annn n... .

Tout calcul fait, lalgorithme rcursif de Shen-Castan permet de calculer une estimation
du gradient de limage en tout point de limage discrte en utilisant les proprits de
sparabilit du filtre. Je donne ici la faon de calculer le gradient en x (colonnes) que
lon va noter Gradient_x. Vous essayerez den dduire lalgorithme de calcul de
Gradient_y la drive partielle de la fonction dillumination suivant les lignes (y).
Pour calculer le gradient suivant les colonnes, il faut convoluer limage avec un filtre
qui lisse suivant les lignes puis convoluer le rsultat de ce lissage avec la drive du
filtre suivant les colonnes.
La premire partie de lalgorithme est :

MonImage = imread('CubesNG.jpg') ; figure(1) ; clf ; image(MonImage) ;
axis image ; colormap(gray(255)) ;
alpha = 2 ; % donnez une valeur a alpha
a0 = exp(-alpha) ; a1 = 1 - a0 ;
[Nlin, Ncol] = size(MonImage) ;
MonImageFiltree = zeros(Nlin, Ncol) ;
MonImageDerivee = zeros(Nlin, Ncol) ;
% filtrage suivant lignes (ce qui veux dire quon filtre les colonnes)
for col=1:Ncol
Colonne = zeros(1,Nlin) ;
Colonne(1:Nlin) = MonImage(1:Nlin,col) ;
Colonne1 = Colonne ;
Colonne2 = Colonne ;
% filtrage causal
for lin=2:Nlin
Colonne1(lin) = ( a1 * Colonne1(lin-1) ) + ( a0 * Colonne(lin) ) ;
end
% filtrage anti-causal
for lin=Nlin-1:-1:1
Colonne2(lin) = ( a1 * Colonne2(lin+1) ) + ( a0 * Colonne(lin) ) ;
end
MonImageFiltree(1:Nlin,col) = Colonne1(1:Nlin) + Colonne2(1:Nlin) - a0*Co-
lonne(1:Nlin) ;
end
I
*
x
------ x y , ( )
I

x
------ x y , ( ) I
*
x y , ( )
f x y , ( )
x
------------------ | =
I

y
----- x y , ( ) I
*
x y , ( )
f x y , ( )
y
------------------ | =
Travaux pratiques de traitement dimage O. Strauss
Traitement dimages 4 M1 Vision et commande avance

% drivation suivant les colonnes (ce qui veut dire quon filtre les lignes
% avec le filtre drivateur)
for lin=1:Nlin
Ligne = zeros(1,Ncol) ;
Ligne(1:Ncol) = MonImageFiltree(lin,1:Ncol) ;
Ligne1 = Ligne ;
Ligne2 = Ligne ;
for col=2:Ncol
Ligne1(col) = ( a1 * Ligne1(col-1) ) + ( a0 * Ligne(col) ) ;
end
for col=Ncol-1:-1:1
Ligne2(col) = ( a1 * Ligne2(col+1) ) + ( a0 * Ligne(col) ) ;
end
MonImageDerivee(lin,1:Ncol) = Ligne1(1:Ncol) - Ligne2(1:Ncol) ;
end
Gradient_X = MonImageDerivee ;

% Visualisation
cmax = max(max(MonImageDerivee)) ;
cmin = min(min(MonImageDerivee)) ;
MonImageDerivee = 255 * ( MonImageDerivee - cmin ) / ( cmax - cmin ) ;
figure(3) ; image(uint8(MonImageDerivee)) ;
axis image ; colormap(gray(255)) ;
Essayez cet algorithme pour diffrentes valeurs de alpha. Que constatez-vous ? Comment
interprtez vous les images que vous voyez ?
444 4... .444 4 NNN Nooo orrr rmmm meee e ddd duuu u ggg grrr raaa addd dii i ieee ennn nttt t
Un pixel de contour est un pixel pour lequel le vecteur gradient une norme importante.
Nous vous proposons ici de calculer et visualiser la norme du grandient de limage.
Cela sobtient trs simplement. Si Gx
*
(x,y) est le gradient en x de I
*
(x,y) et Gy
*
(x,y)
est le gradient en y de I
*
(x,y), alors la norme du gradient peut tre obtenue facilement
par : .
Pour nous, en numrique, on crira :
NormeGradient = sqrt( Gradient_X.^2 + Gradient_X.^2 ) ;
Affichez cette norme en niveaux de gris (attention bien normaliser votre image).
Calculez la norme du gradient pour diffrentes valeurs de alpha. Que remarquez-vous ?
Essayez dinverser limage obtenue :
figure(7) ; image(255 - ImageDeNorme) ;
axis image ; colormap(gray(255)) ;
444 4... .555 5 SSS Seee euuu uii i illl llll laaa aggg geee e ddd deee esss s ccc cooo onnn nttt tooo ouuu urrr rsss s... .
Seuillez limage des contours en utilisant son histogramme. Que remarquez-vous ?
G
*
x y , ( ) Gx
*
x y , ( ) ( )
2
Gy
*
x y , ( ) ( )
2
+ =
Travaux pratiques de traitement dimage O. Strauss
Traitement dimages 5 M1 Vision et commande avance
444 4... .666 6 EEE Exxx xttt trrr raaa accc cttt tii i iooo onnn n ddd deee esss s mmm maaa axxx xii i immm maaa a lll looo occc caaa auuu uxxx x ddd deee e lll laaa a nnn nooo orrr rmmm meee e ddd duuu u ggg grrr raaa addd dii i ieee ennn nttt t... .
Cette partie nest faire que si vous tes trs avanc.
Comme on peut lintuiter sur lil-
lustration ci-contre reprsentant
une partie de la norme du gradient
de limage des cubes, le contour
subjectif des objets de limage cor-
respond la ligne de crte de la
norme du gradient. Cette ligne de
crte est perpendiculaire au vec-
teur gradient calcul prcdem-
ment. Lide sous-jascente
lextraction de la ligne de crte
consiste donc tout simplement
comparer la norme du gradient en chaque pixel avec la norme du gradient des deux points
situs de part et dautre du pixel considr dans la direction du gradient.
Sur la figure ci-con-
tre on peut voir
limage en niveau de
gris de la partie con-
cerne de la norme
du gradient et un d-
tail de cette partie.
Dans la direction du
gradient, il ny a
aucune raison quil y ait un pixel entier. Il faut donc estimer la norme du gradient dans
la direction du vecteur gradient une distance unitaire du pixel considr.
Cette mthode peut tre rsume dans le schmas suivant :
G
r
a
d
i
e
n
t
Travaux pratiques de traitement dimage O. Strauss
Traitement dimages 6 M1 Vision et commande avance
On doit crer une interpolation au
point W en ne prenant en compte que
ces plus proches voisins (A, B, C et
D). Une faon trs simple de faire
cette interpolation est dutiliser une
pondration linaire.
La valeur du gradient en W est donne par :
Par exemple la valeur de , le coefficient de G(D) est donn par :
avec et
On peut vrifier facilement que , , ...
Il vous faut donc maintenant trouver une mthode permettant de calculer la position des
deux points dont on doit estimer le gradient, puis utiliser cette procdure pour trans-
former votre image de gradient en une image binaire ou chaque pixel est lablis 1 sil
est un point de contour, et 0 sinon.
Quand vous avez russi effectuer ce travail, essayez votre nouvelle extraction de
contour sur dautres images.
cerc
l
e

d
e

r
a
y
o
n

u
n
i
t

point ou
on doit
estimer
le gradient
A
B
C D
dx
dy
W
G

W ( )
G

W ( )
G A ( ) G B ( ) G C ( ) G D ( ) + + +
+ + +
--------------------------------------------------------------------------------- =

min
x

y
, ( ) =
x
1 dx =
y
1 dy =
G

A ( ) G A ( ) = G

B ( ) G B ( ) =

You might also like