Académique Documents
Professionnel Documents
Culture Documents
Cet algorithme sera testé sur une image réelle SAR ainsi que sur une
image de synthèse obtenue à partir de générations de pixels suivant deux lois
gamma différentes.
Annexe p.15
1/21
I. Approche théorique
2/21
Ces ondes réfléchies sont caractérisées par une amplitude a k et un
angle de réflexion k .
N
Pour N réflecteurs le signal reçu (figure 2) sera donc : a.e = ∑ a . e j . k
k
k=1
I=S.Z
3/21
La puissance d'un pixel X, sur une zone homogène de puissance moyenne
P0 aura alors pour fonction de vraisemblance :
−L
1 P0 L−1 −xL
p x / P0 = x exp (1)
L L P0
Approche gradient :
Une première approche consiste à appliquer un détecteur de contours
classique basé sur le calcul du gradient. Le problème rencontré est le suivant :
la variance du gradient sur une zone homogène est d'autant plus que grande
que la puissance de la zone envisagée est élevée. Les queues de la fonction de
densité de probabilité du gradient empiètent alors plus largement sur la
fonction de densité de probabilité du gradient sur une zone de contour. Le
risque de confusion entre un contour et une zone homogène (i.e. La probabilité
de fausse alarme) est plus élevé. Le détecteur de contours basé sur le gradient
est donc inutilisable dans le cas d'une image dont la puissance de ses pixels suit
une loi Gamma, comme c'est le cas avec les images sujettes à un bruit de
speckle.
4/21
Approche ratio :
On s'intéresse alors à un détecteur de contours basé sur le calcul du ratio
de la moyenne de la puissance (ou de l'amplitude) des deux régions contiguës
au pixel d'intérêt (puissances ou amplitudes notées P1 et P2). La fonction de
vraisemblance du ratio R est de la forme :
p R/ P1 , P2=
n 2NL
NL2 [ P1/ P2NL
n
R P1/P2 2NL ] R nNL−1 (2)
5/21
II. Approche pratique
II.1) Algorithme
NL NL
P1 P2
P1 n 2NL P2 P1 nNL−1
pr / = × ×r r ∈[ 0,1] (4)
P2 NL
2
P2
2NL
n
r
P1
T
Pd T , C r =P rT /C r =∫0 p r / Cr dr (5)
6/21
Et par conséquent, la probabilité de fausse alarme qui correspond à la
probabilité de détecter un contour alors que les zones sont homogènes (i.e.
C r =1 ) s'écrit :
T
Pfa T =Pd T ,1=∫0 p r / Cr=1 dr (6)
7/21
sur la plus petite taille de fenêtre (i.e. i=1 ). Si 0≤r 1≤T 1 alors on garde r 1
sinon on calcule r 2 . Puis si T 1≤r 2≤T 2 alors on garde r 2 sinon on calcule r 3
et ainsi de suite jusqu’à T M −1≤r M ≤1 . A l’issue de cette première étape, on a
donc conservé un seul ratio r correspondant à une seule taille de fenêtre. La
décision est alors :
– si r ≤T M le point est assimilé à un contour
– sinon à une zone homogène.
Remarques :
8/21
les vecteurs n , N et T ). Les paramètres dont le calcul a nécessité une
fonction matlab propre sont L et T .
L devrait normalement être évalué par eval_numberLooks.m (p.17)
mais comme expliqué précédemment le résultat n’est pas convenable. Les
résultats à la partie suivante sont donc obtenus avec L=1 arbitrairement.
T est calculé grâce à compute_decision_threshold.m (p.18) qui utilise
(6) pour calculer T en fonction de Pfa , N et L . L’intégrale (6) est calculé
pas à pas afin de se rapprocher de Pfa et d’en déduire la borne T .
Une fois que tous ces paramètres sont calculés, les décisions de contour
sont prises par la fonction edge_detection_core.m (p.18) qui effectuent
simplement des tests sur les ratios par rapport aux seuils T . Les ratios sont
calculés à chaque pixel et pour différentes orientations par
minimum_neighborhood_ratio.m. (p.19 et 20).
A cette étape là, les contours sont détectés mais ont une largeur fonction
de M .La fonction bwmorph de matlab est alors utilisé pour affiner les
contours. Nous montrerons le résultat de cette fonction à la partie suivante
(bwmorph utilisée avec l’option « thin »).
9/21
III. Résultats
Nous présentons ici les résultats obtenus, dans un premier temps avec
une image réelle et puis avec une image de synthèse. A chaque figure est
précisé les paramètres d’entrée ( Pfa et M ) et pour chaque couple de
paramètres d’entrées il y aura deux figures « résultat » : la détection de
contours brute avec des contours trop épais et la détection de contours affinés
grâce à matlab.
Fig. 4: niger_ERS1.tiff
– Pfa=0,1 et M =2
10/21
– Pfa=0,1 et M =5
– Pfa=0,01 et M =2
11/21
– Pfa=0,01 et M =5
12/21
III.2) Image de synthèse
L’image test ici est une image comportant deux régions vues comme la
réalisation de deux processus aléatoires décrits par deux densités gamma
différentes. Pour créer une densité gamma d’ordre N, nous avons pris la racine
carré de la somme d’ordre N du carré de variables aléatoires gaussiennes
centrées et réduites.
Fig. 16: histogramme de la partie gauche Fig. 17: histogramme de la partie droite
13/21
Nous obtenons avec les paramètres Pfa=0,05 et M =4 :
Le résultat est correct mais nous obtenons tout de même des contours
détectés dans la partie gauche et la ligne de séparation des deux zones n’est
pas entièrement détectée. Le paramètre qui pose problème ici est surtout la
probabilité de fausse alarme, si on la baisse on aura moins de faux contours
mais on risque de moins détecter la ligne de séparation, si on l’augmente on
aura encore plus de faux contours dans la partie gauche. Le paramètre M a
moins d’importance, on peut se permettre d’avoir un contour épais vu la
morphologie du contour (ligne vertical), cela pourra se corriger facilement.
III.3) Conclusion
Que ce soit avec une image réelle ou de synthèse nous obtenons donc des
résultats corrects sans être exceptionnels, ce qui nous paraît légitime car pour
implémenter nous avons fait des hypothèses (sur L et sur le fait que les
images soient des images de puissance) et nous avons utilisé un outil de matlab
pour affiner les contours qui n’aient pas parfaitement adapté à cette détection.
Cependant, même si il est possible d’aller plus loin, ce projet nous a
donné une bonne vision de la détection de contours par ratio proposé par Touzi,
Lopes et Bousquet.
14/21
ANNEXE
Le code des fonctions matlab implémentées sont regroupées ici à titre
consultatif.
- ratio_edge_detector.m
% Parameters
disp('');
disp('- Window sizes ni');
n = 2.*[1:1:M]+1 % window sizes (n x n)
disp('');
disp('- Numbers of pixels in different neighborhoods Ni');
N = n.*(n-1)/2 % numbers of pixels in different neighborhoods
disp('');
disp('- L evaluation');
L=1
%L = eval_numberLooks (I,dl,dc,l,c,M,n,N,Pfa); % evaluate number of looks L (L-look SAR
image)
15/21
T,
% Edge detection
disp('');
disp('- Edge detection');
img_edge = edge_detection_core(I,dl,dc,l,c,M,n,T);
img_edge_inverse = -img_edge+255;
% thinning
img_edge_thin = -bwmorph(img_edge_inverse,'thin',Inf)+1;
% skeletonizing
img_edge_skel = -bwmorph(img_edge_inverse,'skel',Inf)+1;
bw = edge(I,'sobel','both');
% Displays
figure(1)
imshow(I);
figure(2)
imshow(img_edge);
figure(3)
imshow(img_edge_thin);
figure(4)
imshow(img_edge_skel);
figure(5)
imshow(bw);
end
16/21
- eval_numberLooks.m
Z = 500;
L_temp = zeros(1,Z);
iter_L = 0;
iter = 1;
while (iter <= M)
[r,P0,V] = minimum_neighborhoods_ratio(I,i,j,n(iter)) ;
if ( r >= T_temp(iter) & r <= T_temp(iter+1) )
iter = M+1;
else
iter = iter+1;
end
end
end
end
17/21
- compute_decision_threshold.m
% Computes decision threshold using Pfa, N and L
NL = N*L;
P=0;
H = 0.001 ;
S=0;
T = S;
- edge_detection_core
% Proceeds the edge detection decisions
time=i*j/l/c;
if (time >= lim_time)
[s,err] = sprintf('%d%s',round(lim_time*100),'%');
disp(s);
lim_time = lim_time+0.1;
end
iter = 1;
while (iter <= M)
[r,P0,V] = minimum_neighborhoods_ratio(I,i,j,n(iter)) ;
if ( r >= T(iter) & r <= T(iter+1) )
iter = M+1;
else
iter = iter+1;
end
end
if ( r > T(M+2) )
img_edge(i,j) = 255;
end
end
end
end
18/21
- minimum_neighborhoods_ratio.m
% Computes the minimum neighborhood ratio using the usual directions
d = (nw-1)/2;
% Vertical direction
N1 = I(i-d:i+d,j+1:j+d); % neighborhood 1
N2 = I(i-d:i+d,j-d:j-1); % neighborhood 2
P1 = mean(mean(N1)); % mean power 1
P2 = mean(mean(N2)); % mean power 2
rv = P1/P2; % ratio of mean powers
if ( rv > 1)
rv = 1/rv;
end
% Horizontal direction (evaluate by the way variance and mean over the region)
N1 = I(i+1:i+d,j-d:j+d);
N2 = I(i-d:i-1,j-d:j+d);
P1 = mean(mean(N1));
P2 = mean(mean(N2));
rh = P1/P2;
if ( rh > 1)
rh = 1/rh;
end
N = [N1 N2];
u = size(N,1)*size(N,2);
N = reshape (N,1,u);
P0 = mean ([P1 P2]);
V = var(double(N));
% Oblic direction /
P1 = 0;
P2 = 0;
for il=1:nw-1
P1 = P1 + sum(I(i-d+il-1,j-d:j+d-il));
P2 = P2 + sum(I(i+d-il+1,j-d+il:j+d));
end
ro1 = P1/P2;
if ( ro1 > 1)
ro1 = 1/ro1;
end
% Oblic direction \
P1 = 0;
P2 = 0;
for il=1:nw-1
P1 = P1 + sum(I(i+d-il+1,j-d:j+d-il));
P2 = P2 + sum(I(i-d+il-1,j-d+il:j+d));
end
ro2 = P1/P2;
19/21
if ( ro2 > 1)
ro2 = 1/ro2;
end
% if (P2 == 0)
% I(i-d:i+d,j-d:j+d),
% ro2,
% end
% Minimum ratio
r = min([rv,rh,ro1,ro2]);
end
- create_img_gamma.m
% creates a L*C image (L lines, C columns)
% with two homogeneous areas (N1-order and N2-order gamma distribution)
% the separation is the vertical middle line
% create image
img_gamma = zeros(L,C) ;
img_gamma(:,1:round(C/2)) = A1 ;
img_gamma(:,round(C/2)+1:C) = A2 ;
img_gamma = uint8(img_gamma) ;
min(min(img_gamma))
max(max(img_gamma))
figure(3)
imshow(img_gamma) ; % display image
imwrite (img_gamma, 'gamma.tiff', 'tiff') ; % save image as TIFF format
20/21
- gamma_generation.m
% generates L*C N-order gamma random variables
function Ga = gamma_generation(L,C,N)
21/21