ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Salut, j'ai un code sous matlab qui marche partiellement pour le changement d'échelle (20% en matching), mais aucune correspondance dès que je passe à la rotation ....
Quelqu'un peut-il m'aider ?
Je pense que le probleme vient de mon calcul des gradients (?), mais j'ai beau essayer toute les formules possibles, j'y arrive pas...
J'utilise la fonction "gradient(image_lissée)" qui me fournit 2 matrices image_dx et image_dy. Ensuite, pour chaque pixel de coordonnées (i,j) :
- Amplitude(i,j) = sqrt(image_dx^2 + image_dy^2)
- Orientation(i,j) = (180/pi)*atan(image_dy/image_dx)
Pour finaliser la phase de "détection", je procède de la façon suivante (pour chaque octave ) : pour un pixel keypoint(i,j,sigma,octave)
1) Je sélectionne une zone 'RegionDétectée' de rayon r=4*sigma
2) Je détermine les différentes orientations possibles pour le keypoint, et les amplitudes associées
Pour la phase de "description", je procède comme ça :
1) Je redimensionne 'RegionDétectée' à la taille 41*41 pixels (après lissage si nécessaire). On appelle 'Region' cette zone de travail.
1) Pour chaque orientation theta du keypoint :
1.a) Je tourne la 'Region' d'un angle "-theta" pour l'aligner sur l'orientation
actuelle
2.b) Je calcule le vecteur descripteur, et le normalise à la fin
Pour la phase de matching, j'ai repris le code de Lowe.
...
Merci
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Oui, il me semble que ta méthode soit la plus logique (c'est d'ailleur ce que propose Lowe). Mon problème vient surement du calcul des gradients, et j'ai malheuresement pu constater que les vecteurs calculés aux points d'intérêt ne "tournent" pas lorsque j'effectue une rotation de l'image....Moi je parcours les pixels de la région tournée d'un angle "+Theta". Pour chaque pixel, je calcule le gradient dans l'image originale (non tournée) et je retranche "Theta" a la valeur de l'angle du gradient.
Matlab propose la fonction "quiver" pour visualiser les gradients ; dans ce cas, on constate bien que les vecteurs "tournent" avec l'image. Mais lorsque j'essaie de reproduire cette invariance avec les dérivées partielles fournies par la fonction "gradient", ça marche plus .... Quézako ?.... Je creuse toujours ^^. C'est pour ça que j'ai essayé de calculer les descripteurs SIFT sur des portions "tournées" d'un angle theta...J'utilise la fonction "gradient(image_lissée)" qui me fournit 2 matrices image_dx et image_dy. Ensuite, pour chaque pixel de coordonnées (i,j) :
- Amplitude(i,j) = sqrt(image_dx^2 + image_dy^2)
- Orientation(i,j) = (180/pi)*atan(image_dy/image_dx)
Juste une remarque en passant, regarde s'il n'y a pas une fonction "atan2(y,x)" dans Matlab.
Les fonctions "atan2" sont plus robustes pour le calcul (surtout pour x proche de zéro).
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Il y a bien une fonction "atan2" dans Matlab. Mais le résultat est le memeJuste une remarque en passant, regarde s'il n'y a pas une fonction "atan2(y,x)" dans Matlab.
Les fonctions "atan2" sont plus robustes pour le calcul (surtout pour x proche de zéro).
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
La réponse est toute simple : gain sur le temps de calcul . Retrancher "theta" sur le voisinage du keypoint m'oblige à utiliser une nouvelle boucle "for" pour ramener les valeurs des angles entre 0 et 350° (pour le tracé des histogrammes par la suite). Faire tourner l'image l'image d'un angle "theta" m'évite cette boucle...Effectivement, c'est curieux.
Et pourquoi tu n'utilises pas la méthode de Lowe (retrancher "theta" a l'angle du gradient d'origine) au lieu de "tourner" l'image ?
Je "grignote" les secondes par-ci par là ^^, vu que pour l'instant il me faut au moins 8 secondes pour décrire une ptite image jpg de 12ko...
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Oui, effectivement, chui passé à côté ^^ En plus, y'a la fonction "rem" sous Matlab qui donne le reste d'une division entiere.... Mille excuses !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager