# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  L'invariance au changement d'chelle

## mobi_bil

Bonjour  tous,
J'ai ralis un systme de recherche d'images par points d'intrt bas sur le detecteur de HARRIS (impl de Pseudocode).
Le problme est que les points dtects ne sont pas invariants au changement d'chelle.
Aprs une recherche sur google concernant la localisation des points d'intrt invariants au changement d'chelle, j'ai trouv un article qui parle d'extraction de points multi-chelle.
Question 1 : Comment dtecter les points d'intrt sur plusieurs rsolutions d'image (figure ci-dessous) ?

Question 2 : Comment choisir les points d'intrt ainsi que l'chelle caractristique ? 
                           Merci pour votre aide.

----------


## pseudocode

> Question 1 : Comment dtecter les points d'intrt sur plusieurs rsolutions d'image (figure ci-dessous) ?


Il suffit de calculer la rponse de la fonction de Harris pour chaque chelle voulue.

- Soit en gnrant une image  l'echelle voulue et en calculant la formule de Harris

- Soit en calculant la formule de Harris multi-echelle sur l'image originale (formule 8 de ton document) 




> Question 2 : Comment choisir les points d'intrt ainsi que l'chelle caractristique ?


On cherche les points (x,y,s) qui sont  la fois:
- un maximum de la fonction de Harris au voisinage (spatial) de x,y  
- un maximum de la fonction de Laplace au voisinage (chelle) de s 

gnralement on se "dplace" alternativement dans la reprsentation de harris, puis dans celle de Laplace, etc. (figure 4 de ton document):
1. on fixe s=1.0
2. on cherche un point qui est un maximum de la fonction de Harris pour l'echelle "1" --> (x1,y1,1) 
3. on cherche maintenant la valeur "s1" qui est un maximum de la fonction de Laplace --> (x1,y1,s1)
4. on cherche un point au voisinage de (x1,y1) qui est un maximum de la fonction de Harris pour l'echelle "s1" --> (x2,y2,s1)

4a. si (x1,y1)=(x2,y2) alors on a trouv notre point invariant (x1,y1,s1)

4b. sinon on retourne a l'etape 3, en utilisant (x2,y2)  la place de (x1,y1)

On ritre cette recherche pour tous les points maximum de la fonction de Harris de l'chelle 1.

----------


## mobi_bil

Bonjour Pseudocode et merci (comme d'hab) pour votre aide,
Concernant la rponse  la premire question, quelle est la relation entre la taille de la fenetre du masque et le sigma car en modifiant seulement le sigma de la fonction gaussienne, je trouve toujours la mme image (le mme flou gaussien). Merci.

----------


## pseudocode

> Concernant la rponse  la premire question, quelle est la relation entre la taille de la fenetre du masque et le sigma car en modifiant seulement le sigma de la fonction gaussienne, je trouve toujours la mme image (le mme flou gaussien). Merci.


Dans la thorie, il n'y a pas de rapport. La fentre du masque gaussien est cense tre de taille infinie car la fonction gaussienne ne devient jamais nulle.

En pratique, quand on s'loigne suffisamment du centre de la fentre, les valeurs de la fonction gaussienne deviennent trs petites et donc on peut les considrer comme nulles. On peut donc limiter la taille de la fentre. 

Avec la fonction gaussienne, on sait que la distribution des valeurs est fonction du paramtre sigma:



En prenant un rayon 2*sigma, on dispose de 95% des valeurs.

----------


## mobi_bil

Voici un code java de la fonction gaussienne (bas sur votre algo de harris).



```

```

Par exemple, en premier lieu, j'ai ssay pour une image de "input" donn de gnrer les rsolutions suivantes :

gaus(input,im.getWidth(),im.getHeight() , 3, 1.2 ) 
cas 1 : sigma = 1.2 , j'ai trouv une image flou 
gaus(input,im.getWidth(),im.getHeight() , 3, 1.2 * 1.2)
cas 2 : sigma = (1.2 * 1.2) j'ai trouv presque la mme image du cas n1
gaus(input,im.getWidth(),im.getHeight() , 3, 1.2 * 1.2 * 1.2)
cas 3 : sigma = (1.2 * 1.2 * 1.2), mme chose, toujour la mme image du premier cas.

Je ne sais pas quoi faire, merci pour votre aide.

----------


## pseudocode

Attention, dans mon implmentation la valeur est en fait sigma (au carr).


> Je ne sais pas quoi faire, merci pour votre aide.


il faut prendre une fenetre (window) plus grande. Par exemple:

double sigma2 = 1.2*1.2*1.2;
int radius = (int)(0.5+2*Math.sqrt(sigma2)); // rayon = 2*sigma
int window = 2*radius+1;

----------


## mobi_bil

Bonjour Pseudocode,
Est ce que la fonction de Laplace(x,y,s) calcule le niveau de gris (intensit) du pixel (x,y)  l'chelle s ?
Si Oui, Pourquoi faut-il chercher si un point d'intrt (x,y) detect  s1 est un maximum dans de la fonction Laplace de cet chelle ?
Je n'arrive pas  comprendre pourquoi rendre l'image floue pour diffrentes veleurs de s.
Par exemple, pour le cas de l'invariance  la rotation, il est clair que le dtecteur de harris est invariant (par dfaut)  la rotation  cause du masque de la gaussienne qui est simtrique, donc mme quand on fait une rotation d'image (90,180,270) on aura toujours les mmes points d'intrt dans les mmes positions.
Mais pour le cas de l'invariance  l'chelle, je ne trouve pas l'astuce ou la raison de rendre l'image floue pour diffrentes valeurs de s (le cas de l'image que j'ai poste) ? 
                                 Merci pour votre aide.

----------


## pseudocode

> Mais pour le cas de l'invariance  l'chelle, je ne trouve pas l'astuce ou la raison de rendre l'image floue pour diffrentes valeurs de s (le cas de l'image que j'ai poste) ?


Trs bonne question.  ::D: 

Et oui, pourquoi on ne pas un simple zoom avant/arrire sur l'image en utilisant les techniques d'interpolations usuelles ? 

La raison est "mathmatique". On ne cherche pas uniquement a agrandir/rduire la taille de l'image. On cherche a construire un espace multi-chelle, au sens d'espace "vectoriel". Et cet espace doit se conformer a un certain nombre de rgles, qu'on appelle les axiomes (Scale-space axioms).

Et il se trouve que la convolution par un noyau gaussien est l'unique solution mathmatique qui permet de respecter toutes ces rgles.

----------


## mobi_bil

> Trs bonne question.


Dsol, mais je n'arrive pas  comprendre  ::(:  .




> On cherche a construire un espace multi-chelle, au sens d'espace "vectoriel". Et cet espace doit se conformer a un certain nombre de rgles, qu'on appelle les axiomes.


Est ce que vous pouvez m'expliquer a autrement  ::(:  ? (De toute faon aucun doc, mmoire, thse que j'ai trouv sur le net explique a ). 
merci beaucoup pour votre aide.

----------


## pseudocode

> Est ce que vous pouvez m'expliquer a autrement  ? (De toute faon aucun doc, mmoire, thse que j'ai trouv sur le net explique a ). 
> merci beaucoup pour votre aide.


Non, je ne peux pas expliquer ca mieux que le lien de wikipedia : Scale Space

Pour plus de dtails, regarde les documents publis par Tony Lindeberg (en bas de la page de wikipedia).

----------


## mobi_bil

> On cherche les points (x,y,s) qui sont  la fois:
> - un maximum de la fonction de Harris au voisinage (spatial) de x,y  
> - un maximum de la fonction de Laplace au voisinage (chelle) de s


Pour le voisinage spatial, c'est simple, on compare le point avec ses 8 proches voisins, mais pour le voisinage (chelle) de s, j'ai pas compris.
Supposons le point (3,5) est un maximum de harris dans (s=1), est ce que un maximum de laplace au voisinage (chelle) du point (3,5) est la plus grande valeur de la fonction laplace de toutes les valeur calcules pour diffrent s ? merci.

----------


## pseudocode

> Supposons le point (3,5) est un maximum de harris dans (s=1), est ce que un maximum de laplace au voisinage (chelle) du point (3,5) est la plus grande valeur de la fonction laplace de toutes les valeur calcules pour diffrent s ? merci.


Oui, le "s" optimal ets celui qui donne la plus grande valeur de la fonction de Laplace calcule au point (3,5).

----------


## mobi_bil

Bonjour pseudocode et meci pour votre rponse.
Je suis entrain d'implementer l'algorithme du post #2, pour cela, j'ai utilis votre algo Harris-Fast pour la detection des points d'intrt.
Question : Comment calculer la fonction F(Image,(x,y),chelle)

----------


## mobi_bil

Pour tre clair  :8O: , comment calculer la fonction de laplace en un pixel (x,y) d'une image I  l'chelle s:
Laplace(I,(x,y),s). Merci pour votre aide.

----------


## pseudocode

> Bonjour pseudocode et meci pour votre rponse.
> Je suis entrain d'implementer l'algorithme du post #2, pour cela, j'ai utilis votre algo Harris-Fast pour la detection des points d'intrt.
> Question : Comment calculer la fonction F(Image,(x,y),chelle)


F(x,y) est le rsultat de la convolution de Image au point (x,y) par une gaussienne de variance "chelle".

C'est la meme chose que la fonction "L(x,y;t)" dans l'article de wikipedia : http://en.wikipedia.org/wiki/Scale-space

----------


## mobi_bil

Bonjour Pseudocode et merci pour la rponse prcdente,
Dans mon implementation, je me suis bloqu sur la 4me tape :




> 4. on cherche un point au voisinage de (x1,y1) qui est un maximum de la fonction de Harris pour l'echelle "s1" --> (x2,y2,s1)


Si deux points ont la mme valeur de Harris maximale, par exemple (x1,y1) et (x2,y2), est ce qu'on peut considrer le point (x1,y1) comme invariant  l'chelle.                                  mERCI  :;): .

----------


## pseudocode

> Si deux points ont la mme valeur de Harris maximale, par exemple (x1,y1) et (x2,y2), est ce qu'on peut considrer le point (x1,y1) comme invariant  l'chelle.                                  mERCI .


Normalement non. Il faut que ce soit un "vrai" extrema local afin que le point soit robuste.

----------


## mobi_bil

Bonjour Pseudocode,
Je vous rappelle, ma question c'tait :
Si deux points ont la mme valeur de Harris maximale, par exemple (x1,y1) et (x2,y2), est ce qu'on peut considrer le point (x1,y1) comme invariant  l'chelle. mERCI 
Et vous avez rpondu : 



> Normalement non. Il faut que ce soit un "vrai" extrema local afin que le point soit robuste.


Dans ce cas, qu'est qu'on va prendre  la place de (x1,y1) ?
Si la rponse tait (x2,y2), Supposons qu'on a un troisime point au voisinage de (x1,y1) qui est aussi un maxima de harris, toujour qu'est qu'on va prendre  la place de (x1,y1) ?  mERCI pour votre aide et votre participation  ::D:

----------


## pseudocode

> Dans ce cas, qu'est qu'on va prendre  la place de (x1,y1) ?
> Si la rponse tait (x2,y2), Supposons qu'on a un troisime point au voisinage de (x1,y1) qui est aussi un maxima de harris, toujour qu'est qu'on va prendre  la place de (x1,y1) ?  mERCI pour votre aide et votre participation


Si (x1,y1) n'est pas un maximum local ,car il y a un point voisin (x2,y2) avec une valeur identique, alors (x1,y1) n'est pas un point d'intret. Donc on l'ignore. De mme (x2,y2) ne sera pas un maximum local, car (x1,y1)  une valeur identique, donc on ignore aussi (x2,y2).

Pour tre intressant, un point doit tre un vrai maximum local.

----------


## mobi_bil

Merci, donc dans l'algorithme, si on est dans ce cas, on retourne  l'tape 1 pour choisir un autre point de Harris (chelle = 1) ? Merci pour votre confirmation.

----------


## pseudocode

> Merci, donc dans l'algorithme, si on est dans ce cas, on retourne  l'tape 1 pour choisir un autre point de Harris (chelle = 1) ? Merci pour votre confirmation.


L'algorithme que j'ai brivement expliqu est assez approximatif. Il utilise une heuristique pour acclrer les calculs, mais il risque de "manquer" certains points.

Commence par la mthode brutale : tester tous les points (x,y) pour toutes les chelles "s" et conserve ceux qui sont un maximum de Harris ou un extrema de Laplace.  :;):

----------


## mobi_bil

C'est fait
1 - J'ai gnr 16 niveaux de rsolution : avec sigma = 1.2, 1.2*1.2, 1.2*1.2*1.2..........

2 - J'ai cr un tableau qui contient pour chaque pixel de l'image son chelle caractristique.

3- J'ai cr une liste de liste qui contient pour chaque rsolution une liste de maximum de harris.

Quelle est la suite.  Merci .....  :;):

----------


## pseudocode

> C'est fait
> 1 - J'ai gnr 16 niveaux de rsolution : avec sigma = 1.2, 1.2*1.2, 1.2*1.2*1.2..........


C'est  dire que tu as cr 16 images, chacune avec un niveau de flou diffrent. C'est bien ca ? 




> 2 - J'ai cr un tableau qui contient pour chaque pixel de l'image son chelle caractristique.


 ::koi:: ... c'est  dire ? L'chelle caractristique "s" est la meme pour chaque niveau de rsolution : c'est la valeur de sigma.




> 3- J'ai cr une liste de liste qui contient pour chaque rsolution une liste de maximum de harris.


Maintenant il te faut vrifier pour chacun de ces points s'il est un extrema (minima ou maxima) du Laplacien normalis. Donc pour un maximum de harris (x,y,s) tu dois verifier que :

(s)*Laplacien(x,y,s) suprieur  (s-1)*Laplacien(x,y,s-1) et  (s+1)*Laplacien(x,y,s+1) 

ou alors

(s)*Laplacien(x,y,s) infrieur  (s-1)*Laplacien(x,y,s-1) et  (s+1)*Laplacien(x,y,s+1)

----------


## mobi_bil

> C'est  dire que tu as cr 16 images, chacune avec un niveau de flou diffrent. C'est bien ca ?


Oui, c'est a.




> 2 - J'ai cr un tableau qui contient pour chaque pixel de l'image son chelle caractristique.


Je vais vous expliquer a, pour chaque pixel (x,y) de l'image originale, je cherche sa valeur maximale dans les diffrentes rsolution ( 16 images), supposons que la valeur maximale du pixel (x,y) est celle de la rsolution de sigma=1.2*1.2, je stocke dans le tableau et dans la position [x][y] la valeur de sigma=1.2*1.2. 

Question 1 : Est ce que a est inutile ?

Question 2 : C'est quoi le Laplacien normalis ?

Question 3 : C'est quoi (s)*Laplacien(x,y,s) ? Est ce que c'est un simple produit de s et Laplacien(x,y,s) ?

----------


## pseudocode

> Je vais vous expliquer a, pour chaque pixel (x,y) de l'image originale, je cherche sa valeur maximale dans les diffrentes rsolution ( 16 images), supposons que la valeur maximale du pixel (x,y) est celle de la rsolution de sigma=1.2*1.2, je stocke dans le tableau et dans la position [x][y] la valeur de sigma=1.2*1.2. 
> 
> Question 1 : Est ce que a est inutile ?


Le plus simple c'est de stocker cette information d'chelle avec les coordonnes x,y du point. Ainsi un point aura 3 coordonnes (x,y,s)




> Question 2 : C'est quoi le Laplacien normalis ?
> Question 3 : C'est quoi (s)*Laplacien(x,y,s) ? Est ce que c'est un simple produit de s et Laplacien(x,y,s) ?


Oui. Le Laplacien normalis c'est le laplacien multipli par l'chelle : 



http://en.wikipedia.org/wiki/Blob_detection

----------


## mobi_bil

Bonjour Pseudocode,
J'ai gnr seulement les points d'intrt pour les 16 niveaux de rsolution de l'image d'entre, mais pas l'image elle mme ? Est ce qu'il faut gnr les points d'intrt pour :

image originale + 16 niveaux de rsolution
Ou bien
16 niveaux de rsolutions seulement.

-------------------------------MERCI pour votre aide.

----------


## pseudocode

> J'ai gnr seulement les points d'intrt pour les 16 niveaux de rsolution de l'image d'entre, mais pas l'image elle mme ?


Disons qu'il est plus performant de calculer les 16 images de l'espace d'chelle (le 16 images floutes), et ensuite de calculer Harris et Laplace (ou d'autres choses) pour chaque pixel de ces images.




> Est ce qu'il faut gnr les points d'intrt pour :
> 
> image originale + 16 niveaux de rsolution
> Ou bien
> 16 niveaux de rsolutions seulement.


Habituellement on n'utilise pas l'image originale, mais uniquement des images qui ont t convolues avec une gaussienne.

----------


## mobi_bil

Merci pour la rponse.




> Maintenant il te faut vrifier pour chacun de ces points s'il est un extrema (minima ou maxima) du Laplacien normalis. Donc pour un maximum de harris (x,y,s) tu dois verifier que :
> 
> (s)*Laplacien(x,y,s) suprieur  (s-1)*Laplacien(x,y,s-1) et  (s+1)*Laplacien(x,y,s+1) 
> 
> ou alors
> 
> (s)*Laplacien(x,y,s) infrieur  (s-1)*Laplacien(x,y,s-1) et  (s+1)*Laplacien(x,y,s+1)


Comment traite-on la premire image gnre et la dernire image ?

Premire image : comparaison avec (s+1)*Laplacien(x,y,s+1)
Dernire image : comparaison avec (s-1)*Laplacien(x,y,s-1)

Ou bien autre technique ?

----------


## pseudocode

> Merci pour la rponse.
> 
> Comment traite-on la premire image gnre et la dernire image ?
> 
> Premire image : comparaison avec (s+1)*Laplacien(x,y,s+1)
> Dernire image : comparaison avec (s-1)*Laplacien(x,y,s-1)
> 
> Ou bien autre technique ?


On ne peut pas traiter la premire et la dernire image. Si tu veux traiter le niveau 16, il te faudra crer le niveau 17.  ::D:

----------


## mobi_bil

Merci pour la rponse, mais ........ ::D: . Est ce que cela veut dire qu'on ne garde pas les points d'intrt de la premire et la dernire image ?

----------


## pseudocode

> Merci pour la rponse, mais ......... Est ce que cela veut dire qu'on ne garde pas les points d'intrt de la premire et la dernire image ?


Ca dpend de ce que tu appelles la "premire" et la "dernire" image.   ::P: 

Si tu veux traiter l'image de l'chelle "s", tu as besoin des images aux chelles "s-1" et "s+1". A toi de voir si tu t'arrtes au traitement du niveau 15 (et tu auras besoin du niveau 16), ou si tu t'arrtes au traitement du niveau 16 (et tu auras besoin du niveau 17)

----------


## mobi_bil

> Ca dpend de ce que tu appelles la "premire" et la "dernire" image.


On a : sn=1.2 puissance n (d'aprs l'article que j'ai post au debut de cette discussion)
s0=1 est l'image originale
La premire image est la premire rsolution gnre (s1=1.2)
La dernire image est la dernire rsolution gnre  (s16=1.2 puissance 16 =18.4884)





> Si tu veux traiter l'image de l'chelle "s", tu as besoin des images aux chelles "s-1" et "s+1". A toi de voir si tu t'arrtes au traitement du niveau 15 (et tu auras besoin du niveau 16), ou si tu t'arrtes au traitement du niveau 16 (et tu auras besoin du niveau 17)


Voici quelques rsultats pour une image ''harr.jpg''




> 90 corners found. at sigma= 1.2        (1re image gnre  (s1=1.2))
> 169 corners found. at sigma= 1.44   (2me image gnre (s2=1.2*1.2=1.44))
> 220 corners found. at sigma= 1.728
> 265 corners found. at sigma= 2.0736
> 303 corners found. at sigma= 2.48832
> 333 corners found. at sigma= 2.9859839999999997
> 346 corners found. at sigma= 3.5831807999999996
> 357 corners found. at sigma= 4.299816959999999
> 360 corners found. at sigma= 5.159780351999999
> ...


Donc est ce que je garde le 90 points de la premire image, et les 360 points de la dernire image. MERci  ::D:

----------


## pseudocode

> Voici quelques rsultats pour une image ''harr.jpg''
> 
> Donc est ce que je garde le 90 points de la premire image, et les 360 points de la dernire image. MERci


 :8O:  ?Ah non, ce n'est pas ca. Il ne faut pas garder tous les points d'une image, ou tous les points d'une autre. Il faut inspecter un par un tous les points de harris de toutes les image ! 

Et pour chaque point (x,y)  l'chelle "s", il faut garder seulement ceux qui sont un maximum du Laplacien par rapport aux chelles "s-1" et "s+1"

Donc  la fin tu auras des points (x,y)  diffrentes echelles "s"

----------


## mobi_bil

Bonjour Pseudocode,



> ?Ah non, ce n'est pas ca. Il ne faut pas garder tous les points d'une image, ou tous les points d'une autre. Il faut inspecter un par un tous les points de harris de toutes les image ! 
> 
> Et pour chaque point (x,y)  l'chelle "s", il faut garder seulement ceux qui sont un maximum du Laplacien par rapport aux chelles "s-1" et "s+1"
> 
> Donc  la fin tu auras des points (x,y)  diffrentes echelles "s"


Oui, a je le sais  ::D: , merci quand mme.

Pour les points  partir de la deuxime image  la 15me, je sais qu'il faut les filtrer (garder seulement ceux qui sont des extrema de Laplacien).

Mais pour les points de la premire image et la dernire, que ce qu'on fait avec ? Merci.

----------


## pseudocode

> Mais pour les points de la premire image et la dernire, que ce qu'on fait avec ? Merci.


Rien, on ne les utilise pas. Donc on n'a pas besoin de calculer les points de harris pour ces 2 images.

----------


## mobi_bil

Bonjour,
Pour detecter les points d'intrt invariant  l'chelle voil ce que j'ai fait:

1 - Gnration de 16 rsolutions de l'images originale par la convolution de l'image originale avec la gaussienne, j'ai utilis une fentre variable (window) de rayon (2*sigma) ou chaque sigma2 (ou s) est une puissance de 1.2.

Par exemple, pour la premire rsolution, on a : s=1.2, window=5;   

2 - Detection de points d'intrt par Harris (pseudocode) pour chaque rsolution (ou image) gnre prcdemment.

j'ai laiss les mmes valeurs de sigma2 et window propos par pseudocode :
sigma2=1.2,  window=3

Un point d'intrt a 3 coordonnes (x,y,s).

Le problme est que tous les points de harris que j'ai trouvs ne sont pas des maxima de laplacien.

Tous les points que j'ai trouvs verifient :

Laplace(x,y,s-1)>Laplace(x,y,s)>Laplace(x,y,s+1)
Ou bien 
Laplace(x,y,s-1)<Laplace(x,y,s1)<Laplace(x,y,s+1)

donc pas de maximum de laplace.

Voici le code source si vous voulez m'aider ou de me proposer d'autres solutions. Merci.



```

```

----------


## pseudocode

> Bonjour,
> Pour detecter les points d'intrt invariant  l'chelle voil ce que j'ai fait:
> 
> 1 - Gnration de 16 rsolutions de l'images originale par la convolution de l'image originale avec la gaussienne, j'ai utilis une fentre variable (window) de rayon (2*sigma) ou chaque sigma2 (ou s) est une puissance de 1.2.
> 
> Par exemple, pour la premire rsolution, on a : s=1.2, window=5;


Ok




> 2 - Detection de points d'intrt par Harris (pseudocode) pour chaque rsolution (ou image) gnre prcdemment.
> 
> j'ai laiss les mmes valeurs de sigma2 et window propos par pseudocode :
> sigma2=1.2,  window=3
> 
> Un point d'intrt a 3 coordonnes (x,y,s).


Jusque l ok.




> Le problme est que tous les points de harris que j'ai trouvs ne sont pas des maxima de laplacien.
> 
> Tous les points que j'ai trouvs verifient :
> 
> Laplace(x,y,s-1)>Laplace(x,y,s)>Laplace(x,y,s+1)
> Ou bien 
> Laplace(x,y,s-1)<Laplace(x,y,s1)<Laplace(x,y,s+1)
> 
> donc pas de maximum de laplace.


Attention, c'est le laplacien "normalis" qu'on doit utiliser !

LaplaceNormalised(x,y,s) = s*Laplace(x,y,s)




> si vous voulez m'aider ou de me proposer d'autres solutions. Merci


Pour des raisons des performances, tu peux utiliser l'algorithme SIFT. Cela ressemble beaucoup a ce que tu fais, sauf que les tapes sont inverses

1. recherche des extrema du laplacien (approxim par une DoG)
2. filtrer les points par la mesure du contraste
3. filtrer les points par la mesure de Harris

-> il ne reste que les points qui sont extrema du laplacien, avec un fort contraste, et avec une forte mesure de Harris.

----------


## mobi_bil

> LaplaceNormalised(x,y,s) = s*Laplace(x,y,s)


Mme avec le Laplacien normalis, je ne trouve aucun point invariant  l'chelle.




> Pour des raisons des performances, tu peux utiliser l'algorithme SIFT. Cela ressemble beaucoup a ce que tu fais, sauf que les tapes sont inverses


Merci beaucoup, mais on m'a demand d'utiliser le detecteur Harris modifi.

Voici une trace de tous les points d'intrt detects avec pour chaque point :
les deux premires colonnes sont les coordonnes du point.
pre est la valeur du laplacien normalis dans la rsolution s-1.
cou est la valeur du laplacien normalis dans la rsolution s (ou il a t detect)
suc est la valeur du laplacien normalis dans la rsolution s+1



```

```

Je ne sais pas d'o vient le problme, poutant, c'est ce qui est dcrit dans l'article de Cordelia SCHMID

----------


## pseudocode

> Merci beaucoup, mais on m'a demand d'utiliser le detecteur Harris modifi.


Je ne vois pas en quoi inverser les tapes "recherche d'chelle" et "recherche de coin" serait interdit dans un dtecteur de Harris  ::D: 




> Voici une trace de tous les points d'intrt detects avec pour chaque point :
> les deux premires colonnes sont les coordonnes du point.
> pre est la valeur du laplacien normalis dans la rsolution s-1.
> cou est la valeur du laplacien normalis dans la rsolution s (ou il a t detect)
> suc est la valeur du laplacien normalis dans la rsolution s+1


Tes valeurs du Laplacien normalis m'ont l'ai un peu grandes. D'ailleurs je n'ai pas vu dans ton code l'endroit o tu calcules le laplacien. A priori tu compares les valeurs de images floues, mais pas les valeurs du laplacien.  ::koi::

----------


## pseudocode

Je reviens sur ce point l car j'ai lu un peu trop vite:




> 2 - Detection de points d'intrt par Harris (pseudocode) pour chaque rsolution (ou image) gnre prcdemment.
> 
> j'ai laiss les mmes valeurs de sigma2 et window propos par pseudocode :
> sigma2=1.2, window=3


Si tu fais une detection "multi-scale" la valeur de sigma2 (integration scale) utilise dans le calcul de harris  ne doit pas tre une constante mais doit dpendre de la valeur de l'echelle "s" (local scale) de ton image. 

 ::arrow::  http://en.wikipedia.org/wiki/Corner_...arris_operator

C'est pour cela que l'on utilise une pyramide d'image gaussienne, car sinon les tailles des noyaux deviennent trs grands et les temps de calcul beaucoup trop longs.

----------


## mobi_bil

Bonsoir pseudocode et Merci infiniment pour votre aide.



> Je ne vois pas en quoi inverser les tapes "recherche d'chelle" et "recherche de coin" serait interdit dans un dtecteur de Harris


Vous voulez dire calculer les points maximum du laplacien de chaque rsolution puis pour chacun de ces points vrifie s'il est un maximum de harris ? 
Si oui, a revient au mme.
Si non, merci de m'expliquer.





> Tes valeurs du Laplacien normalis m'ont l'ai un peu grandes. D'ailleurs je n'ai pas vu dans ton code l'endroit o tu calcules le laplacien. A priori tu compares les valeurs de images floues, mais pas les valeurs du laplacien.



Non, je compare les valeurs du laplacien normalis.
Voici la partie qui fait a :


```

```

Avec
resolutions : est une LinkedList qui contient les 16 rsolutions de l'image originale.
multi_scale_point : une linkedlist qui contient 15 listes telle que la premire liste contient les points d'intrt de la deuxime rsolution ( comme vous m'avez dit on a pas besoin de calculer les points d'intrt de la premire rsolution ), et la liste n15 contient les points d'intrt de l'avant dernire rsolution (pour la mme raison).

Au debut, chaque point d'intrt contient les informations suivantes :
x,y : sont les coordonnes.
s   : est le numro de la rsolution (ou l'image) dans laquelle le point d'intrt (x,y) a t detect.

Par exemple, pour un point d'intrt detect dans la troisime rsolution


> double[] p=iterat.next();


 on aura : p[0]=x, p[1]=y, et p[2]=3.

Dans le filtrage des points, Si un point d'intrt est un maximum de laplacien (dans mon code, j'ai trouv 0 point) alors l'instruction 


> p[2]=Math.pow(1.2, p[2]);


 permet de remplacer le s qui tait le numro de rsolution par l'chelle caractristique de ce point.





> Si tu fais une detection "multi-scale" la valeur de sigma2 (integration scale) utilise dans le calcul de harris ne doit pas tre une constante mais doit dpendre de la valeur de l'echelle "s" (local scale) de ton image.


Le problme vient avant la detection des points d'intrt, il est au niveau des valeurs de laplacien.
Si on inverse les tapes et on commence par la recherche des maximum de laplacien pour chaque rsolution, on vas pas trouver de maximum de laplacien, donc ce n'est pas la peine de vrifie la fonction Harris




> C'est pour cela que l'on utilise une pyramide d'image gaussienne, car sinon les tailles des noyaux deviennent trs grands et les temps de calcul beaucoup trop longs.


Est ce que j'ai besoin de a.

Encore merci infiniment pour votre aide.

----------


## pseudocode

> Vous voulez dire calculer les points maximum du laplacien de chaque rsolution puis pour chacun de ces points vrifie s'il est un maximum de harris ?


Oui.




> Non, je compare les valeurs du laplacien normalis.
> Voici la partie qui fait a :
> 
> 
> ```
> 
> ```
> 
> Avec
> resolutions : est une LinkedList qui contient les 16 rsolutions de l'image originale.


D'aprs ce que je comprends, "resolutions" contient les images floutes. Donc tu compares les valeurs des images entre 2 niveaux, et PAS les valeurs du laplacien !

Pour calculer le laplacien au point (x,y), il faut convoluer ton image en ce point par la fonction de Laplace : 

FLaplace(x,y) = (x+y-2*sigma)/(sigma^4) * Exp( - (x+y) / 2*sigma )




> Est ce que j'ai besoin de a.


Si tu veux utiliser une pyramide gaussienne, ce code est fait pour ca.  :;): 

Cela sera beaucoup plus rapide car on travaille seulement sur des chelles qui varient entre 1*sigma et 2*sigma, o sigma est le flou utilis sur la 1ere image. En gnral sigma est entre 1.0 et 1.6, donc ca nous fait une chelle maximale de 2*1.6 = 3.2. C'est  dire que les noyaux de convolution auront un rayon maximum entre 6 et 8, ce qui reste acceptable.

Voila ce que j'obtiens en utilisant une pyramide d'image + Harris + Laplace/DoG : 



NB : On perd en prcision,  cause de la rduction de taille d'image dans la pyramide. Mais il y a des techniques pour compenser ces pertes (cf. le chapitre "Accurate keypoint localization" dans le papier de Lowe).

----------


## mobi_bil

> Oui.
> D'aprs ce que je comprends, "resolutions" contient les images floutes. Donc tu compares les valeurs des images entre 2 niveaux, et PAS les valeurs du laplacien !


Ah Oui  ::D: , j'ai oubli de corriger le code que j'ai post.



```

```




> FLaplace(x,y) = (x+y-2*sigma)/(sigma^4) * Exp( - (x+y) / 2*sigma )


Ow, d'ou vient cette formule ?  :8O: .

Vous m'avez dit dans le poste #15 de cette discussion que le laplacien d'un point (x,y,s) est sa valeur (intensit) dans l'image obtenue par convolution avec une gausienne(s). 





> Si tu veux utiliser une pyramide gaussienne, ce code est fait pour ca.


Si cette pyramide gaussienne m'aide beaucoup sur ce je que veux, alors je veux bien connatre comment je l'obtient.




> Voila ce que j'obtiens en utilisant une pyramide d'image + Harris + Laplace/DoG :


Trs intressant, donc vous avez le code source de harris multi-chelle ?

----------


## pseudocode

> Ow, d'ou vient cette formule ? .
> 
> Vous m'avez dit dans le poste #15 de cette discussion que le laplacien d'un point (x,y,s) est sa valeur (intensit) dans l'image obtenue par convolution avec une gausienne(s).


Non. Dans le post #15 on parlait de l'espace d'echelles, c'est  dire les images floutes.

Le calcul du laplacien, c'est le calcul de la trace de la matrice Hessienne. C'est  dire la somme des drives du second ordre. Pour un image I(x,y) cela nous donne : Laplacien( I(x,y) ) = dI(x,y)/dx + dI(x,y)/dy

Grace aux proprits du produit de convolution, cela permet de calculer facilement le Laplacien d'une image floute par une gaussienne G(x,y) :

Laplacien( G(x,y)*I(x,y) ) = Laplacien( G(x,y) ) * I(x,y)

Ce qui implique qu'on a juste besoin de connaitre le Laplacien d'une gaussienne. C'est justement la formule que j'ai poste : dG(x,y)/dx + dG(x,y)/dy. Il suffit de driver une gaussienne 2 fois suivant x, et 2 fois suivant y, puis de les additionner.   :;): 




> Si cette pyramide gaussienne m'aide beaucoup sur ce je que veux, alors je veux bien connatre comment je l'obtient.


Ca aide beaucoup car cela diminue les temps de calculs car on utilise des images plus petites. Bon, il faut un peu "jouer" avec les facteurs de grossissement/rduction dans le code pour s'y retrouver, mais ca reste faisable.

Pour utiliser la pyramide, tu fais comme il est indiqu dans l'exemple de la page "contribuez".



```

```

et tu peux accder aux niveaux de la pyramide comme cela


```

```




> Trs intressant, donc vous avez le code source de harris multi-chelle ?


Non. Le detecteur Harris multi-chelle est vraiment trop long a mon gout. 

La j'ai utilis :
- une pyramide d'image 
- une detection d'extrema du Laplacien, ce qui me donne une liste de points (x,y,s)
- un calcul de la mesure de harris pour chaque point (x,y,s)

Cela permet de traiter une image 512x512 en environ 1 seconde (sans optimisations particulires).

----------


## mobi_bil

> FLaplace(x,y) = (x+y-2*sigma)/(sigma^4) * Exp( - (x+y) / 2*sigma )


Je pense que c'est  ::P: : ((x+y-2*sigma)/(sigma^4))*((1/(2*sigma2))*(Exp( - (x+y) / 2*sigma ))

----------


## pseudocode

> Je pense que c'est : ((x+y-2*sigma)/(sigma^4))*((1/(2*sigma2))*(Exp( - (x+y) / 2*sigma ))


Effectivement, je n'ai pas mis le facteur de normalisation 1/(2.pi.sigma).

----------


## mobi_bil

Bonjour Pseudocode,
J'ai ajout dans mon code le calcul du laplacien normalis sur chaque point detect, mais j'ai eu le mme problme : aucune point n'est conserv (c'est  dire aucun n'est un maximum de laplacien)  ::cry::  .

voici la partie du code qui filtre les points :



```

```




> s_pre, s, s_suc sont les s-1, s, et s+1





> lap_cou : le laplacien  la rsolution s
> lap_pre : le laplacien  la rsolution s-1
> lap_suc : le laplacien  la rsolution s+1


Si vous voulez une trace des valeurs du laplacien normalis, la voila :


```

```

a c'est le laplacien normalis.

Si vous voulez voire tout le code source, sans problme.
 ---------------    MERCI pour votre aide    ------------------------

----------


## pseudocode

Il y a un problme quelque part, mais je ne peux pas te dire o. Vrifie tout de mme 2 choses importantes:

- Le calcul du noyau laplacien avec la formule donne ci-avant comporte un terme gaussien (puisque c'est la drive 2nde d'une gaussienne). Il faut donc calculer la convolution sur l'image "originale" et pas sur une image floute, car sinon on applique 2 fois le terme gaussien.

- l'echelle "s" est gale au carr de la valeur de "sigma" : s = sigma

----------


## mobi_bil

Bonjour,



> Il y a un problme quelque part, mais je ne peux pas te dire o. Vrifie tout de mme 2 choses importantes:


Non pseudocode, je ne pense pas qu'il y a un problme, j'ai vrifi.
J'ai utilis l'image originale.

Voici comment j'ai calcul le laplacien L=Lxx+Lyy.



```

```

J'ai trouv a.
Si je prend une image originale I et je gnre 3 rsolutions I1, I2, I3 de cette image.
Je tombe sur un des deux cas suivants :
Soit (s-1)*Laplacien(x,y,s-1)<(s)*Laplacien(x,y,s)<(s+1)*Laplacien(x,y,s+1)
Soit (s-1)*Laplacien(x,y,s-1)>(s)*Laplacien(x,y,s)>(s+1)*Laplacien(x,y,s+1)

----------


## pseudocode

C'est currieux, ca devrait marcher.  ::koi:: 

Essaye de tester le calcul du laplacien sur tous les pixels (x,y,s), quelque soit la valeur de Harris. Peut-tre que ton seuil pour la valeur de Harris est trop fort.

----------


## mobi_bil

J'ai calcul le laplacien pour tous les pixels.

Finalement, il existe des points maximums de laplacien mais ne sont pas de des maximum de harris.
Je pense que cette technique de Cordelia Schmid n'est pas assez claire.
a fait plus d'un mois et demi que j'ssaie de l'implementer mais ...... ::arf::  . "aucun rsultat".
_______________________________________________________________

Je vais ssay d'utiliser la pyramide gaussienne puisque que vous m'avez dit qu'elle peut m'aider sur plusiuers choses, que vous en dites ?

Meci pour l'aide que vous m'avez apporte depuis ma premire discussion. ::ccool::

----------


## mobi_bil

Bonjour Pseudocode,
Je veux utiliser cette pyramide gaussienne pour trouver les points d'intrt invariant  l'chelle ( j'spre que a marche).

j'ai compris la grande partie du code, sauf deux procdures.

Si vous pouvez m'aider, j'ai prpar quelques questions :

Par exemple, pour l'exemple que vous avez post :




> GaussianPyramid gp = new GaussianPyramid(4, 3);
> gp.build(data, width, height, 1.6);


1 : les images de pyramide levels[i][0] (0<=i<=3) sont la convolution de l'image originale avec le masque gaussien de sigma2=1.6.

Question 1 : Est ce qu'on a besoin de ces pyramides levels[i][0] pour les traitements, ou bien on les utilise juste pour gnrer les diffrentes pyramides 

2 :
toujour d'aprs l'exemple, on a :




> K=1.26  , k^3=2 
> kernels[1] : masque gaussien de sigma2 =0.76
> kernels[2] : masque gaussien de sigma2 =0.96
> kernels[3] : masque gaussien de sigma2 =1.21


par exemple levels[0][2] contient les informations suivantes :

width, height : taille de l'image.
data=convolution de data de la pyramide levels[0][1] et kernels[2]  (masque gaussien de sigma2=0.96).
sigma=1.26^2 * 1.6

Question 2 : Que reprsente ce sigma ? On l'a jamais utilis dans les calculs ? mme l'image de cette pyramide utilise un masque gaussien de sigma2=0.96.


Questions 3:




> L(0) has scale K^0 = 1.0
> L(s) = L(s-1)*G(w) has scale K^s


C'est quoi L(s) ? C'est quoi G(w) ? Comment vous avez pass de :

scale(L(s)) = scale(L(s-1)*G(w)) = sqrt( scale(L(s-1))^2 + w^2 )

----------


## pseudocode

> 1 : les images de pyramide levels[i][0] (0<=i<=3) sont la convolution de l'image originale avec le masque gaussien de sigma2=1.6.


masque gaussien avec *sigma* = 1.6

J'ai utilis "sigma" et pas "sigma" pour tre conforme avec les notations utilises dans le papier de Lowe. Mais c'est vrai que ce n'est pas trs lisible et non conforme avec les notations usuelles du scale-space (cf. le livre de Tony Lindeberg "scale-space thory in computer vision")

J'ai donc repost une nouvelle version du code qui utilise sigma^2.  :;): 




> Question 1 : Est ce qu'on a besoin de ces pyramides levels[i][0] pour les traitements, ou bien on les utilise juste pour gnrer les diffrentes pyramides


Non, on n'en a pas "besoin". C'est juste une commodit, par exemple quand on veut calculer la DoG (difference of Gaussian). Dans mon implmentation, je calcule deux niveaux "supplmentaires" par octave : le niveau "0" et le niveau "max+1". Par exemple, pour une pyramide avec 3 niveaux par octave, j'en calcule 5



```

```




> 2 :
> toujour d'aprs l'exemple, on a :
> 
> 
> 
> 
> 			
> 				K=1.26 , k^3=2 
> kernels[1] : masque gaussien de sigma2 =0.76
> ...


Sigma^2 c'est l'chelle (= la coordonne dans le "scale-space").  C'est la meme valeur de "sigma^2" qui est utilise dans le calcul de la gaussienne. 

Une image a l'echelle "t", c'est une image qui a t floute avec une gaussienne "sigma^2 = t":

L(t) = L(0)*G(t)

avec, 
L(t) = image a l'chelle "t"
L(0) = image a l'chelle zro, c'est  dire l'image originale
G(t) = gaussienne de variance sigma^2 = t

Dans mon implmentation, il y a deux valeurs de sigma:

GaussianPyramid.getSigma2(int o,int s) : qui donne la valeur de "sigma^2" par rapport  l'image originale

PyramidLevel.sigma2 : qui donne la valeur de "sigma^2" par rapport  la 1ere image de l'octave. Comme on double le vrai sigma  chaque octave, on a:

GaussianPyramid.getSigma2(int o,int s) = (2^o)*PyramidLevel[s].sigma2




> Questions 3:
> 
> 
> 
> 
> 
> 			
> 				L(0) has scale K^0 = 1.0
> L(s) = L(s-1)*G(w) has scale K^s
> ...


J'ai expliqu ci-dessus.




> Comment vous avez pass de :
> 
> scale(L(s)) = scale(L(s-1)*G(w)) = sqrt( scale(L(s-1))^2 + w^2 )


Ce sont les proprits du scale-space (http://en.wikipedia.org/wiki/Scale-space_axioms), et surtout une proprit des fonctions gaussiennes. La convolution de deux gaussienne est une gaussienne dont la variance est la somme des 2 premires: G(a)*G(b) = G(a+b). C'est  dire que leurs "sigma^2" s'additionnent.

NB : Comme j'utilise maintenant sigma2, la formule que tu as cite n'est plus valable. J'ai modifi le commentaire dans le code.



```

```

Dans notre pyramide, l'chelle d'un niveau (par rapport a la base de l'octave) est K^s

Par dfinition du scale-space:

Level[s] = Level[0]*G(K^s)
Level[s-1] = Level[0]*G(K^(s-1))

Comme on souhaite que:

Level[s] = Level[s-1]*G(w)

Cela implique que :

Level[0]*G(K^s) = Level[0]*G(K^(s-1))*G(w)

et donc que

G(K^s) = G(K^(s-1))*G(w)

Par la proprit d'addition des variances :

K^s = K^(s-1) + w

=> w = K^s - K^(s-1) 

et voila.  ::D:

----------


## pseudocode

> Je vais ssay d'utiliser la pyramide gaussienne puisque que vous m'avez dit qu'elle peut m'aider sur plusiuers choses, que vous en dites ?


En tout cas, Je suis sr que ca sera plus performant que de convoluer l'image avec des groooos noyaux.  ::D:

----------


## mobi_bil

Bonjour Pseudocode et merci pour votre aide,




> Dans mon implmentation, je calcule deux niveaux "supplmentaires" par octave : le niveau "0" et le niveau "max+1". Par exemple, pour une pyramide avec 3 niveaux par octave, j'en calcule 5
> 
> 
> 
> ```
> 
> ```


Dans votre code, je vois que 3 niveaux (sans compter Levels[i][0]), donc au final il y a 4 niveaux  ::D: :
On a : Levels[i][0], Levels[i][1], Levels[i][2], Levels[i][3]



```

```




> Dans mon implmentation, il y a deux valeurs de sigma:
> 
> GaussianPyramid.getSigma2(int o,int s) : qui donne la valeur de "sigma^2" par rapport  l'image originale
> 
> PyramidLevel.sigma2 : qui donne la valeur de "sigma^2" par rapport  la 1ere image de l'octave. Comme on double le vrai sigma  chaque octave, on a:
> 
> GaussianPyramid.getSigma2(int o,int s) = (2^o)*PyramidLevel[s].sigma2


Qustion 1 : Est ce que la premire image de l'octave i est celle de la pyramide : Levels[i][0] ?

Question 2 : Pourquoi vous dites : on double le vrai sigma  chaque octave ? dans le code vous divisez le sigma2 du dernier niveau d'une octave par 2.
J'ai pas bien compris.

De toute faon, j'ai prpar un schma qui montre la trace de votre code.



d'aprs le schma, les chelles de Levels[i][0] sont les mmes ? c'est pour a, je n'arrive pas  comprendre pourquoi 


> GaussianPyramid.getSigma2(int o,int s) = (2^o)*PyramidLevel[s].sigma2

----------


## pseudocode

> Dans votre code, je vois que 3 niveaux (sans compter Levels[i][0]), donc au final il y a 4 niveaux :
> On a : Levels[i][0], Levels[i][1], Levels[i][2], Levels[i][3]


Heu... oui. C'est moi qui me suis tromp dans mes explications.  ::aie:: 

Je calcule 1 niveau en plus, le dernier, qui quivalent au niveau "0" de l'octave suivant.




> Qustion 1 : Est ce que la premire image de l'octave i est celle de la pyramide : Levels[i][0] ?


Oui.

Lors de l'appel de la mthode build(), on passe en paramtre sigma qui est utilis pour flouter la premire image. 



```

```




> Question 2 : Pourquoi vous dites : on double le vrai sigma  chaque octave ? dans le code vous divisez le sigma2 du dernier niveau d'une octave par 2.
> J'ai pas bien compris.
> 
> d'aprs le schma, les chelles de Levels[i][0] sont les mmes ? c'est pour a, je n'arrive pas  comprendre pourquoi


NB : Du fait que j'ai chang mon implmentation pour utiliser "sigma^2" au lieu de "sigma", il faut diviser par 4 et non plus pas 2. J'ai corrig l'erreur.  ::P: 

Les "sigma" des niveaux sont effectivement les mmes. Normalement, en continuant a faire des convolutions, les "sigma" devraient continuer leur progression gomtrique : K, K^2, K^3, K^4, K^5, ...

Mais entre les 2 octaves, on a fait un downsampling = la taille de l'image a t divise par 2. Et donc l'echelle est divise par 2^2 = 4.

Mathmatiquement, cela revient a faire un changement de variable.

L(x,y, octave_2) = L(2x,2y, octave_1)

En reprenant la formule du scale-space L(x,y,t) = L(x,y)*G(t), et en appliquant le changement de variable, on trouve :

L(2x,2y,t) = L(2x,2y)*G(t) = L(x,y)*G(t/4)

La dernire galit vient du changement de variable dans une fonction gaussienne.  :;):

----------


## mobi_bil

> Si tu veux utiliser une pyramide gaussienne, ce code est fait pour ca. 
> 
> Voila ce que j'obtiens en utilisant une pyramide d'image + Harris + Laplace/DoG :


Mainetenant que j'ai compris (en gros) la pyramide gaussienne, comment faire pour detecter les points d'intrt par harris ?
Avez vous un code qui fait ce travail ?

----------


## pseudocode

> Mainetenant que j'ai compris (en gros) la pyramide gaussienne, comment faire pour detecter les points d'intrt par harris ?
> Avez vous un code qui fait ce travail ?


Et bien l'intrt de la pyramide c'est de ne pas modifier la taille du noyau (laplace/harris) mais je modifier l'chelle de l'image. C'est  dire utiliser toujours les memes noyaux mais sur differents niveaux de la pyramide.

Donc on prend un noyau G(w) (pour Harris) et un noyau dG(w)/dt (pour laplace) et on l'applique sur un niveau de la pyramide. Par exemple, des noyaux de taille 3x3 ou 5x5 peuvent tre suffisant.

----------


## mobi_bil

> // As G(ax,ay,w) = (1/a^2).G(x,y,w/a^2)

----------


## pseudocode

> // As G(ax,ay,w) = (1/a^2).G(x,y,w/a^2)


*EDIT* : Oui, effectivement. Je me suis tromp en crivant le commentaire  ::oops:: . je voulais crire G(x,y,w) = a.G(ax,ay,a.w). Bon, je vais retirer ce commentaire du code ca n'aide pas trop a la comprhension.

Pour plus d'info, consultez le livre de Tony Lindeberg : scale-space thory in computer vision (chapitre 2).

----------


## mobi_bil

> G(ax,ay,w)= 1/(2.PI.w).exp(-(x+y)/(2.w/a))
> 
> G(x,y,w/a)= a/(2.PI.w).exp(-(x+y)/(2.w/a))  .....(2)


Donc, on peut crire (2) comme suit :

G(x,y,w/a)= a*1/(2.PI.w).exp(-(x+y)/(2.w/a)) 

=>G(ax,ay,w) = 1/a.G(x,y,w/a) ............ ::P: 

Il y a a qui me bloque :



> L(x,y, octave_2) = L(2x,2y, octave_1)


dans le code :


```

```

Position impaire.

----------


## pseudocode

> Donc, on peut crire (2) comme suit :
> 
> G(x,y,w/a)= a*1/(2.PI.w).exp(-(x+y)/(2.w/a)) 
> 
> =>G(ax,ay,w) = 1/a.G(x,y,w/a) ............


Oui. tu as raison.




> Il y a a qui me bloque :
> 
> 
> 
> 
> 			
> 				L(x,y, octave_2) = L(2x,2y, octave_1)


Il faut dvelopper le produit de convolution sous forme d'intgrale et procder au changement de variable. Ensuite il faut dvelopper le downsampling et on arrive a cette formule. Le coefficient 1/4 qui apparait dans le produit de convolution est compens par le coefficient 4 qui apparait dans le downsampling.




> dans le code :
> 
> 
> ```
> 
> ```
> 
> Position impaire.


C'est une rutilisation des calculs de convolution. Plutot que de faire un downsampling gaussien (sigma=4) depuis le niveau "0" de l'octave, on prend directement un pixel sur deux au dernier niveau (sigma=4) de l'octave. J'ai choisi les positions impaires, mais on peut aussi prendre les positions paires.

----------


## mobi_bil

Bonjour Pseudocode,



> ----------------------------------------
> L(x,y, octave_2) = L(2x,2y, octave_1)   
> ----------------------------------------
> Il faut dvelopper le produit de convolution sous forme d'intgrale et procder au changement de variable. Ensuite il faut dvelopper le downsampling et on arrive a cette formule. Le coefficient 1/4 qui apparait dans le produit de convolution est compens par le coefficient 4 qui apparait dans le downsampling.


J'ai ssay de developper le produit de convolution mais j'ai pas trouv le mme rsultat que le votre  ::(: 

D'aprs la procedure downsampled :



```

```

On a rien fait, on a pris juste les pixels paire de l'image de l'octave prcedent.
Donc, L(x,y,s)=L(2x,2y,t)=1/4.L(x,y,t/4), je ne connais pas la suite. Vraiment, a fait deux jour en ssayant de savoir pourquoi vous avez divis le sigma2 de l'octave prcedent par 4. Merci pour votre aide.

----------


## pseudocode

> On a rien fait, on a pris juste les pixels paire de l'image de l'octave prcedent.
> Donc, L(x,y,s)=L(2x,2y,t)=1/4.L(x,y,t/4), je ne connais pas la suite. Vraiment, a fait deux jour en ssayant de savoir pourquoi vous avez divis le sigma2 de l'octave prcedent par 4. Merci pour votre aide.


On pose L resampl par un facteur "a" :

La(x,y) = L(ax,ay)


Par definition du produit de convolution:

L(ax,ay,at) = Integrale{ L(ax-i,ay-j).G(i,j,at).di.dj }


On pose k=i/a, l=j/a => i=ak, j=al, di=a.dk, dj=a.dl

L(ax,ay,at) 
= Integrale{ L(ax-ak,ay-al).G(ai,aj,at).a.dk.a.dl }
= Integrale{ L(a(x-k),a(y-l)).1/a.G(i,j,t).a.dk.a.dl }
= Integrale{ L(a(x-k),a(y-l)).G(i,j,t).dk.dl }
= La*G(t) 
= La(x,y,t)

=> L(2x,2y,4t) = L2(x,y,t)

on pose s = 4t.

<=> L(2x,2y,s) = L2(x,y,s/4)

Donc, prendre un point sur 2 dans L  l'echelle "s" est equivalent a prendre tous les points de L2 (resampl)  l'echelle "s/4"

----------


## mobi_bil

Merci, j'ai compris le developpement il me reste quelques dtails :



> On pose L resampl par un facteur "a" :
> La(x,y) = L(ax,ay)


Si j'ai bien compris, le facteur "a" est le facteur de rduction :
Par exemple 
a=2 : rduire la taille de l'image est divise par deux
a=3 : la taille de l'image est divise par 3


La(x,y) = L(ax,ay) veut dire que le pixel (x,y) de "La" est un des "a" pixel de L.

----------


## pseudocode

> Merci, j'ai compris le developpement il me reste quelques dtails :
> 
> Si j'ai bien compris, le facteur "a" est le facteur de rduction :
> Par exemple 
> a=2 : rduire la taille de l'image est divise par deux
> a=3 : la taille de l'image est divise par 3
> 
> La(x,y) = L(ax,ay) veut dire que le pixel (x,y) de "La" est un des "a" pixel de L.


Oui, c'est cela. Du moins pour le cas discret.

Toutes ces formules sont normalement applicables dans le cas des signaux continue. Donc a thoriquement accs a une infinit de points dans l'image. 

La formulation L(ax,ay) est donc un "rescaling" = changement d'echelle => on ne "perd" donc pas de points. C'est pour cela que les quations nous permettent d'crire L(ax,ay,s) = La(x,y,s/a), notamment grace au produit de convolution sous forme d'intgrale infinie. Quand on passe au cas discret, le "rescaling" devient du "resampling" car on n'a pas d'informations sur la valeur entre 2 pixels. Du coup, les quation ne sont plus une "galit" mathmatique, mais plus une approximation.

Enfin, l'important c'est que ca fonctionne et qu'il y a une solide thorie derrire l'utilisation de la pyramide gaussienne pour modliser le scale-space.  ::ccool::

----------

