Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

translation d'image



  1. #1
    ABN84

    translation d'image


    ------

    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:
    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))
    explication du code:
    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]

    -----
    Images attachées Images attachées  
    Dernière modification par JPL ; 28/03/2009 à 23h14.
    "Engineering is the art of making what you want from what you get"

  2. #2
    zoup1

    Re : translation d'image

    J'ai pas tout regardé mais, l'initialisation de x1,y1,z1 ne se fait pas au bon endroit..
    Elle doit se situer entre les boucles...
    for i=-pas:pas
    for j=-pas:pas
    %%%%%%%%%%%%%%%
    -->> x1=0; y1=0; z1=0;

    for k=4*pas+1:length(i1)-2*pas
    for l=4*pas+1:length(i1)-2*pas
    Dernière modification par Coincoin ; 29/03/2009 à 13h52.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  3. #3
    zoup1

    Re : translation d'image

    Il me semble que dans Matlab, il y a une fonction qui calcule directement la corrélation de 2 images ; xcorr ou peut-être xcorr2 (attention cependant, de mémoire, il y a une fonction qui fait le calcul par transformé de fourrier qui est un peu bugguée..., si on fait ce choix, il est préférable de faire soit même le cacul en fourrier).

    par ailleurs, pour faire ce calcul, il n'y a pas besoin de normaliser la corrélation... Il n'y a donc pas besoin de calculer les termes y1 et z1 qui sont de toutes façon constant pour tous les déplacements i,j
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  4. #4
    ABN84

    Re : translation d'image

    Citation Envoyé par zoup1 Voir le message
    J'ai pas tout regardé mais, l'initialisation de x1,y1,z1 ne se fait pas au bon endroit..
    oui exact, c'est ce qui fesait tout foirer. en corrigeant ça tout c'eszt remis en ordre.
    merci
    "Engineering is the art of making what you want from what you get"

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Définition de la translation
    Par J.M.M dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 29/05/2008, 19h37
  2. Translation/homothétie
    Par nassoufa_02 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 12/11/2007, 20h54
  3. Guidage en translation
    Par MEL67 dans le forum Technologies
    Réponses: 16
    Dernier message: 19/04/2007, 15h46
  4. translation,homothetie
    Par tipoulette dans le forum Mathématiques du collège et du lycée
    Réponses: 10
    Dernier message: 19/01/2007, 18h49
  5. Translation
    Par amaew dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 13/10/2005, 19h50