# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Invariants diffrentiels pour caractriser les points d'intrt

## mobi_bil

Bonjour  tous,
J'ai appris que les invariants diffrentiels ( il y a 9 en tous ) sont robustes  une rotation d'image.
J'ai pris une image, j'ai calcul les points d'intrt ainsi qu'un vecteur de dimension 9 pour chaque point d'intrt, j'ai pris la mme image avec rotation de 90 mais j'ai pas trouv les mmes valeurs des invariants .

----------


## pseudocode

C'est pour le moins curieux. Comment as-tu calcul Lx, Ly, Lxx, Lxy et Lyy ?

----------


## mobi_bil

> Comment as-tu calcul Lx, Ly, Lxx, Lxy et Lyy ?


Bonjour Pseudocode,
Trs trs simple....
Le principe est : Li reprsente la convolution de L'image par la gaussienne Gi.
Par exemple, Lx est la convolution de l'image par Gx avec Gx est la drive de la gaussienne G(x,y,sigme) par rapport  x, de mme pour Ly .
Lxx est la convolution de l'image par Gxx avec Gxx est la drive de Gx(dfinie prcdemment) par rapport  x, de mme pour Lxy.

Voici l'algo que j'ai cr, pour bien le comprendre; j'ai pris une image test et une autre test90 qui est la mme image avec rotation de 90, j'ai calcul le vecteur des 9 invariants au point (149,46) et un autre vecteur au point (203,149) qui est le mme point mais avec rotation de 90. Le probleme c'est que j'ai pas trouv les mmes valeurs alors que les auteurs disent que ce vecteur est invariant  une rotation d'image. Merci de votre aide Pseudocode.

----------


## pseudocode

A priori, a m'a l'air bien (j'ai les mmes dfinitions de L0  L4).

En plus, une rotation de 90 revient a inverser x et y dans les calculs, donc on peut voir que les formules sont bien invariantes au moins dans ce cas l.

Tu es sur de tes 2 coordonnes de points ? Tu as bien le mme L0 dans les 2 cas ?

----------


## mobi_bil

Oui pseudocode,

En xcutant ce programme, vous allez trouver :

debut
172.21832742734105                    172.17397279367185              ( L0)
5.332225947442304E36                 2.1250881593384136E38   ( gradient)
-3.238930586505578E54               -3.432745270568252E54
-3.133166971799954E15               -3.226231341671324E15  (laplacient)
2.309269566023731E37                 2.2805709098187814E37
-4.428978755498226E73                4.663555605139852E75
1.431306132499275E73                 -1.2076508489325673E75
-9.250108729227051E72                -3.346596118464249E75
-1.4185940203786387E73              -9.294610511825276E75

Ou est l'invariance de ce vecteur, pourquoi je ne trouve pas les mme valeurs des deux vecteurs pour chaque case ?

----------


## pseudocode

Hum... le gradient avec une valeur en 10^30 ca me semble extremement louche.  :8O: 

Pourtant je ne vois pas d'erreur dans le code.  ::koi:: 

Tu devrais afficher les valeurs des pixels du voisinage que tu utilises, et ventuellement les valeurs des filtres L1 et L2...

----------


## mobi_bil

j'ai pas compris, pourquoi faire tous a

----------


## pseudocode

> j'ai pas compris, pourquoi faire tous a


Bah, pour trouver d'o vient ton erreur.  ::aie::

----------


## mobi_bil

Il y a beaucoup de valeurs, j'ai pris un voisinage de rayon 16, c'est  dire une fentre de taille 33x33, voici quelque valeurs .



```

```

----------


## pseudocode

Ah, ca y est. J'ai trouv.  ::yaisse2:: 

Erreur de normalisation : 


```
filtersum += w;
```


Ta normalisation ne marche que si tous les coefs du filtre sont positifs (comme pour L0). Mais dans le cas de L1, les coefs sont positifs et ngatifs... en plus leur somme vaut (presque) 0 => division par (presque) 0 => valeurs du filtre normes. 

CQFD.

----------


## mobi_bil

Question 1 : Est ce que vous pouvez me corriger le code java
Question 2 : C'est quoi CQFD . Un GRAND MERCI .

----------


## pseudocode

> Question 1 : Est ce que vous pouvez me corriger le code java




```

```




> Question 2 : C'est quoi CQFD .


http://fr.wikipedia.org/wiki/CQFD_(abrviation)

----------


## mobi_bil

Merci pseudocode,
J'ai corrig mon code (voir ci-dessus), enfait, j'ai rajout un troisime vecteur invariant corrspondant au mme pixel mais avec une rotation de 180.

Voici les rsultats obtenus en excutant mon code :




> debut
> 172.21832742734105 ......    172.17397279367185 .....  172.48564726901725
> 2481.79606604095   ......      2452.6474461877615 ..... 2478.8917476285214
> 21300.91028399922   ......    20985.891474649994 ..... 22021.038407049266
> 39.70699974730636  ......     40.71535008062337 ......  39.79535755814265
> 1723.8697717233965   ......   1765.5949789689985 ..... 1708.7648250210523
> 368634.89798973623  ......    306728.4297827276 ......   332425.8646415088
> -1231055.506932279  ......   -1214838.1332020762 ...... -1209773.994190351
> -1506384.6793016023  ......  -1474817.3518091284 ... -1517708.2601119054
> -1239989.226103567  ......    -1097956.6382177062 ... -1307742.0940568834


J'attend toujours vos remarques et conseils. MERCI  ::D: .

----------


## pseudocode

> J'attend toujours vos remarques et conseils. MERCI .


Bah, voila... cela fonctionne. 1% d'cart entre les valeurs est un trs bon rsultat.

Quels conseils attends tu ?

----------


## mobi_bil

Bonjour Pseudocode,




> 368634.89798973623 ....... 306728.4297827276 ........ 332425.8646415088


Je vois qu' partir de la 5me composante du vacteur, on a des carts type important, je ne sais pas pourquoi ?




> -1231055.506932279 ...... -1214838.1332020762 ...... -1209773.994190351
> -1506384.6793016023 ...... -1474817.3518091284 ... -1517708.2601119054
> -1239989.226103567 ...... -1097956.6382177062 ... -1307742.0940568834


pourquoi ces valeurs sont ngatives? Est ce que vous avez une petite explication qui peut m'aider ? merci.

----------


## pseudocode

> Je vois qu' partir de la 5me composante du vacteur, on a des carts type important, je ne sais pas pourquoi ?


Plus l'ordre des diffrentiels est grand, plus les variations sont importantes. 

Dj il faudrait voir pourquoi le "L0" est diffrent. Normalement, ils devraient tre strictement identiques si les 3 voisinages contiennent exactement les mmes points.




> pourquoi ces valeurs sont ngatives? Est ce que vous avez une petite explication qui peut m'aider ? merci.


C'est normal. Ces valeurs peuvent tre ngatives. pas de panique.  :;):

----------


## mobi_bil

Oui, vous avez raison, 
L0 :
172.21832742734105 ...... 172.17397279367185 ..... 172.48564726901725

Je ne sais pas pourquoi, d'ailleur, il est clair dans votre tuto(filtre) qu'il y a une symetrie dans le noyau gaussien ?

D'aprs vous, est ce que cela nous gne  faire la similarit entre vecteurs des diffrentes images ?

----------


## pseudocode

> D'aprs vous, est ce que cela nous gne  faire la similarit entre vecteurs des diffrentes images ?


Non, ca ne gne pas trop car les valeurs pour les premiers ordres ont l'air trs similaires. C'est donc suffisant pour comparer les 2 vecteurs.

Cependant, ca serait bien de savoir d'ou vient cette petite difference pour L0... ca peut cacher un bug.  ::koi::

----------


## mobi_bil

Voil au final :

L0 : 172.21832742734105  
L0 (90) : 172.17397279367185 
L0 (180) : 172.48564726901725 
L0 (270) : 172.37148603173782

L1 : 2481.79606604095  
L1 (90) : 2452.6474461877615 
L1 (180) : 2478.8917476285214
L1 (270) : 2353.920598122124

L2 : 21300.91028399922 
L2 (90) : 20985.891474649994  
L2 (180) : 22021.038407049266 
L2 (270) : 16676.61902767234

L3 : 39.70699974730636 
L3 (90) : 40.71535008062337 
L3 (180) : 39.79535755814265 
L3 (270) : 38.45432461841962

----------


## mobi_bil

a y est. Je l'ai trouv  ::yaisse2::  .
j'ai pris une image(.jpg) et sa rotation de 90, j'ai calcul la luminance dans un pixel et son corrspondant aprs rotation de 90, j'ai pas trouv la mme luminance, par exemple, pour le pixel (249,249) et le (0,249) qui est le mme avec rotation de 90, j'ai trouv pour le premier 133 et pour le deuxime 134.

Le problme vien du logiciel qui fait la rotation d'une image, dans mon cas, j'ai utilis le logiciel Paint ( qui est inclu dans le windows XP), je ne sais pas comment garder la mme valeur de la luminance aprs avoir fait une rotation,  moins qu'il faut coder une technique de rotation d'image avec java ???

----------


## pseudocode

Pour les rotation de 90 et 180, il suffit de faire des changes et des symtries sur l'image originale.


```

```


Pour les autres rotations, il y aura forcment des "interpolations" de valeurs, donc les intensits seront diffrentes.

Cela dit, tu peux attnuer un peu les effets de ces changements d'intensit en divisant les valeurs L1, L2 ... L8 par la valeur de L0.  :;):

----------


## mobi_bil

Math.pow(String.toDouble(Merci beacoup),infini) .
J'ai trouv les mmes valeurs pour toutes les composantes L0,....,L8.

c'est quoi "interpolations" de valeurs ? c'est  dire diffrentes ou quoi ?

----------


## pseudocode

> c'est quoi "interpolations" de valeurs ? c'est  dire diffrentes ou quoi ?


c'est  dire que lorsque tu fais une rotation de 35 (par exemple) un pixel de  l'image d'origine arrive "entre plusieurs" pixels de l'image finale. Donc sa valeur se rpartie un peu sur tous les pixels.

----------


## mobi_bil

J'ai oubli de vous dire que le dernier et/ou les deux derniers chiffres aprs la  virgule sont diffrents .

L0 : 172.21832742734105  
L0 (90) : 172.21832742734108  
L0 (180) : 172.21832742734097  
L0 (270) : 172.21832742734108

j'ai cherch par tout, mais je ne sais pas d'ou vient cette diffrence, est ce que je peux fermer les yeux et continuer mon travail ?

----------


## pseudocode

> j'ai cherch par tout, mais je ne sais pas d'ou vient cette diffrence, est ce que je peux fermer les yeux et continuer mon travail ?


C'est surement les erreurs de calculs sur les nombre rels... Personnellement, je prends des matrices moins grandes (7x7 ou 9x9) et avec seulement des coefficients entiers (en multipliant par un facteur et redivisant par ce facteur aprs la convolution).

----------


## mobi_bil

Bonjour Pseudocode,
Je reprends cette discussion pour profiter de l'algorithme HarrisLaplace.
J'ai dja implementer un descripteur de points d'intrt invariant  la rotation d'image.
Pour cela, j'ai utilis les invariants diffrentiels qui sont des drives gaussiennes calcules au voisinage de chaque point d'intrt.
Pour calculer les points d'intrt, j'ai pris sigma2=1.5.
Par exemple, pour un point (x,y), on calcule 9 drives gaussiennes.
la taille de la rgion autour de chaque point est 2*4*sigma2, avec 4*sigma2 est le rayon de cette rgion.

Le problme avec HarrisLaplace est que chaque point a une chelle caractristique. Donc je cherche  savoir comment calculer les 9 invariants autour de chaque point en prenant en considration son chelle et son octave, car la rgion d'un point detect  l'octave o est infrieure  la rgion d'un point detect  l'octave o+1.

--------------------Merci---------------------

----------


## pseudocode

> Bonjour Pseudocode,
> Je reprends cette discussion pour profiter de l'algorithme HarrisLaplace.
> J'ai dja implementer un descripteur de points d'intrt invariant  la rotation d'image.
> Pour cela, j'ai utilis les invariants diffrentiels qui sont des drives gaussiennes calcules au voisinage de chaque point d'intrt.
> Pour calculer les points d'intrt, j'ai pris sigma2=1.5.
> Par exemple, pour un point (x,y), on calcule 9 drives gaussiennes.
> la taille de la rgion autour de chaque point est 2*4*sigma2, avec 4*sigma2 est le rayon de cette rgion.
> 
> Le problme avec HarrisLaplace est que chaque point a une chelle caractristique. Donc je cherche  savoir comment calculer les 9 invariants autour de chaque point en prenant en considration son chelle et son octave, car la rgion d'un point detect  l'octave o est infrieure  la rgion d'un point detect  l'octave o+1.


Il y a deux solutions : 

1. Calculer les invariants du point sur l'image originale en prenant le "sigma" de l'chelle caractristique.

2. Calculer les invariants du point sur l'image de la pyramide correspondant a l'chelle caractristique, en prenant un "sigma" constant.

La mthode "1" est plus couteuse mais plus prcise.

----------


## mobi_bil

Bonjour Pseudocode et merci pour la rponse.
Supposons qu'on utilise la premire mthode, quelle est la taille de fentre gaussienne ? Est ce qu'elle dpend du sigma2  ::aie:: ? (valeur trooooos grande donc taille de fentre trooooos grande) .
Est ce qu'on peut prendre une taille de fentre constante ?

----------


## pseudocode

> Bonjour Pseudocode et merci pour la rponse.
> Supposons qu'on utilise la premire mthode, quelle est la taille de fentre gaussienne ? Est ce qu'elle dpend du sigma2 ? (valeur trooooos grande donc taille de fentre trooooos grande) .


Le "sigma" de la gaussienne c'est le mme "sigma" que l'chelle caractristique.

Comme ca a dj t dit, la taille de la fentre gaussienne dpend des valeurs de la fonction. Il faut prendre une fentre suffisamment grande pour avoir une grande partie de la distribution. Avec des grandes valeurs de sigma, ca fait des fentre enoooormes.

Heureusement, tu peux passer dans l'espace de Fourier pour rduire les temps de calculs. 




> Est ce qu'on peut prendre une taille de fentre constante ?


Oui, tu peux a condition d'utiliser les images "floutes" de la pyramide, et pas l'image originale.

----------


## mobi_bil

> Le "sigma" de la gaussienne c'est le mme "sigma" que l'chelle caractristique.


Oui, je sais.




> Il faut prendre une fentre suffisamment grande pour avoir une grande partie de la distribution. Avec des grandes valeurs de sigma, ca fait des fentre enoooormes.


Avec un nombre d'octaves=5 et 9 scales, on aura un sigma2=1204, donc racine(sigma2)=34, une fentre de 2*2*34=136 (trs trs grande) ?

----------


## pseudocode

> Avec un nombre d'octaves=5 et 9 scales, on aura un sigma2=1204, donc racine(sigma2)=34, une fentre de 2*2*34=136 (trs trs grande) ?


Et oui. Ca devient vite trs grand.

C'est pour cela qu'il vaut mieux travailler sur les images de la pyramide afin d'avoir un noyau de taille constante.

Tu peux aussi travailler sur l'image du dbut de l'octave (l'image resample) et utiliser le noyau associ au sigma du niveau (qui est donc entre 1 et 4).  :;):

----------


## mobi_bil

Est ce qu'il existe une bases d'images  diffrentes chelles pour que je puisse tester descripteur+detecteur HarrisLaplace ?

----------


## pseudocode

> Est ce qu'il existe une bases d'images  diffrentes chelles pour que je puisse tester descripteur+detecteur HarrisLaplace ?


Je n'en connais pas.

----------


## mobi_bil

Bonjour Pseudocode,
Je pense qu'il y a un problme dans le detecterur HarrisLaplace.
Normalement une image I et sa rotation Ir contiennent le mme nombre de points, ce n'est pas le cas avec HarrisLaplace  ::mrgreen:: ?

----------


## pseudocode

> Bonjour Pseudocode,
> Je pense qu'il y a un problme dans le detecterur HarrisLaplace.
> Normalement une image I et sa rotation Ir contiennent le mme nombre de points, ce n'est pas le cas avec HarrisLaplace ?


Je supposes que tu parles dans le cas des rotations sans pertes (90, 180, 270). La diffrence vient trs probablement du downsampling dans la pyramide : prendre 1 point sur 2 dans une image et dans sa rotation ne donne pas forcment le mme rsultat.

----------


## mobi_bil

> La diffrence vient trs probablement du downsampling dans la pyramide : prendre 1 point sur 2 dans une image et dans sa rotation ne donne pas forcment le mme rsultat.


Oui, vous avez raison, c'est  cause du downlsampling.
Ce qui nous intresse le plus, c'est l'invariance et la correspondance mme  un changement d'chelle.
-------------------------------------------------------------------------

J'ai pris 3 images avec mon apareil photo numerique (canon powershot s80) Deux images de mme scene avec un zoom z1 et un autre z2 , et une troisime image de scene diffrente.
Pour faire la correspondance, j'utilise la distance entre les vecteurs invariants :
Supposons qu'on veut faire la correspondance entre les deux images de la mme scene : i1 (z1), i2 (z2).
Pour chaque point p de i1, je cherche son correspondant dans l'image i2 par calcul de la plus petite distance entre vecteur de point p et tous les vecteurs des point de i2, par exmple je trouve son correspondant g, puis je calcul la plus petite distance entre vecteur de g et tous les vecteurs des points de i1.

Si je trouve que son correspondant est p, alors on a un appariemment entre p et g.
Sinon, le point p de l'image i1 n'a pas de correspondant dans l'image i2.

Mon problme est que pour les deux images i1 et i2 avec 287 points trouvs dans i1 et 185 points trouvs dans i2, je trouve seulement 56 correspondances (c'est peu), alors que pour l'image i1 et une l'image i3 de scene diffrente et avec 303 points, je trouve 89 correspondance, je ne sais pas comment rgler ce problme  ::cry:: .
                            vous me proposez de faire quoi ??? Merci.

----------


## pseudocode

> Mon problme est que pour les deux images i1 et i2 avec 287 points trouvs dans i1 et 185 points trouvs dans i2, je trouve seulement 56 correspondances (c'est peu), alors que pour l'image i1 et une l'image i3 de scene diffrente et avec 303 points, je trouve 89 correspondance, je ne sais pas comment rgler ce problme .
> 
> vous me proposez de faire quoi ??? Merci.


Je propose de choisir autre chose que les invariants d'ordre. Il ne sont pas du tout robustes au bruit, aux dformations et a la discrtisation.  ::?: 

A performance evaluation of local descriptors

----------


## mobi_bil

Il n'y a aucune approche detaille, c'est juste un tat de l'art des techniques existantes.
Je ne sais mme pas ou et comment commencer ?
Puisque toutes ces approches existent, y a t-il pas quelqu'un qui a fait une implementation  ::D:  ?

----------


## pseudocode

> Il n'y a aucune approche detaille, c'est juste un tat de l'art des techniques existantes.
> Je ne sais mme pas ou et comment commencer ?
> Puisque toutes ces approches existent, y a t-il pas quelqu'un qui a fait une implementation ?


Regarde les descripteurs utiliss dans SIFT. Ils sont trs robustes. 

Dans SIFT il y a galement l'algorithme de matching entre 2 images .  :;):

----------


## mobi_bil

Je veux garder le mme algorithme HarrisLaplace et ajouter un descripteur de points d'intrt, est ce que c'est possible ?

----------


## pseudocode

> Je veux garder le mme algorithme HarrisLaplace et ajouter un descripteur de points d'intrt, est ce que c'est possible ?


Oui, c'est ce dont je parlais. Tu gardes la dtection de point d'interet Harris-Laplace et tu calcules pour chaque point le descripteur SIFT (cf. chapitre 5 et 6 du document "Distinctive Image Features from Scale-Invariant Keypoints")

----------


## mobi_bil

Dsol, j'ai fait un ffort de comprendre la description, j'ai retenu seulement comment faire dans la premire tape :
1 - calculer le gradient en un point-cl (x,y)  l'chelle σ  l'aide de
L(x,y,σ) (image lisse par la σ-gaussienne)
2 - calculer l'amplitude et l'orientation sur le point-cl.

Merci pour m'indiquer la suite.

----------


## pseudocode

> Dsol, j'ai fait un ffort de comprendre la description, j'ai retenu seulement comment faire dans la premire tape :
> 1 - calculer le gradient en un point-cl (x,y)  l'chelle σ  l'aide de
> L(x,y,σ) (image lisse par la σ-gaussienne)
> 2 - calculer l'amplitude et l'orientation sur le point-cl.


Houla. C'est bien plus compliqu que cela.

On travaille en ralit sur un voisinage du point-cl : Lowe recommande un voisinage 16x16 centr sur le point-cl. 

1. on calcule le gradient sur les pixels du voisinage =>  256 couples de valeur (rho,theta)
2. on cre un histogramme d'orientation (36 bins) de ces valeurs.  
3. on cherche le bin maximal et on en dduit le thta dominant = ThetaDom
4. on travaille maintenant sur un voisinage 16x16 tourn d'un angle ThetaDom
5. on dcoupe le voisinage en 16 sous-voisinages carrs (4x4)
6. on cre un histogramme d'orientation (8 bins) pour chaque voisinage
8. on cre un vecteur de caractristiques avec les 16*8 = 128 valeurs
7. on normalise ce vecteur

Tout cela avec des interpolations multi-linaires, des ajustements quadratiques et autres magouilles mathmatiques pour limiter les problmes de discrtisation.  ::aie::

----------


## mobi_bil

je vous l'ai dja dit dans le message supprim concernant les articles !!!!  :;): 

Y a t-il une technique plus simple ? 
Concernant les invariants diffrentiels, pourquoi le nombre de correspondance entre deyx images (je dis bien les mmes avec un zoom un peu diffrent) de mme scene donne un nombre de correspondance faible, d'ailleur, c'est d'aprs l'article de cordelia schmid, cette approche marche trs bien ?

----------


## pseudocode

> Y a t-il une technique plus simple ?


Heu... non. Le descripteur SIFT est dfini comme cela. Cela dit ce n'est pas excessivement dur, juste un peu long a coder. 




> Concernant les invariants diffrentiels, pourquoi le nombre de correspondance entre deyx images (je dis bien les mmes avec un zoom un peu diffrent) de mme scene donne un nombre de correspondance faible, d'ailleur, c'est d'aprs l'article de cordelia schmid, cette approche marche trs bien ?


Bah, je ne sais pas. D'aprs le document que j'ai post, les invariants diffrentiels n'ont pas l'air d'aimer le floutage. Peut-tre vaut-il mieux les calculer sur l'image originale plutt que sur l'image rduite.

----------


## mobi_bil

> Bah, je ne sais pas. D'aprs le document que j'ai post, les invariants diffrentiels n'ont pas l'air d'aimer le floutage. Peut-tre vaut-il mieux les calculer sur l'image originale plutt que sur l'image rduite.


Oui, j'ai calcul les invariants diffrentiels  partir de l'image originale en utilisant le scale de chaque point-cl, mais la mme chose.
Faut-il chercher une autre fonction de correspondance entre points-cl

----------


## pseudocode

> Oui, j'ai calcul les invariants diffrentiels  partir de l'image originale en utilisant le scale de chaque point-cl, mais la mme chose.
> Faut-il chercher une autre fonction de correspondance entre points-cl


Dj il faudrait savoir s'il y a vraiment des correspondances. Est-ce qu'il y a des points d'interts qui ont l'air de correspondre ? Avec la bonne chelle ? Et avec les bonnes valeurs d'invariants ?

----------


## mobi_bil

Bonjour,
Oui, il y a bien de bonnes correspondances mais il y a aussi de fausses correspondances pour les images de mmes scenes, le problme c'est que je n'arrive pas  liminer les fausses correspondances.
A votre niveau, comment faire la correspondance entre deux ensembles de points-cl ?

----------


## pseudocode

> Bonjour,
> Oui, il y a bien de bonnes correspondances mais il y a aussi de fausses correspondances pour les images de mmes scenes, le problme c'est que je n'arrive pas  liminer les fausses correspondances.A votre niveau, comment faire la correspondance entre deux ensembles de points-cl ?


Il faut d'autres informations pour pouvoir dcider si deux points sont des correspondances. Soit des informations locales (d'autres valeurs de descripteur) soit des informations globales (caractristiques sur des groupes de points).

----------


## mobi_bil

> Il faut d'autres informations pour pouvoir dcider si deux points sont des correspondances. Soit des informations locales (d'autres valeurs de descripteur) soit des informations globales (caractristiques sur des groupes de points).


Des information locales comme les drives d'ordre 4 donne le mme rsultat.
Sur quelles informations globales puis-je renseigner ? merci.

----------


## pseudocode

> Des information locales comme les drives d'ordre 4 donne le mme rsultat.
> Sur quelles informations globales puis-je renseigner ? merci.


On peut regarder s'il existe une mme transformation (linaire ?) entre les correspondances (position et chelle). 

Par exemple, la mme matrice de translation+rotation+zoom pour passer des points de l'image 1 aux points de l'image 2. C'est la mthode utilise dans SIFT.

----------


## mobi_bil

Est ce que vous avez un document qui parle et explique comment calculer la matrice de translation+rotation+zoom ?

----------


## pseudocode

> Est ce que vous avez un document qui parle et explique comment calculer la matrice de translation+rotation+zoom ?


comme je l'ai dit, c'est expliqu dans le document de Lowe sur SIFT.  :;):

----------


## mobi_bil

Vous voulez dire tous a :



> On travaille en ralit sur un voisinage du point-cl : Lowe recommande un voisinage 16x16 centr sur le point-cl. 
> 
> 1. on calcule le gradient sur les pixels du voisinage =>  256 couples de valeur (rho,theta)
> 2. on cre un histogramme d'orientation (36 bins) de ces valeurs.  
> 3. on cherche le bin maximal et on en dduit le thta dominant = ThetaDom
> 4. on travaille maintenant sur un voisinage 16x16 tourn d'un angle ThetaDom
> 5. on dcoupe le voisinage en 16 sous-voisinages carrs (4x4)
> 6. on cre un histogramme d'orientation (8 bins) pour chaque voisinage
> 8. on cre un vecteur de caractristiques avec les 16*8 = 128 valeurs
> 7. on normalise ce vecteur






> Tout cela avec des interpolations multi-linaires, des ajustements quadratiques et autres magouilles mathmatiques pour limiter les problmes de discrtisation


Comment puis-je connantre ces magouilles  :8O: ? Miracle.

----------


## pseudocode

> Vous voulez dire tous a


Non. Ca c'est le calcul des descripteurs. Plus loin dans le document il parle de l'algo de matching et du calcul de la matrice de transformation.

----------


## bilzzbenzbilz

Bonjour  tous,
j'aimerai savoir si ces invariants diffrentiels sont invariants aux changements de rotations par exemple 30, 25, 110.
Sinon, Est ce qu'il existe un moyen pour les rendre invariants ? 
merci d'avance.

----------


## pseudocode

> Bonjour  tous,
> j'aimerai savoir si ces invariants diffrentiels sont invariants aux changements de rotations par exemple 30, 25, 110.
> Sinon, Est ce qu'il existe un moyen pour les rendre invariants ? 
> merci d'avance.


Oui, les invariants diffrentiels sont invariants aux rotations. Du moins au erreurs de discrtisation prs, engendrs par les rotations d'angles diffrents de 90,180 et 270.

----------


## bilzzbenzbilz

Bonjour,
j'ai test les invariants diffrentiels sur deux images i1 et sa rotation de 90,180, 270, a marche trs bien  cause de la symtrie du masque gaussien utilis dans le calcul des invariant d'une part et de la rotation de l'image de 90, 180,270 d'autre part.

Mais quand j'applique les invariants  une rotation de 25, je ne trouve pas les mmes valeurs des vecteurs d'invariants car un mme point d'intrt de deux images i1 et sa rotation de 25 n'ont pas le mme voisinage ? est ce qu'il y a un moyen de garder les mmes valeurs des invariants mme avec une rotation diffrentes  90,180,270.
                                Merci.

----------


## pseudocode

> Mais quand j'applique les invariants  une rotation de 25, je ne trouve pas les mmes valeurs des vecteurs d'invariants car un mme point d'intrt de deux images i1 et sa rotation de 25 n'ont pas le mme voisinage ?


Tout a fait. Dans une rotation de 25 le voisinage avant/aprs ne concide pas au pixel prs. Il y a donc certaines valeurs de pixels qui sont modifies.




> est ce qu'il y a un moyen de garder les mmes valeurs des invariants mme avec une rotation diffrentes  90,180,270.


Non, pas vraiment. La diffrence dpendra de ton algorithme de rotation (mthode d'interpolation) et de la taille du voisinage, mais (sauf cas particulier) tu auras toujours une diffrence.

----------


## bilzzbenzbilz

Bonjour pseudocode,
Est ce que le SIFT permet pas de faire ces rotations (25,35,....) ?

----------


## pseudocode

> Bonjour pseudocode,
> Est ce que le SIFT permet pas de faire ces rotations (25,35,....) ?


Non. Il n'y a pas moyen de faire rapparaitre les informations qui ont t perdues lors de la rotation.

La seule chose, c'est que le descripteur de SIFT fait des moyennes sur un grand nombre de pixels autour du point considr, donc l'erreur due a la rotation est amoindrie.

----------


## Morpheus42000

Salut, j'ai un code sous matlab qui marche partiellement pour le changement d'chelle (20% en matching), mais aucune correspondance ds 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_lisse)" qui me fournit 2 matrices image_dx et image_dy. Ensuite, pour chaque pixel de coordonnes (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 "dtection", je procde de la faon suivante (pour chaque octave ) : pour un pixel keypoint(i,j,sigma,octave)
1) Je slectionne une zone 'RegionDtecte' de rayon r=4*sigma
2) Je dtermine les diffrentes orientations possibles pour le keypoint, et les amplitudes associes

Pour la phase de "description", je procde comme a :
1) Je redimensionne 'RegionDtecte'   la taille 41*41 pixels (aprs lissage si ncessaire). 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

----------


## pseudocode

> Pour la phase de "description", je procde comme a :
> 1) Je redimensionne 'RegionDtecte'   la taille 41*41 pixels (aprs lissage si ncessaire). 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


Moi je parcours les pixels de la rgion tourne d'un angle "+Theta". Pour chaque pixel, je calcule le gradient dans l'image originale (non tourne) et je retranche "Theta" a la valeur de l'angle du gradient.

----------


## Morpheus42000

> Moi je parcours les pixels de la rgion tourne d'un angle "+Theta". Pour chaque pixel, je calcule le gradient dans l'image originale (non tourne) et je retranche "Theta" a la valeur de l'angle du gradient.


Oui, il me semble que ta mthode soit la plus logique (c'est d'ailleur ce que propose Lowe). Mon problme vient surement du calcul des gradients, et j'ai malheuresement pu constater que les vecteurs calculs aux points d'intrt ne "tournent" pas lorsque j'effectue une rotation de l'image.... 




> J'utilise la fonction "gradient(image_lisse)" qui me fournit 2 matrices image_dx et image_dy. Ensuite, pour chaque pixel de coordonnes (i,j) :
> - Amplitude(i,j) = sqrt(image_dx^2 + image_dy^2)
> - Orientation(i,j) = (180/pi)*atan(image_dy/image_dx)


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 drives partielles fournies par la fonction "gradient", a marche plus  ::(:  .... Quzako ?.... Je creuse toujours ^^. C'est pour a que j'ai essay de calculer les descripteurs SIFT sur des portions "tournes" d'un angle theta...

----------


## pseudocode

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 zro).

----------


## Morpheus42000

> 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 zro).


Il y a bien une fonction "atan2" dans Matlab. Mais le rsultat est le meme  ::(:

----------


## pseudocode

> Il y a bien une fonction "atan2" dans Matlab. Mais le rsultat est le meme


Effectivement, c'est curieux.

Et pourquoi tu n'utilises pas la mthode de Lowe (retrancher "theta" a l'angle du gradient d'origine) au lieu de "tourner" l'image ?

----------


## Morpheus42000

> Effectivement, c'est curieux.
> 
> Et pourquoi tu n'utilises pas la mthode de Lowe (retrancher "theta" a l'angle du gradient d'origine) au lieu de "tourner" l'image ?


La rponse 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...
Je "grignote" les secondes par-ci par l ^^, vu que pour l'instant il me faut au moins 8 secondes pour dcrire une ptite image jpg de 12ko...

----------


## pseudocode

> La rponse 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


C'est une simple soustraction (module 360) sur l'angle du gradient, angle qui a t pr-calcul sur l'image d'origine (non tourne). Je ne vois pas en quoi cela fait perdre du temps de calcul.  ::koi::

----------


## Morpheus42000

Oui, effectivement, chui pass  ct ^^ En plus, y'a la fonction "rem" sous Matlab qui donne le reste d'une division entiere.... Mille excuses !

----------

