bonjour,
j'ai implementé grace à cette formule, (merci zoop) un algorithme qui est sansé me donner le vecteur de trans lation d'une image.
ce code fonctionne à perfection si je me deplace d'un seul pixel mais commence à donner des erreurs au delà, et je n'arrive pas à identifier le probleme.
voici le dit code:
explication du code:Code:% **************************************************** % clear all texture=imread('image\monochrome\IM1.jpg'); % colormap(gray); % image(texture); i1=texture(1:200,1:200); i2=texture(1:200,1:200); i1=1*(i1-moy(i1)); i2=1*(i2-moy(i2)); i1=i1.^1; i2=i2.^1; %image(i1) % insertion des precedentes matrices dans des matrices de dim n+2 afin de % permettre de traiter les pixels aux limites pas=20; j1=zeros(length(i1)+2*pas); j1(pas+1:length(i1)+pas,pas+1:length(i1)+pas)=i1; j2=zeros(length(i1)+2*pas); j2(pas+1:length(i1)+pas,pas+1:length(i1)+pas)=i2; % initialistation des termes x, y, z x1=0;y1=0;z1=0; % recherche du max du produit de convolution. la position de celui-ci % traduit le vecteur de translation des l'image2 par rapport à l'image1 for i=-pas:pas for j=-pas:pas %%%%%%%%%%%%%%% for k=4*pas+1:length(i1)-2*pas for l=4*pas+1:length(i1)-2*pas x1=x1+(j1(k,l)*j2(k+i,l+j)); y1=y1+(j1(k,l)*j1(k,l)); z1=z1+(j2(k,l)*j2(k,l)); end end t12(i+pas+1,j+pas+1)=x1/sqrt(y1*z1); %%%%%%%%%%%%%%% end end surface(t12) % position du max du produit de correlation [a12,b12]=find(t12==max(max(t12))); A=[pas+1,pas+1]-[a12,b12] max(max(t12))
je charge d'image
j'en prends deux parcelles eloignées l'une de l'autre de cerais pixels (dans l'exemple ci dessus elles sont identiques)
les couleurs de l'images etant proches che clcule l'ecart à la moyenne de chaque image.
j'eleve l'image à une certaine puissance pour augmenter le contrast (ici c'est à la puissance 1)
je fixe un pas maximal de translation des deux images (bien evidemment il faut que la translation que l'ai defini avant soit inferieure ou egale à ce pas
je met les deux images dans deux matrices plus lages du pas de chaque coté
je calcule la matrice comprenant les produits de correlation de l'image 1 par l'image 2 tranlatée de mois le pas à plus le pas selon x et y. je ne prends en comte que les points compris entre + le pas et la dimentions de l'image moins le pas.
la poisition du max de la matrice du produit par rapport au centre donne le vecteur de translation.
le HIC est que si j'impose un pas de 1 c'est bon, j'obtiens un vecteur nul pour les deux images identiques, mais plus j'augmente le pas, plus il y a une erreur sur ce vecteur comment remedier à ça?
merci.
Je joint l'image avec laquell j'ai fait l'essai car le contrast de l'image influence le resultat.
Ce qui suit est ajouté à la demande d'einstein :
Je précise:
si je chage la premiere commande, au lieu d'importe une image je cree une matrice de Random, le resultat est juste:
Code:clear all % creation de la texture : image monchrome de 256bit de dimension 192x192 %texture=imread('image\monochrome\IM1.jpg'); texture = round(rand(500)*250); % colormap(gray); % image(texture); % generation des images prises par la souris: clichets de la precedente % image decalés d'un pixel les un des autres, positionnées conformément % à la trajecoire sus-citée i1=texture(1:200,1:200); i2=texture(10:209,3:202); i1=1*(i1-moy(i1)); i2=1*(i2-moy(i2)); i1=i1.^1; i2=i2.^1; %image(i1) % insertion des precedentes matrices dans des matrices de dim n+2 afin de % permettre de traiter les pixels aux limites pas=10; j1=zeros(length(i1)+2*pas); j1(pas+1:length(i1)+pas,pas+1:length(i1)+pas)=i1; j2=zeros(length(i1)+2*pas); j2(pas+1:length(i1)+pas,pas+1:length(i1)+pas)=i2; % initialistation des termes x, y, z x1=0;y1=0;z1=0; % recherche du max du produit de convolution. la position de celui-ci % traduit le vecteur de translation des l'image2 par rapport à l'image1 for i=-pas:pas for j=-pas:pas %%%%%%%%%%%%%%% for k=4*pas+1:length(i1)-2*pas for l=4*pas+1:length(i1)-2*pas x1=x1+(j1(k,l)*j2(k+i,l+j)); y1=y1+(j1(k,l)*j1(k,l)); z1=z1+(j2(k,l)*j2(k,l)); end end t12(i+pas+1,j+pas+1)=x1/sqrt(y1*z1); %%%%%%%%%%%%%%% end end surface(t12) % position du max du produit de correlation [a12,b12]=find(t12==max(max(t12))); A=[pas+1,pas+1]-[a12,b12] max(max(t12)) %V=[5-a12,6-b12]
-----