IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

Invariance à la Rotation avec SIFT (Matlab)


Sujet :

Traitement d'images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 86
    Par défaut Invariance à la Rotation avec SIFT (Matlab)
    Bonjour,

    J'ai créé un programme composé en trois étapes :
    -Détecter les points d’intérêts de deux images avec Harris
    -Trouver les descripteurs de Harris
    - Matcher les points identiques.

    Les points de harris sont invariants à la rotation mais pas ceux du descripteur SIFT, et c'est là ou réside mon problème. J'ai créée une fonction matlab pour générer mon descripteur et mon invariance à la rotation par recalage d'histogramme mais cela ne fonctionne pas... Pouvez vous m'aider ?
    Ci - après mon code source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    function [H] =calculSIFTBloc(ptsHarris,IgPad,IorPad,k,Mg,kIndice)
    %Créer l'histogramme d'orientation pour un point et un bloc donné
    % @param ptsHarris : la liste des points
    % @param IgPad : le module du gradiant paddé
    % @param IorPad : l'image discrétisé en 8 Bins paddé
    % @param k : le numéro de bloc
    % @param Mg : the Gaussian SIFT mask
    % @param kIndice : matrice d'indexation de bloc
     
    % Coordonées du points de Harris
    x=ptsHarris(1,1);
    y=ptsHarris(1,2);
     
    % Size of padding
    t=8;
     
    %% Trouve le voisinage de 16x16 au point indiqué
     
    for i=8:(size(IorPad,1)-8)
        for j=8:(size(IorPad,2)-8)
     
            if (i-8==x && j-8==y)
     
                blocIorPad(:,:)=IorPad((i-t):(i+t -1),(j-t):(j+t -1));
                blocIgPad(:,:) =IgPad ((i-t):(i+t -1),(j-t):(j+t -1));
     
                %%% Mode DEBUG %%%
                save('blocIorPad.txt','blocIorPad', '-ascii');
                save('blocIgPad.txt','blocIgPad', '-ascii');
     
            end
        end
    end
     
    %%% Mode DEBUG %%%
    load('blocIorPad.txt');
    load('blocIgPad.txt');
     
    %% Invariance a la rotation
     
    % Calcul l'histogramme discrétisé en 8 bin 
    HRot=zeros(1,8);
     
     
     MatH=blocIgPad.*Mg;
     
    for i=1:16
        for j=1:16
     
            valH1=blocIorPad(i,j);
     
     
            if (valH1 ~= 0)
                HRot(valH1)=HRot(valH1)+MatH(i,j);
            end
     
        end
    end
     
    % Trouve le maximum du descripteur de Ig
    maxHRot=max(max(HRot));
     
     
    for i=1:8
        if (HRot(i)==maxHRot)
     
            thetaiIor=i;
     
        end
    end
    %[val,pos] = max(C(:));
     
    %% Calcul le descripteur SIFT en fonction du sous bloc défini
     
    % Trouve les indices du sous-bloc
    valInd=kIndice(:,:,k);
    valx=valInd(1,1);
    valy=valInd(1,2);
     
    % Trouve les sous-blocs
     ssBlocIorPad(:,:)=blocIorPad(valx:valx+3,valy:valy+3);
     ssBlocMatCste(:,:)=MatH(valx:valx+3,valy:valy+3);
     
     
     
    % Calcul le descripteur SIFT NON Invariant à la rotation
    HNonrect=zeros(1,8);
     
    for i=1:4
        for j=1:4
            val1=ssBlocIorPad(i,j);
     
              if (val1 > 0)
                 HNonrect(val1)=HNonrect(val1)+ssBlocMatCste(i,j);
              end
        end
    end
     
    %Recalage Géométrique
    Hrect=[HNonrect HNonrect];
     
    H=Hrect(thetaiIor:thetaiIor+7);
    end

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 86
    Par défaut
    Ne me dite pas qu'aucun modérateur ou rédacteur du forum ne sait résoudre mon problème ....

    Ps: Si vous pouvez éviter la référence à l'article de Lowe

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par TheDwarf01 Voir le message
    Ps: Si vous pouvez éviter la référence à l'article de Lowe
    C'est dommage, car si on pouvait faire référence à l'article de Lowe (chap 5, page 13), on pourrait expliquer que le descripteur SIFT est invariant aux rotations. En effet, on fait toujours une rotation du voisinage pour qu'il coïncide avec l'orientation du gradient.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 86
    Par défaut
    L'invariance à la rotation dans l'article de Lowe prend en considération le multi-échelle et un histogramme discrétisé en 36bins.

    Dans mon cas mon orientation est discrétisé en 8bins ce qui n'influence pas en grande partie les résultats et fait juste appel à un détecteur de Harris Mono Echelle.

    Ce que je voudrais savoir c'est si le recalage géométrique se fait bien de cette façon :

    -Prendre une fenêtre de voisinage 16x16 dans ma matrice discrétisé en 8 bins au point de harris détecter => blocIorPad
    -Prendre une fenêtre de voisinage 16x16 dans ma matrice de module du gradient au point de harris détecté => blocIgPad
    -Créer un histogramme pour Ig pour un voisnage 16*16 => trouver le thetai position de la valeur maximal de mon histo 1<=thetai<=8

    -Diviser mon bloc "blocIorPad" et "blocIgPad" en 16 sous blocs de 4x4 et calculer un histogramme pour un numéro de bloc donnée donc un 1<=kbloc<=16.
    -Recaler l'histogramme de mon kbloc en fonction de mon thetai de cette maniere :

    %Recalage Géométrique
    Hrect=[Histokbloc Histokbloc ];

    H=Hrect(kbloc:kbloc+7);
    A NOTER : Mon descripteur de Harris fonctionne bien avec deux images translaté (recalage géométrique inclus dans le code de compilation), mais me donne un matching à 100% faux dans le cas d'une image ayant une rotation avec même un angle de 5°... Or je devrais au moins trouver un matching correct à 80% min.

    Donc auriez vous une idée pour un recalage géométrique correct ?

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par TheDwarf01 Voir le message
    L'invariance à la rotation dans l'article de Lowe prend en considération le multi-échelle et un histogramme discrétisé en 36bins.
    Le multi-échelle n'intervient que dans l'étape de localisation des keypoints, pas dans la phase d'orientation.

    L'histogramme est effectivement discrétisé en 36 bins de 10°, mais la valeur de l'orientation dominante est trouvée par un fit sur une parabole : ca donne donc une valeur précise de l'orientation et pas l'index dans l'histogramme.


    Dans mon cas mon orientation est discrétisé en 8bins ce qui n'influence pas en grande partie les résultats et fait juste appel à un détecteur de Harris Mono Echelle.

    Ce que je voudrais savoir c'est si le recalage géométrique se fait bien de cette façon :

    -Prendre une fenêtre de voisinage 16x16 dans ma matrice discrétisé en 8 bins au point de harris détecter => blocIorPad
    -Prendre une fenêtre de voisinage 16x16 dans ma matrice de module du gradient au point de harris détecté => blocIgPad
    -Créer un histogramme pour Ig pour un voisnage 16*16 => trouver le thetai position de la valeur maximal de mon histo 1<=thetai<=8

    -Diviser mon bloc "blocIorPad" et "blocIgPad" en 16 sous blocs de 4x4 et calculer un histogramme pour un numéro de bloc donnée donc un 1<=kbloc<=16.
    -Recaler l'histogramme de mon kbloc en fonction de mon thetai de cette maniere :
    Il faut faire une rotation du voisinage avant de diviser le bloc et sous-blocs.



    Pour le reste, le principe m'a l'air bon. Pour le code Matlab, je ne sais pas : je ne lis pas ce langage.

    A NOTER : Mon descripteur de Harris fonctionne bien avec deux images translaté (recalage géométrique inclus dans le code de compilation), mais me donne un matching à 100% faux dans le cas d'une image ayant une rotation avec même un angle de 5°... Or je devrais au moins trouver un matching correct à 80% min.

    Donc auriez vous une idée pour un recalage géométrique correct ?
    Le détecteur de Harris "de base" n'est pas très robuste. Comme le coté multi-echelle de SIFT ne semble pas t'intéresser, jette un coup d'oeil sur le détecteur FAST : il est très rapide, très simple à programmer et beaucoup plus robuste.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 86
    Par défaut
    Il faut faire une rotation du voisinage avant de diviser le bloc et sous-blocs.
    Je tourne le voisinage autour de mon point d'intérêt de l'angle d'orientation correspondant à l'indice de mon theta i dans mon histogramme d'orientation sur le voisinage de 16x16 dans mon cas c'est bien ça ?

    Mais dois je aussi le tournée pour le module du gradient de l'image ?

    D'après wikipédia la rotation doit être de sens inverse pourquoi cela ?

Discussions similaires

  1. Modulation GFSK/OFDM avec Simulink/matlab
    Par somaa dans le forum Simulink
    Réponses: 0
    Dernier message: 15/05/2009, 11h14
  2. programmer avec GUI Matlab
    Par slayer21 dans le forum Interfaces Graphiques
    Réponses: 32
    Dernier message: 12/05/2009, 16h03
  3. Réponses: 1
    Dernier message: 06/03/2009, 20h08
  4. Réponses: 0
    Dernier message: 11/03/2008, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo