ANNEXES
Annexe 1 : Caractéristiques des machines à usinage rapide Urane 20 et Urane 25
URANE est un centre d'usinage à grande vitesse intégrable en transfert.
C'est l'une des machines les plus performantes du marché de l'usinage à grande vitesse. Elle est équipée de moteurs linéaires permettant ainsi d'augmenter sa dynamique et sa capacité à répéter les opérations.
Annexe 2 : Validation du Filtre de Harris pour la Détection des Points de Fortes Courbures
Procédure :
A partir de quelques images de synthèse, dont on connaît les positions exactes des coins, on exécute le filtre de Harris pour obtenir les résultats suivants :
C
Points de fortes courbures
as des Rectangles
image de synthèse
Coordonnées Coordonnées
réelles après calcul
40 35 39 35
40 76 39 76
125 35 124 35
125 76 124 76
42 139
43 99
120 99
121 139
Histogramme du filtre de Harris
Cas d'une Triple Jonction
C
image de synthèse
oordonnées réelles
112 190
après calcul
110 191
111 189
Points de fortes courbures
Histogramme du filtre de Harris
Cas d'un Cercle
image de synthèse
Points de fortes courbures
Histogramme du filtre de Harris
Annexe 3 : Listing du programme Matlab de la détection de PFCs par la méthode de Beaudet
%%%%%%%%%%%%%%%%%%% Calcul des Points de fortes courbures %%%%%%%%%%%%%
%%%%%%% par la méthode de Beaudet développée par Deriche %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
close all
s = input('Fichier image initiale:','s');
ima = imread (s);
imshow (ima);
title('Image Source');
ima1=double(ima);
[tail1,tail2]=size(ima);
%%%% élargissement de l'image initiale %%%%%%
ima2(1:tail1+4,1:tail2+4)=0 ;
ima2(3:tail1+2,3:tail2+2)=ima1;
ima1(1:tail1+4,1:tail2+4)=ima2(1:tail1+4,1:tail2+4);
clear ima2
%%%%%%%%%%%%%%%%%% Calcul de DET1 %%%%%%%%%%%%%%%%%%%%%%%%%%%
alpha = input('Entrez la valeur max alpha pour le calcul de DET1 :');
yd1(1:tail1+4,1:tail2+4)=0;
%%%% Calcul des dérivées secondes
[yxx,yyy,yyx] = ded (ima1, tail1, tail2, alpha);
%%%% yd1 = image det 1
yd1 = (yxx.*yyy)-(yyx.*yyx);
figure;
imshow(yd1);
title('yd1');
%%%%%%%%%% Seuillage de DET1 %%%%%%%%%%%%%%%%%
seuil = input('Entrez la valeur du seuil pour DET1 :');
figure;
imshow(yd1);
title('yd1');
ze1(1:tail1+4,1:tail2+4)=0;
for n = 3:tail2+2
for m = 3:tail1+2
if ((yd1(m,n)>seuil ) & ((sign(yd1(m,n-1))~=sign(yd1(m,n))) ...
| (sign(yd1(m-1,n))~=sign(yd1(m,n)))))
ze1(m,n) = yd1(m,n);
end
if ((yd1(m,n)>seuil ) & ((sign(yd1(m+1,n))~=sign(yd1(m,n))) ...
| (sign(yd1(m,n+1))~=sign(yd1(m,n)))))
ze1(m,n) = yd1(m,n);
end
end
end
figure;
imshow(ze1);
title ('image DET avec alpha max ');
%%%%%%%%%%%%%%%%%%%%% Max Locaux de DET1 %%%%%%%%%%%%%%%
z1 = max1(ze1,tail1,tail2);
figure;
imshow(z1);
title ('Image DET1 avec alpha max et Seuillage ');
%%%%%%%%%%%%%%%%%%%%% Calcul de DET2 %%%%%%%%%%%%%%%%%%%
clear alpha;
clear seuil
alpha = input('Entrez la valeur min alpha pour calcul de DET2 :');
%%%% calcul des dérivées secondes
[yxx,yyy,yyx] = ded (ima1, tail1, tail2, alpha);
%%%% yd2 = image det 2
yd2(1:tail1+4,1:tail2+4)=0;
yd2 = (yxx.*yyy)-(yyx.*yyx);
figure;
imshow(yd2);
title('yd2');
%%%%%%%%%% Seuillage de DET2 %%%%%%%%%%%%%%%%%
seuil = input('Entrez la valeur du seuil pour DET2 :');
ze2(1:tail1+4,1:tail2+4)=0;
for n = 3:tail2+2
for m = 3:tail1+2
if ((yd2(m,n)>seuil)&((sign(yd2(m,n-1))~=sign(yd2(m,n))) ...
|(sign(yd2(m-1,n)) ~= sign(yd2(m,n)))))
ze2(m,n)= yd2(m,n) ;
end
if ((yd2(m,n)>seuil)&((sign(yd2(m+1,n))~=sign(yd2(m,n))) ...
|(sign(yd2(m,n+1)) ~= sign(yd2(m,n)))))
ze2(m,n)= yd2(m,n) ;
end
end
end
figure;
imshow(ze2);
title ('image DET avec alpha min ');
%%%%%%%%%%%%%%%%%%%%% Max Locaux de DET2 %%%%%%%%%%%%%%%
z2 = max1(ze2,tail1,tail2);
figure;
imshow(z2);
title ('Image DET2 avec alpha min et seuillage ');
%%%%% Appariemment des points entre DET1 et DET2 %%%%%%%
clear aplha %
[tab1,tab2,cpt] = appariemment(z1,z2,tail1,tail2); %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Calcul du Laplacien de l'image source %%%%%%%%%%%%
[ze,yl] = laplacien (ima1,tail1,tail2); %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Calcul des passages par zéros des droites (AB) %%%
meth=input('\n1:Passage par zéro de X1 vers X2 - 2:Passage par zéro de X2 vers X1:');
if meth==1 %
c = droite (tab1, tab2, ze, tail1, tail2, cpt); %
else %
c = modifdroite (tab1, tab2, ze, tail1, tail2, cpt);%
end %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Elimination des points nuls %%%%%%%%%%%%%%%%%%%%%%
%%%%% ->passages par zéro inéxistants %%%%%%%%%%%%%%%%%%
[L,C]=size(c); %
d(1:L,1:C)=0; %
g=1; %
for i= 1:L %
if (c(i,1)~=0 & c(i,2)~=0) %
d(g,1) = c(i,1); %
d(g,2) = c(i,2); %
g=g+1; %
end %
end %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Création de l'image couleur pour afficher %%%%%%%%
%%%%% les PFCs en couleur sur l'image en NDG %%%%%%%%
for x=1:tail1 %
for y=1:tail2 %
a(x,y,1)=ima(x,y); %
a(x,y,2)=ima(x,y); %
a(x,y,3)=ima(x,y); %
end %
end %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Remise à l'echelle des valeurs des pixels %%%%%%%%
[L1,C1] = size(d); %
for i=1:L1 %
if (d(i,1)~=0 & d(i,2)~=0) %
d(i,1) = d(i,1)-2; %
d(i,2) = d(i,2)-2; %
end %
end %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Application des PFCs sur l'image initiale %%%%%%%%
if (d(i,1)>0 & d(i,2)>0) %
for i = 1:L %
a(d(i,1),d(i,2),1) = 0 ; %
a(d(i,1),d(i,2),2) = 255 ; %
a(d(i,1),d(i,2),3) = 0 ; %
figure; %
imshow(a); %
title('finale'); %
end %
else %
' Aucun points caractéristiques éxistent' %
end %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Fonction utilisée pour le calcul des dérivées %%%%
%%%% premières et secondes suivant les axes x et y %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [yxx,yyy,yyx] = ded (ima1, tail1, tail2, alpha)
yx = derivx(ima1,tail1,tail2, alpha);
yy = derivy(ima1,tail1,tail2, alpha);
yxx = derivx(yx,tail1,tail2,alpha);
yyy = derivy (yy, tail1, tail2, alpha);
yyx = derivx (yy, tail1, tail2, alpha);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fonction calculant la dérivée directionnelle %%%%
%%%% suivant x par la méthode récursive de Deriche %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function yx = derivx(ima1,tail1,tail2, alpha)
% initialisation des paramètres de la dérivée suivant x
% initialisation des matrices nécessaires aux calculs
y1(1:tail1+4,1:tail2+4)=0;
y2(1:tail1+4,1:tail2+4)=0;
r(1:tail1+4,1:tail2+4)=0;
y11(1:tail1+4,1:tail2+4)=0;
y22(1:tail1+4,1:tail2+4)=0;
yx(1:tail1+4,1:tail2+4)=0;%yx = dérivée suivant l'axe des x
k=((1-(exp(-alpha)))^2) / (1+(2*alpha*exp(-alpha))-exp(-2*alpha));
b1 = 2*exp(-alpha);
b2 = -exp(-2*alpha);
%%% Calcul des paramètres du filtre récursif %%%%
a1 = 0; %
a2 = 1; %
a3 = -1; %
a4 = 0; %
a5 = k; %
a6 = k*exp(-alpha)*(alpha-1); %
a7 = k*exp(-alpha)*(alpha+1); %
a8 = -k*exp(-2*alpha); %
c1 = -(1-exp(-alpha))^2; %
c2 = 1; %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Calcul de la dérivée suivant x %%%%%%%%%%%%
%%%%%%%%traitement des pixels
for n = 3:tail2+2
for m = 3:tail1+2
y1(m,n)=a1*ima1(m,n)+a2*ima1(m,n-1)+b1*y1(m,n-1)+b2*y1(m,n-2);
end
end
for n = 3:tail2+2
for m = 3:tail1+2
l=tail2-n+5;
y2(m,l)=a3*ima1(m,l+1)+a4*ima1(m,l+2)+b1*y2(m,l+1)+b2*y2(m,l+2);
end
end
r=c1*(y1+y2);
%%%%%%%%%%%%%%%%%%%
for m =3:tail1+2
for n = 3:tail2+2
y11(m,n)=a5*r(m,n)+a6*r(m-1,n)+b1*y11(m-1,n)+b2*y11(m-2,n);
end
end
for m = 3:tail1+2
for n = 3:tail2+2
l=tail1-m+5 ;
y22(l,n)=a7*r(l+1,n)+a8*r(l+2,n)+b1*y22(l+1,n)+b2*y22(l+2,n);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%% yx = dérivée suivant x %%%%%%%%%%%%%%%%%%
yx = c2*(y11+y22); %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Calcul de droite et points adjacents par la méthode de Bresenham %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function c = droite (tab1, tab2, ze, tail1, tail2, cpt)
%%%%%%% initialisation des variables
aze=ze;
I1=0; % extrémité 1 en x
J1=0; % extrémité 1 en y
I2=0; % extrémité 2 en x
J2=0; % extrémité 2 en y
c(1:cpt-1,1:2)=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:cpt-1
I1 = tab1(i,1);
J1 = tab1(i,2);
I2 = tab2(i,1);
J2 = tab2(i,2);
i1=I1;
j1=J1;
i2=I2;
j2=J2;
%%%%%%%%%%%%%% Calul de la plus grande longueur %%%%%%%%%%%%%%%%%%%
deltai = abs(i1-i2);
deltaj = abs(j1-j2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Cas particuliers %%%%%%%%%%%%%%%%%%%%%%
if ((deltai==0) & (deltaj ==0))
'Erreur, les 2 points sont IDENTIQUES'
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% droites verticales %%%%%%%%%%%%%%%%%%%%
if ((deltaj==0) & (deltai~=0))
if (sign(i1-i2)>0)
while ((aze(i1,j1) ~= 256) & (i1 > i2))
i1=i1-1;
end
else
while ((aze(i1,j1) ~= 256) & (i1 < i2))
i1=i1+1;
end
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% droites horizontales %%%%%%%%%%%%%%%%%%%%%%%
if ((deltai==0) & (deltaj~=0))
if (sign(j1-j2)>0)
while (aze(i1,j1) ~= 256) & (j1 > j2)
j1=j1-1;
end
else
while ((aze(i1,j1) ~= 256) & (j1 < j2))
j1=j1+1;
end
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% droites diagonales %%%%%%%%%%%%%%%%%%%%%%%%
if ((deltai == deltaj) & (deltai~=0) & (sign(i1-i2)>0) & (sign(j1-j2)>0))
while ((aze(i1,j1) ~=256) & (i1>i2) & (j1>j2))
i1=i1-1;
j1=j1-1;
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
else
if ((deltai==deltaj)&(deltai~=0) & (sign(i1-i2)>0)&(sign(j1-j2)<0))
while ((aze(i1,j1) ~=256) & (i1>i2) & (j1
i1=i1-1;
j1=j1+1;
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
else
if((deltai==deltaj)&(deltai~=0) & (sign(i1-i2)<0)&(sign(j1-j2)<0))
while ((aze(i1,j1) ~=256) & (i1
i1=i1+1;
j1=j1+1;
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
else
if((deltai==deltaj)&(deltai~=0)&(sign(i1-i2)<0)&(sign(j1-2)>0))
while ((aze(i1,j1) ~=256) & (i1j2))
i1=i1+1;
j1=j1-1;
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%% Droites quelconques %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% Cas où DeltaJ>DeltaI %%%%%%%%
if((deltaj>deltai)&(deltai~=0)&(deltaj~=0))&((sign(i1-i2)>0)&(sign(j1-2)>0))
a = (i1-i2)/(j1-j2);
b = i1-(a*j1);
j1 = j1 - 1;
while ((aze(i1,j1) ~=256) & (i1>i2) & (j1>j2))
I = a*j1 + b
if (abs(i1-I) < abs((i1-1)-I))
j1 = j1 - 1;
else
j1 = j1 - 1;
i1 = i1 - 1;
end
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
else
if((deltaj>deltai)&(deltai~=0)&(deltaj~=0))&((sign(i1-i2)>0)&(sign(j1-2)<0))
a = (i1-i2)/(j1-j2);
b = i1-(a*j1);
j1 = j1 + 1;
while ((aze(i1,j1) ~=256) & (i1>i2) & (j1
I = a*j1 + b;
if (abs(i1-I) < abs((i1-1)-I))
j1 = j1 + 1;
else
j1 = j1 + 1;
i1 = i1 - 1;
end
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
else
if((deltaj>deltai)&(deltai~=0)&(deltaj~=0)) …
&((sign(i1-i2)<0)&(sign(j1-j2)<0))
a = (i1-i2)/(j1-j2);
b = i1-(a*j1);
j1 = j1 + 1;
while ((aze(i1,j1) ~=256) & (i1
I = a*j1 + b;
if (abs(i1-I) < abs((i1+1)-I))
j1 = j1 + 1;
else
j1 = j1 + 1;
i1 = i1 + 1;
end
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
else
if((deltaj>deltai)&(deltai~=0)&(deltaj~=0))&((sign(i1-i2)<0)
& (sign(j1-j2)>0))
a = (i1-i2)/(j1-j2);
b = i1-(a*j1);
j1 = j1 - 1;
while ((aze(i1,j1) ~=256) & (i1j2))
I = a*j1 + b;
if (abs(i1-I) < abs((i1+1)-I))
j1 = j1 - 1;
else
j1 = j1 - 1;
i1 = i1 + 1;
end
end
if (aze(i1,j1) == 256)
c(cpt,1) = i1;
c(cpt,2) = j1;
aze(i1,j1)
else
'le point de passage par 0 existe pas '
end
i1=I1;
j1=J1;
i2=I2;
j2=J2;
end
end
end
end
%%%%%%% Cas où DeltaJ>DeltaI %%%%%%%%
……………..
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Fonction appariant les points de DET1 et DET2 %%%%%%%
%%%%% en utilisant une spirale 7x7 %%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [tab1,tab2,cpt] = appariemment(z1,z2,tail1,tail2)
%%%% agrandissement des images DET1 et DET2 de 6 pixels
%%%% ds ttes les directions
ima21(1:tail1+6,1:tail2+6)=0 ;
ima21(2:tail1+5,2:tail2+5)=z1;
z11(1:tail1+6,1:tail2+6)=ima21(1:tail1+6,1:tail2+6);
ima22(1:tail1+6,1:tail2+6)=0 ;
ima22(2:tail1+5,2:tail2+5)=z2;
z22(1:tail1+6,1:tail2+6)=ima22(1:tail1+6,1:tail2+6);
%%%% définition de la spirale 7x7 %%%%
mask = [0 1 1 1 0 -1 -1 -1 -1 0 1 2 2 2 2 2 1 0 -1 -2 -2 -2 -2 -2 -2 -1 0 1
2 3 3 3 3 3 3 3 2 1 0 -1 -2 -3 -3 -3 -3 -3 -3 -3
1 1 0 -1 -1 -1 0 1 2 2 2 2 1 0 -1 -2 -2 -2 -2 -2 -1 0 1 2 3 3 3 3 3
3 2 1 0 -1 -2 -3 -3 -3 -3 -3 -3 -3 -2 -1 0 1 2 3];
cpt=1;
i=0;
j=0;
k=0;
for m=4:tail1+3
for n=4:tail2+3
if (z11(m,n) ~=0)
while ((z22(m+i,n+j)==0) & (k<48))
k=k+1;
i=mask(1,k);
j=mask(2,k);
end
if (z22(m+i,n+j)~=0)
tab1(cpt,1)=m-1;
tab1(cpt,2)=n-1;
tab2(cpt,1)= m+i-1;
tab2(cpt,2)= n+j-1;
cpt=cpt+1;
end
end
end
end
%%%%%%%%%%% coordonnées i,j des points de DET1 %%%%%%%%%%%%%%%%
tab1=tab1(1:cpt-1,1:2); %
%%%%%%%%%%% coordonnées i,j des points de DET2 %%%%%%%%%%%%%%%%
tab2=tab2(1:cpt-1,1:2); %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Dostları ilə paylaş: |