# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Recherche de corrlation entre 2 images via leur profil

## Orus

J'ai une base d'image, et je cherche  identifier leur contenu en les comparant.
On suppose donc que certaines constitueront une base annot manuellement

pour simplifier la chose, on m'a demand d'extraire le profil grace  l'horizon
(j'ai ralis un truc assez basique qui ne peut marcher que sur une partie des images mais ca suffit pour s'interesser  la suite)
j'ai donc des images binaires contenant le profil des images traites

le probleme est que sur une image on peut avoir divers objets, ou des objets  l'chelle diffrente

donc je me demandais si rien qu'avec ce profil, on pouvait arriver  dterminer si les images taient corrles ?
l'avantage est qu'on a qu'un ensemble de points restreints

je pense qu'en prenant un groupe de points, et en les testant tout le long de l'autre image ca pourrait donner quelquechose

Sinon les images de bases sont des images en niveau de gris
2 exemples d'images assez proches et de leur profil : 
http://univ.anhor.com/Stage/DATA/Dat.../3_001_1_R.jpg -> http://bp0.blogger.com/_lvcwrI5TIgU/..._R_horizon.jpg
http://univ.anhor.com/Stage/DATA/Dat.../3_001_4_R.jpg -> http://bp0.blogger.com/_lvcwrI5TIgU/..._R_horizon.jpg

merci d'avance !

----------


## ToTo13

Bonjour,

ce que tu cherches s'appelle le "matching".
Il y a des tas de chose l dessus :
 - Tu choisis des caractrisques ou des mthodes de caractrisations sur ton image.
 - Ensuite tu utilises des mthode de matching, comme par exemple les distances entre critres.

Bonne continuation.

----------


## pseudocode

> pour simplifier la chose, on m'a demand d'extraire le profil grace  l'horizon (j'ai ralis un truc assez basique qui ne peut marcher que sur une partie des images mais ca suffit pour s'interesser  la suite)


Je suppose qu'on t'a demand ca afin d'avoir a traiter un signal a 1 dimension:



```
y = f(x) , avec x variant entre 0 et la largeur de ton image.
```

De plus, ton signal (l'horizon) est cens etre continu. Donc tu peux supprimer les points aberrants et les remplacer par une approximation lineaire.




> je pense qu'en prenant un groupe de points, et en les testant tout le long de l'autre image ca pourrait donner quelquechose


Oui, ca s'appelle la cross-correlation. Ca permet de calculer la "ressemblance" entre 2 signaux. Dans ton cas, le plus simple c'est de se crer une librairie de "motifs" (pattern) spcifiques a tes horizons.



```

```

mf et mp sont les moyennes des 2 signaux. Les sommes varient entre 0 et la largeur de l'image. Pour le pattern (qui est moins large que l'image) on considere qu'il se repete a l'infini. 

Tu peux ainsi calculer la courbe r(d), avec d variant entre 0 et la largeur du pattern. Tu prend le maximum de cette courbe, et ca te donne ton facteur de correlation.

Tu calcules ce facteur de correlation pour tous les motifs de ta librairie, et tu gardes les motifs qui ont le plus gros score. Enfin tu classifies ton image a l'aide des "annotations" associes a ces motifs.




> le probleme est que sur une image on peut avoir divers objets, ou des objets  l'chelle diffrente
> 
> donc je me demandais si rien qu'avec ce profil, on pouvait arriver  dterminer si les images taient corrles ?


Non, pas avec la formule que j'ai donne.  ::(:  

En effet, elle prend seulement en compte les translations. Mais tu peux modifier la formule pour rajouter un coefficient d'echelle. Tu obtiendra ansi une famille de courbes r(d).

----------


## Orus

> Je suppose qu'on t'a demand ca afin d'avoir a traiter un signal a 1 dimension:
> 
> 
> ```
> y = f(x) , avec x variant entre 0 et la largeur de ton image.
> ```


Oui je pense que c'etait pour pouvoir commencer par faire un traitement pas trop compliqu
On va surement complter apres avec d'autres primitives pour amliorer les rsultats





> De plus, ton signal (l'horizon) est cens etre continu. Donc tu peux supprimer les points aberrants et les remplacer par une approximation lineaire.


Oui actuellement j'ai un ligne d'horizon plutot discontinue, il faut que je la transforme en courbe continue pour que les traitements soient correctes apres  ::): 





> Oui, ca s'appelle l'auto-correlation. Ca permet de calculer la "ressemblance" entre 2 signaux. Dans ton cas, le plus simple c'est de se crer une librairie de "motifs" (pattern) spcifiques a tes horizons.
> 
> 
> 
> ```
> 
> ```
> 
> mf et mp sont les moyennes des 2 signaux. Les sommes varient entre 0 et la largeur de l'image. Pour le pattern (qui est moins large que l'image) on considere qu'il se repete a l'infini. 
> ...


ok merci pour la mthode !
pour les pattern, il vaut mieux que je les trace  la main ?
il faut en tout cas que j'en dfinisse suffisamment pour couvrir tous les angles de vue





> Non, pas avec la formule que j'ai donne.  
> 
> En effet, elle prend seulement en compte les translations. Mais tu peux modifier la formule pour rajouter un coefficient d'echelle. Tu obtiendra ansi une famille de courbes r(d).


ok c'est important car les photos sont pas souvent prises aux memes endroits ce qui donne un chateau  diffrentes chelles  ::):

----------


## pseudocode

> pour les pattern, il vaut mieux que je les trace  la main ?


Moi je le ferai pas a la main. Je prendrai Paint et je decouperai des petits blocs caracteristiques dans tes images d'horizon (genre les crneaux). 

Pour optimiser, je prcalculerai le signal correspondant a ce motif (genre un fichier creneaux.csv avec les valeurs)




> il faut en tout cas que j'en dfinisse suffisamment pour couvrir tous les angles de vue. ok c'est important car les photos sont pas souvent prises aux memes endroits ce qui donne un chateau  diffrentes chelles


En premiere approche, tester tes patterns a differentes echelles devrait marcher. 

En seconde approche, tu peux utiliser des algorithmes d'extraction de "points d'interet" (detecteur de Harris, ...). Ces algo sont robustes face aux dcalages ou changement d'echelle du signal, ce qui veut dire qu'ils te sortent les memes points meme si le signal est a 2 echelles differentes. Apres il faut comparer les "points d'interet" de l'horizon et du motif avec une distance invariante aux homotheties.  

Enfin bon, c'est p-e un peu trop compliqu pour ton probleme actuel  ::mrgreen::

----------


## Orus

> Moi je le ferai pas a la main. Je prendrai Paint et je decouperai des petits blocs caracteristiques dans tes images d'horizon (genre les crneaux). 
> 
> Pour optimiser, je prcalculerai le signal correspondant a ce motif (genre un fichier creneaux.csv avec les valeurs)


dcouper un objet en plusieurs blocs caractristiques ?




> En premiere approche, tester tes patterns a differentes echelles devrait marcher. 
> 
> En seconde approche, tu peux utiliser des algorithmes d'extraction de "points d'interet" (detecteur de Harris, ...). Ces algo sont robustes face aux dcalages ou changement d'echelle du signal, ce qui veut dire qu'ils te sortent les memes points meme si le signal est a 2 echelles differentes. Apres il faut comparer les "points d'interet" de l'horizon et du motif avec une distance invariante aux homotheties.  
> 
> Enfin bon, c'est p-e un peu trop compliqu pour ton probleme actuel


durant les tudes bibliographiques que j'ai faite, j'ai pu lire des infos sur les points d'interets et le dtecteur de Harris, c'est vrai que c'est interessant
mais ces points qu'il dtecte sont un peu bizarre parfois, donc faut voir ce que ca donne  ::): 

on verra ca peut etre apres  ::D:

----------


## pseudocode

> dcouper un objet en plusieurs blocs caractristiques ?


Oui. Dans une des 2 images d'horizon que tu as donns, tu peux dcouper un bloc de 64x64 pixels contenant seulement les crneaux ( /\/\/\/\ ). Ce motif est vraiment spcifiques aux chateaux.

Tiens ca me fait penser que ca serait mieux d'inverser la formule que j'ai donn. Plutot que de faire "translater" l'image sur un motif qui se repete a l'infini, ca serait mieux de "translater" le motif sur la largeur de l'image.

Bref, utiliser f(x-d) et p(x) avec des sommes allant de 0 a la largeur du motif, et faire varier d entre 0 et la largeur de l'image  (et avec mf la moyenne du signal f() sur l'intervale considr)

----------


## Orus

> Oui. Dans une des 2 images d'horizon que tu as donns, tu peux dcouper un bloc de 64x64 pixels contenant seulement les crneaux ( /\/\/\/\ ). Ce motif est vraiment spcifiques aux chateaux.
> 
> Tiens ca me fait penser que ca serait mieux d'inverser la formule que j'ai donn. Plutot que de faire "translater" l'image sur un motif qui se repete a l'infini, ca serait mieux de "translater" le motif sur la largeur de l'image.
> 
> Bref, utiliser f(x-d) et p(x) avec des sommes allant de 0 a la largeur du motif, et faire varier d entre 0 et la largeur de l'image  (et avec mf la moyenne du signal f() sur l'intervale considr)


ok mais si pourquoi comparer qu'un petit bout ? et pas l'objet en entier ?  ::): 

sinon on m'a conseill, de passer l'horizon discontinue en un signal 1D continu, et de raliser des corrlations entre les signaux

----------


## pseudocode

> ok mais si pourquoi comparer qu'un petit bout ? et pas l'objet en entier ?


Ah la, c'est a toi de voir si tu dois identifier une images lorsque son horizon "complet" sont indentique a un autre horizon, ou lorsque son horizon "contient" un motif caracteristique.




> sinon on m'a conseill, de passer l'horizon discontinue en un signal 1D continu, et de raliser des corrlations entre les signaux


Ca me parrait completement indispensable. D'ailleur je t'ai deja fait cette remarque.

----------


## Orus

> Ah la, c'est a toi de voir si tu dois identifier une images lorsque son horizon "complet" sont indentique a un autre horizon, ou lorsque son horizon "contient" un motif caracteristique.


c'est vrai que dans certaines images on aura qu'une partie du motif, mais si on dcoupe en plusieurs morceaux, faut bien vrifier que les morceaux se suivent dans le bon ordre  ::): 





> Ca me parrait completement indispensable. D'ailleur je t'ai deja fait cette remarque.


en effet, dans le 1er post, j'avais oubli  ::): 
d'apres ce qu'on m'a dit il y a deja des fonctions dans matlab pour tester les corrlations
il faudrait donc que je ralise des formes rfrences, et que pour les images  traiter je rcupre l'horizon et que je le transforme en signal 1D

----------


## Orus

> De plus, ton signal (l'horizon) est cens etre continu. Donc tu peux supprimer les points aberrants et les remplacer par une approximation lineaire.


Le problme va etre d'arriver  dfinir quels sont les points qui sont mauvais qu'il faut donc corriger

J'ai maintenant une courbe du profil, et on voit apparaitre des pics du  ces fameux points aberrants
http://bp3.blogger.com/_lvcwrI5TIgU/...h/signal1D.jpg

j'ai arbitraitement choisi de tester de corriger les points plus haut ou plus bas des 2 voisins de chaque cot
http://bp2.blogger.com/_lvcwrI5TIgU/..._signal1D2.jpg
ca en supprime quelques uns mais la majorit est encore la, car il doit y avoir des groupements de points qui sont faux (genre 4/5 points je pense).

enfin l'autre question que je me pose est  quel moment s'en occuper ? sur l'image contenant tous les contours, celle avec le profil ou sur la courbe ?

----------


## pseudocode

> enfin l'autre question que je me pose est  quel moment s'en occuper ? sur l'image contenant tous les contours, celle avec le profil ou sur la courbe ?


Sur l'image ca serait l'ideal, mais l'algo parfait n'existe pas, donc passons.

Sur le profil c'est deja tres bien. Il faut reperer les groupes de points isols et les supprimer. Apres on construit un signal continu en "inventant" les points manquants.

En dernier ressort sur la courbe, avec un filtre passe-bas. Mais c'est moins bon.

----------


## Orus

> Sur l'image ca serait l'ideal, mais l'algo parfait n'existe pas, donc passons.
> 
> Sur le profil c'est deja tres bien. Il faut reperer les groupes de points isols et les supprimer. Apres on construit un signal continu en "inventant" les points manquants.
> 
> En dernier ressort sur la courbe, avec un filtre passe-bas. Mais c'est moins bon.


oui pour l'instant c'est plutot sur l'image que j'essaye de rgler ca  ::): 
une opration morphologique de suppression de points isols  chelle rduite limine pas mal de pixels inutiles du ciel

----------


## Orus

apres avoir du avancer d'autres aspects j'ai retravaill la dessus  ::): 

par contre r donne des valeurs entre -1 et 1, dois je prendre la valeur absolue de la valeur ?

----------


## Flo.

Salut,

une autre technique pour comparer 2 signaux consiste  calculer les sries de Fourier des 2 signaux puis de comparer leurs coefficients : technique des descripteurs de Fourier.

C'est une technique assez interessante (largement rpandue dans le edges-matching) dans la mesure ou on contrle le degr de matching que l'on veut. 

Plus la srie partielle est "longue" plus le signal modlis sera proche du signal rel. Plus la srie est "courte" plus le signal modlis sera approximatif. Cela a l'avantage de rsoudre le problme du bruit qui sera directement "liss". Si on a une comparaison facile, on utilise une srie "courte". Et  l'inverse, si on veut dtromper 2 signaux proches, on utilise une srie plutt "longue". Bien entendu, plus la srie est "courte" plus le calcul est rapide  ::):  .

Une fois la srie calcule, la comparaison se fait uniquement sur les coeffs de Fourier ... la comparaison est donc rapide et triviale.

Flo.

----------


## Orus

> Salut,
> 
> une autre technique pour comparer 2 signaux consiste  calculer les sries de Fourier des 2 signaux puis de comparer leurs coefficients : technique des descripteurs de Fourier.
> 
> C'est une technique assez interessante (largement rpandue dans le edges-matching) dans la mesure ou on contrle le degr de matching que l'on veut. 
> 
> Plus la srie partielle est "longue" plus le signal modlis sera proche du signal rel. Plus la srie est "courte" plus le signal modlis sera approximatif. Cela a l'avantage de rsoudre le problme du bruit qui sera directement "liss". Si on a une comparaison facile, on utilise une srie "courte". Et  l'inverse, si on veut dtromper 2 signaux proches, on utilise une srie plutt "longue". Bien entendu, plus la srie est "courte" plus le calcul est rapide  .
> 
> Une fois la srie calcule, la comparaison se fait uniquement sur les coeffs de Fourier ... la comparaison est donc rapide et triviale.
> ...


ok merci pour l'information, je vais me renseigner la dessus voir ce que ca peut donner  ::):

----------


## pseudocode

> apres avoir du avancer d'autres aspects j'ai retravaill la dessus 
> 
> par contre r donne des valeurs entre -1 et 1, dois je prendre la valeur absolue de la valeur ?


heu non... +1 est une correspondance parfaite (signaux superposables) et -1 est une "anti" correspondance (signaux inverss).

C'est entre -1 et 1 parceque j'ai donn la formule de la cross-correlation normalise (avec les racines au denominateur).

----------


## pseudocode

> une autre technique pour comparer 2 signaux consiste  calculer les sries de Fourier des 2 signaux puis de comparer leurs coefficients : technique des descripteurs de Fourier.
> 
> C'est une technique assez interessante (largement rpandue dans le edges-matching) dans la mesure ou on contrle le degr de matching que l'on veut.


Pour commencer dans le pattern matching, la bonne vieille correlation permet de se faire les dents. Surtout en rajoutant des parametres (offset, echelle, ...) pour obtenir des familles de courbes.

Apres c'est vrai que l'analyse spectrale permet de faire beaucoup de jolies choses. Deja c'est plus rapide... et c'est plus puissant. Le tout est d'arriver a manipuler les deux concepts "Domaine spatial" et "Domaine temporel".

----------


## Orus

> heu non... +1 est une correspondance parfaite (signaux superposables) et -1 est une "anti" correspondance (signaux inverss).
> 
> C'est entre -1 et 1 parceque j'ai donn la formule de la cross-correlation normalise (avec les racines au denominateur).


ok  ::): 
et si la courbe atteint  la fois 1 et -1 ?

----------


## mchk0123

--- En ce qui  trait aux points abrrants ---

Pour la transforme de Fourier je ne penses pas que cela soit trs facile d'utilisation dans ton cas. En effet, les quelques pics du aux points abrrants vont engendrer des echos dans le spectre (aprs transformation) qui vont tre assez difficiles  dtecter et supprimer simplement.

Sans transformer ta courbe y = f(x), tu peux essayer simplement de faire un filtrage  base de mdianne en prenant une fentre qui soit lgrement suprieure au double de la largeur des pics (c'est  dire quelques dizaines de pixels). Si tu ne sait pas comment on fait, je pourrait t'aider.

Ce filtrage est  raliser avant de passer du discret au continu.

Pour la suite on verra aprs.

----------


## Orus

> --- En ce qui  trait aux points abrrants ---
> 
> Pour la transforme de Fourier je ne penses pas que cela soit trs facile d'utilisation dans ton cas. En effet, les quelques pics du aux points abrrants vont engendrer des echos dans le spectre (aprs transformation) qui vont tre assez difficiles  dtecter et supprimer simplement.
> 
> Sans transformer ta courbe y = f(x), tu peux essayer simplement de faire un filtrage  base de mdianne en prenant une fentre qui soit lgrement suprieure au double de la largeur des pics (c'est  dire quelques dizaines de pixels). Si tu ne sait pas comment on fait, je pourrait t'aider.
> 
> Ce filtrage est  raliser avant de passer du discret au continu.
> 
> Pour la suite on verra aprs.


je voulais d'abord vrifier que la comparaison de profils tait une voie viable
mais en effet ces points abrants on tendance  modifier fortement le rsultat

j'ai utilis l'opration morphologique pour supprimer les pixels isols, mais y a aussi des groupements de pixels

sinon je veux bien un exemple de filtre que tu cites  ::):

----------


## pseudocode

> ok 
> et si la courbe atteint  la fois 1 et -1 ?


Bah c'est pas grave...

La courbe r(d) te donne le facteur de correspondance (-1...+1) entre ton profil et ton "motif", en fonction du parametre "d" qui est l'offset du motif.

Ce qui t'interesse c'est le maximum de cettre courbe, donc "+1" dans ton cas.

Ce maximum est atteint pour une valeur particuliere de "d". Cette valeur de "d" te permet de savoir a quel endroit se trouve le "motif" dans ton profil. Si tu n'a pas besoin de cette info, oublie la.

----------


## Orus

> Bah c'est pas grave...
> 
> La courbe r(d) te donne le facteur de correspondance (-1...+1) entre ton profil et ton "motif", en fonction du parametre "d" qui est l'offset du motif.
> 
> Ce qui t'interesse c'est le maximum de cettre courbe, donc "+1" dans ton cas.
> 
> Ce maximum est atteint pour une valeur particuliere de "d". Cette valeur de "d" te permet de savoir a quel endroit se trouve le "motif" dans ton profil. Si tu n'a pas besoin de cette info, oublie la.


oui j'avais remarqu  ::): 
c'est d'ailleurs la que le manque de prcision se voit, des parties tant reconnues comme tres proches alors qu'elle ne le sont pas

et pour cela faut que je pense sur le multi-chelle : faire la dtection  basse echelle, ce qui fait qu'il y aura moins de bruit et remonter

par contre je pense qu'il faudrait pondrer selon la quantit de l'image de rfrence reconnue dans l'image cible, en effet si on reconnait que le dbut du pattern  la fin de l'image, on ne peut pas etre sur que ca correspond rellement donc le score devrait etre moins lev  ::):

----------


## mchk0123

> j'ai utilis l'opration morphologique pour supprimer les pixels isols, mais y a aussi des groupements de pixels


j'ai pas tout suivi depuis le dpart sur les filtres morphologiques. Tu peux poster ton image binaire aprs application de ces filtres ? Ca permettra de voir comment son tes regroupements.




> sinon je veux bien un exemple de filtre que tu cites


C'est assez simple : ta fonction y = f(x), en fait tu la manipule surement dans ton code sous forme de suite : yi pour i dans [0,xn]. Si ce n'est pas le cas, c'est assez facile  rcuprer.

Donc si tu veux filtrer les pics qui sont de largeur l, tu prend une "fentre" de taille a = 2 * l + epsilon. C'est  dire que pour chaque yi tu rcupre dans un tableau z, les a points suivants. Cela te donne :

zj = [yi, yi+1, ..., yi+a] pour j dans [0,xn-a].

Maintenant tu prend la valeur mdianne de ton ensemble zj, que l'on va noter mj. A la fin tu aura un tableau m = [m0, m1, ...]

Et m sera ta nouvelle image binaire filtre.

Mais sans ton image je peut pas te dire si cela fera mieux qu'un filtrage morphologique.

----------


## Orus

> j'ai pas tout suivi depuis le dpart sur les filtres morphologiques. Tu peux poster ton image binaire aprs application de ces filtres ? Ca permettra de voir comment son tes regroupements.
> 
> 
> 
> C'est assez simple : ta fonction y = f(x), en fait tu la manipule surement dans ton code sous forme de suite : yi pour i dans [0,xn]. Si ce n'est pas le cas, c'est assez facile  rcuprer.
> 
> Donc si tu veux filtrer les pics qui sont de largeur l, tu prend une "fentre" de taille a = 2 * l + epsilon. C'est  dire que pour chaque yi tu rcupre dans un tableau z, les a points suivants. Cela te donne :
> 
> zj = [yi, yi+1, ..., yi+a] pour j dans [0,xn-a].
> ...



Ok voici un exemple avec une piece jointe (j'ai pas mis toutes les tapes)

----------


## mchk0123

Le filtre mdian c'est pour filtrer les colonnes dans ton image :

"3_001_1_R_signal1D2.jpg"

----------


## Orus

> Le filtre mdian c'est pour filtrer les colonnes dans ton image :
> 
> "3_001_1_R_signal1D2.jpg"


ok
sur ces images de chateau j'utilisais pas la meme mthode pour avoir ce profil, donc pas de filtres morphologiques

voici avec cette image, en piece jointe.


Sinon j'ai continu  faire des tests avec la corrlation, et sans tenir compte de l'chelle, ca donne pas grand chose, tant donn que les objets  reconnaitre sont jamais  la meme echelle

----------


## mchk0123

Laisse tomber le filtre mdian, avec tes filtres morphologiques tu obtient dj un profil de trs bonne qualite. Tu ne pourra pas faire mieux avec un filtre mdian.

----------


## pseudocode

> Sinon j'ai continu  faire des tests avec la corrlation, et sans tenir compte de l'chelle, ca donne pas grand chose, tant donn que les objets  reconnaitre sont jamais  la meme echelle


Oui, c'est sur, il va falloir tenir compte de l'echelle...  Il y a 2 moyens:

- ajouter un parametre d'echelle dans la formule de cross-correlation => on obtient une fonction a 2 parametres r(o,s), avec o l'offset du motif et s son echelle. Le rsultat est donc un tableau 2D de valeur dont on doit chercher le maximum (c'est le principe de l'espace de Hough)

- crer des motifs a differentes echelles et faire une simple cross-correlation. C'est uen technique plus simple et qui marche bien si on sait d'avance a quoi ressemble les images a traiter.

Pour l'image que tu donnes, je verrai bien le motif suivant (a differentes echelles):


```

```

----------


## mchk0123

> - ajouter un parametre d'echelle dans la formule de cross-correlation => on obtient une fonction a 2 parametres r(o,s), avec o l'offset du motif et s son echelle. Le rsultat est donc un tableau 2D de valeur dont on doit chercher le maximum (c'est le principe de l'espace de Hough)
> [/CODE]


C'est un bon dbut, j'ai comme l'impression que tu aura besoin de 4 variables :

- xo et yo : offset selon x et y (selon la hauteur de prise de vue yo peut varier)
- xs1 et xs2 : deux valeurs de scaling, une pour le dbut du motif  gauche, et une pour la fin du motif  doite



```

```

----------


## Orus

> Oui, c'est sur, il va falloir tenir compte de l'echelle...  Il y a 2 moyens:
> 
> - ajouter un parametre d'echelle dans la formule de cross-correlation => on obtient une fonction a 2 parametres r(o,s), avec o l'offset du motif et s son echelle. Le rsultat est donc un tableau 2D de valeur dont on doit chercher le maximum (c'est le principe de l'espace de Hough)
> 
> - crer des motifs a differentes echelles et faire une simple cross-correlation. C'est uen technique plus simple et qui marche bien si on sait d'avance a quoi ressemble les images a traiter.
> 
> Pour l'image que tu donnes, je verrai bien le motif suivant (a differentes echelles):
> 
> 
> ...


le problme de crer des motifs  diffrentes chelles est de devoir donc connaitre toutes les echelles potentielles  ::): 





> C'est un bon dbut, j'ai comme l'impression que tu aura besoin de 4 variables :
> 
> - xo et yo : offset selon x et y (selon la hauteur de prise de vue yo peut varier)
> - xs1 et xs2 : deux valeurs de scaling, une pour le dbut du motif  gauche, et une pour la fin du motif  doite
> 
> 
> 
> ```
> 
> ```



j'avais essay d'ajuster y, mais ca n'avait aucune influence


j'avais en effet penser  tester le motif  diffrentes chelles, en allant d'une chelle A  une echelle B
en choisissant l'chelle de dpart  la taille de l'image par exemple
reste ensuite  trouver quand s'arreter

mais j'ai peur que ce soit un peu lourd, deja qu'on compare pour chaque point de l'image

d'un autre cot la performance n'est pas un critre important ici

----------


## pseudocode

> le problme de crer des motifs  diffrentes chelles est de devoir donc connaitre toutes les echelles potentielles


On n'a pas besoin d'avoir toutes les echelles, ni d'avoir une correspondance "exacte" entre le profil et le motif. 

L'objectif c'est de faire de la classification, donc de dcider si ton profil  est "plutot un chateau", "plutot une montagne", "plutot une vache", ...  :;):  

Faire des tests a plusieurs echelles ca va aider a departager les cas ou les scores des differents motifs sont sensiblements egaux.




> j'avais essay d'ajuster y, mais ca n'avait aucune influence


Oui, c'est normal vu que la formule de cross-correlation "recentre" les signaux.




> j'avais en effet penser  tester le motif  diffrentes chelles, en allant d'une chelle A  une echelle B en choisissant l'chelle de dpart  la taille de l'image par exemple reste ensuite  trouver quand s'arreter


Ca c'est a toi de decider. Est-ce qu'un paysage de montagne avec un chateau dans le fond est "plutot montagne" ou "plutot chateau" ?




> mais j'ai peur que ce soit un peu lourd, deja qu'on compare pour chaque point de l'image. D'un autre cot la performance n'est pas un critre important ici


Ce n'est pas si lourd que ca en a l'air. Et puis, il y a plein d'optims possibles (parallelisation, distribution, apprentissage, ...)

----------


## mchk0123

> j'avais en effet penser  tester le motif  diffrentes chelles, en allant d'une chelle A  une echelle B
> en choisissant l'chelle de dpart  la taille de l'image par exemple
> reste ensuite  trouver quand s'arreter
> 
> mais j'ai peur que ce soit un peu lourd, deja qu'on compare pour chaque point de l'image
> 
> d'un autre cot la performance n'est pas un critre important ici


Plusieurs points qui me font dire que le traitement ne sera pas si lourd que a :

- ton image est binaire (N&B) donc que 1 bit par pixel
- ton profil est trs simplifi (le contour est une simple ligne brise)
- si tu utilise la transforme de Hough, tu peux la configurer comme ceci :
  - tes lignes = nombre de cofficients inconnus (4 dans mon exemple)
  - tes colonnes = "le pas" ou "la prcision" avec laquelle tu incrmente tes cofficients (si tu utilise 10 colonnes, tu n'aura que 10 facteurs d'chelle, donc 10 comparaisons ; si tu en utilise 1000, l a sera plus lourd)

----------


## Orus

> On n'a pas besoin d'avoir toutes les echelles, ni d'avoir une correspondance "exacte" entre le profil et le motif. 
> 
> L'objectif c'est de faire de la classification, donc de dcider si ton profil  est "plutot un chateau", "plutot une montagne", "plutot une vache", ...  
> 
> Faire des tests a plusieurs echelles ca va aider a departager les cas ou les scores des differents motifs sont sensiblements egaux.


oui en effet on cherche  voir  quoi ca ressemble  ::): 
et on pourra pas forcment trouver pour chaque image





> Ca c'est a toi de decider. Est-ce qu'un paysage de montagne avec un chateau dans le fond est "plutot montagne" ou "plutot chateau" ?


Ca c'est encore un autre probleme  ::D: 
 quel moment un objet devient un lment du dcor inutile  signale
ca pourra etre ajust apres


sinon d'apres ce que vous dites, je devrais passer par l'espace de Hough ?

Et pour le changement d'echelle d'un signal je suppose qu'il y a des formules existantes ?  ::):

----------


## pseudocode

> sinon d'apres ce que vous dites, je devrais passer par l'espace de Hough ?


L'espace de Hough est le nom qu'on donne a l'ensemble des valeurs obtenues par la transforme de Hough.

Dans ton cas, ce n'est pas vraiment une transforme de Hough car on ne cherche pas a modeliser l'ensemble des valeurs possibles. On cherche a trouver la meilleur valeur.

Donc une simple recherche de la valeur "maximale" est suffisante.

----------


## Orus

> L'espace de Hough est le nom qu'on donne a l'ensemble des valeurs obtenues par la transforme de Hough.
> 
> Dans ton cas, ce n'est pas vraiment une transforme de Hough car on ne cherche pas a modeliser l'ensemble des valeurs possibles. On cherche a trouver la meilleur valeur.
> 
> Donc une simple recherche de la valeur "maximale" est suffisante.


ok merci pour la prcision  :;): 


Par contre pour la corrlation, au dbut tu parlais d'autocorrlation, puis dernirement de cross correlation
or c'est pas tout  fait la meme chose non ?  ::): 
la formule utilise ici c'est la corrlation toute simple ?
les 2 premieres utilisant une intgrale, les rsultats sont plus prcis ?


et pour le pattern un trop simple risque pas de donner un score pas tres elev par rapport aux profils ?
http://bp1.blogger.com/_lvcwrI5TIgU/..._signal1D3.jpg

----------


## pseudocode

> Par contre pour la corrlation, au dbut tu parlais d'autocorrlation, puis dernirement de cross correlation
> or c'est pas tout  fait la meme chose non ? 
> la formule utilise ici c'est la corrlation toute simple ?


Houla, effectivement je devrait me relire avant de taper.

Normalement j'aurait du ecrire "cross-correlation" partout.

"Correlation" c'est le terme generique. La "cross-correlation" c'est la correlation de 2 signaux (ce qui nous interesse ici)

Quand a l'auto-correlation, c'est la cross-correlation du signal avec lui-meme. C'est pour rechercher des repetitions (signaux periodiques). Ca n'a rien a faire ici... C'est vraiment n'importe quoi mes posts  ::aie:: ? je vais aller corriger ca.





> les 2 premieres utilisant une intgrale, les rsultats sont plus prcis ?


Les integrales ca ne marche que pour les signaux continus. Ici ton signal est discret, donc les integrales sont remplacs par des sommes.




> et pour le pattern un trop simple risque pas de donner un score pas tres elev par rapport aux profils ?


Bof, ca colle pas trop mal si tu etires le pattern pour lui donner la taille du profil. P-e ca serait mieux avec un seul donjon a gauche:


```

```

Enfin bon, de toute facon, il va falloir "tuner" tes motifs en fonction de tes images.

----------


## Orus

> Houla, effectivement je devrait me relire avant de taper.
> 
> Normalement j'aurait du ecrire "cross-correlation" partout.
> 
> "Correlation" c'est le terme generique. La "cross-correlation" c'est la correlation de 2 signaux (ce qui nous interesse ici)
> 
> Quand a l'auto-correlation, c'est la cross-correlation du signal avec lui-meme. C'est pour rechercher des repetitions (signaux periodiques). Ca n'a rien a faire ici... C'est vraiment n'importe quoi mes posts ? je vais aller corriger ca.


c'est en cherchant des infos sur la corrlation et en relisant les posts que j'ai trouv bizarre  ::): 





> Les integrales ca ne marche que pour les signaux continus. Ici ton signal est discret, donc les integrales sont remplacs par des sommes.


ok meci pour la prcision !






> Bof, ca colle pas trop mal si tu etires le pattern pour lui donner la taille du profil. P-e ca serait mieux avec un seul donjon a gauche:
> 
> 
> ```
> 
> ```
> 
> Enfin bon, de toute facon, il va falloir "tuner" tes motifs en fonction de tes images.


je me doute qu'un seul pattern suffira pas tant donn qu'il y a des images sous diffrents angles de vue  ::): 
mais des images pouvant contenir plusieurs objets, je voudrais essayer de minimiser le bruit (d'un autre cot vaut mieux un peu de bruit, que pas de rsultats)
et apres selon la complexit des objets, il faudra que les pattern soient suffisament particuliers

----------


## mchk0123

> Normalement j'aurait du ecrire "cross-correlation" partout.


Je suis un peu tonn, en effet si on utilise la transforme de Hough, les cofficients d'offset en x (et aussi en y) sont dj intgr dans le calcul ; donc aucunement besoin de cross-correlation. En effet :

- un simple calcul de l'union de l'aire A1 et A2 "sous le profil" des 2 images S1 et S2  comparer devrait suffir

- ce calcul tant simplicime puisque : c'est la somme de min(y1[x], y2[x]) pour x balayant l'image de gauche  droite

----------


## pseudocode

> Je suis un peu tonn, en effet si on utilise la transforme de Hough, les cofficients d'offset en x (et aussi en y) sont dj intgr dans le calcul ; donc aucunement besoin de cross-correlation.


Heu... c'est quoi que tu appelles la transforme de Hough. Je doit pas avoir la meme definition que toi  ::aie::

----------


## Orus

Quelques exemples de tests :

En haut  gauche l'image  identifier,  droite l'image de rfrence
en bas  gauche r(), et  droite max(r)  diffrentes chelles
tout en bas  droite y a aussi affich le score de corrlation et  quelle chelle a du etre mis l'image de rfrence (% de l'image  identifier et en pixels)

http://bp0.blogger.com/_lvcwrI5TIgU/.../s1600-h/1.JPG

la meme image de rfrence mais moins dtaille (rsultat identique)
http://bp1.blogger.com/_lvcwrI5TIgU/.../s1600-h/2.JPG

Cette fois l'image de rfrence est un pattern fait  la main
http://bp1.blogger.com/_lvcwrI5TIgU/.../s1600-h/3.JPG
le rsultat est bon
mais on remarque que le max de r est environ  800, ce qui fait qu'en fait il a reconnu par rapport  la fin de l'image

meme problme ici 
http://bp2.blogger.com/_lvcwrI5TIgU/.../s1600-h/4.JPG
cette fois j'ai encadr en rouge  peu pres la zone qui semble correspondre d'apres lui

----------


## pseudocode

on peut avoir le code de la formule de cross-correlation que tu as utilis ?

----------


## Orus

> on peut avoir le code de la formule de cross-correlation que tu as utilis ?


c'est fait sous matlab
juste une prcision, les tableaux commencent  1 et pas  0 comme en C



```

```

----------


## pseudocode

A premiere vue, (sans maitriser matlab), je dirais qu'il y a un probleme dans les indices



```

```

car


```

```

----------


## Orus

> A premiere vue, (sans maitriser matlab), je dirais qu'il y a un probleme dans les indices
> 
> 
> 
> ```
> 
> ```
> 
> car
> ...


oui j'ai modifi ca, car on transpose le pattern  chaque point pour dterminer ou il devait se placer, ca me paraissait plus clair comme ca
enfin j'ai peut etre mal interprt l'algo  ::): 

il y a d'ailleurs un problme d'indice ngatif  grer en faisant ca

----------


## pseudocode

> oui j'ai modifi ca, car on transpose le pattern  chaque point pour dterminer ou il devait se placer, ca me paraissait plus clair comme ca
> enfin j'ai peut etre mal interprt l'algo 
> 
> il y a d'ailleurs un problme d'indice ngatif  grer en faisant ca


Ok, tu peux garder tes indices comme ca, mais a condition de prendre le conjugu du signal "Y2"



```

```

La cross-correlation se calcule par une convolution. Il faut parcourir un signal dans un sens (indice croissant) et l'autre signal dans le sens oppos (indice dcroissant)

----------


## Orus

> Ok, tu peux garder tes indices comme ca, mais a condition de prendre le conjugu du signal "Y2"


en attendant j'ai test avec l'autre facon  ::): 



```

```

et ca donne  peu pres la meme chose




> ```
> 
> ```
> 
> La cross-correlation se calcule par une convolution. Il faut parcourir un signal dans un sens (indice croissant) et l'autre signal dans le sens oppos (indice dcroissant)


ok !
ca semblait pas apparaitre pourtant dans la formule

j'ai test, mais ca donne pas de bons rsultats  ::(: 
0.57 pour les 2 profils de chateau et encore pas  la bonne echelle

----------


## pseudocode

> en attendant j'ai test avec l'autre facon 
> et ca donne  peu pres la meme chose


Hum.. oui c'est normal, il faut aussi prendre le conjugu du signal. 
je viens de capter que le "*" de MatLab est une simple multiplication.




> ca semblait pas apparaitre pourtant dans la formule


En fait, le "*" au numerateur c'est une convolution ( vu que ce sont 2 SERIES de valeurs )




> j'ai test, mais ca donne pas de bons rsultats 
> 0.57 pour les 2 profils de chateau et encore pas  la bonne echelle


Va falloir que je me mette a matlab... En attendant je vais tester le code en C++/Java apres manger... A+

----------


## Orus

> Hum.. oui c'est normal, il faut aussi prendre le conjugu du signal.


oui j'y ai pens quand j'ai vu ton post et que j'ai rpondu




> je viens de capter que le "*" de MatLab est une simple multiplication.
> En fait, le "*" au numerateur c'est une convolution ( vu que ce sont 2 SERIES de valeurs )


oui comme en rgle gnrale en programmation  ::D: 
j'avoue que ca m'a meme pas travers l'esprit que ca pouvait etre une convolution, pourtant je l'ai apercu  plusieurs reprises, en faisant des recherches sur la cross-correlation ...

en tout cas ca va surement alourdir le calcul  ::): 




> Va falloir que je me mette a matlab... En attendant je vais tester le code en C++/Java apres manger... A+


merci pour ton aide encore  :;):

----------


## pseudocode

> en tout cas ca va surement alourdir le calcul


Non. Il suffit juste de multiplier le 1er terme de la serie A par le dernier de la serie B, etc ...

Ca fait pas plus de calcul que de multiplier les termes 2 a 2.

Bon, je me penche sur ton pb... Tu peux m'envoyer tes series de valeurs (profils et pattern), sinon je vais crer mes propres series ...

----------


## Orus

> Non. Il suffit juste de multiplier le 1er terme de la serie A par le dernier de la serie B, etc ...
> 
> Ca fait pas plus de calcul que de multiplier les termes 2 a 2.
> 
> Bon, je me penche sur ton pb... Tu peux m'envoyer tes series de valeurs (profils et pattern), sinon je vais crer mes propres series ...


ok !

je faisais surtout les tests avec la 3001_1 et 3001_4 vont qu'ils sont proches mais j'ai aussi des pattern fait  la main (test et test2)

http://univ.anhor.com/Stage/DATA/DataOut/horizons/

----------


## pseudocode

> ok !
> 
> je faisais surtout les tests avec la 3001_1 et 3001_4 vont qu'ils sont proches mais j'ai aussi des pattern fait  la main (test et test2)
> 
> http://univ.anhor.com/Stage/DATA/DataOut/horizons/


Hum... je voyais plutot un fichier avec des nombres spars par des virgules  ::P:  .

Enfin bon, apres tests sur un signal "fait main" ca marche dans les 2 cas: 
- Offset positif , pas de conjugaison
- Offset ngatif, avec conjugaison

A mon avis, tu as du tester pil poil les autres cas  ::aie:: .

Donc, le plus simple, c'est de ne PAS faire de conjugaison et d'utiliser un offset positif... ce qui etait ton code de dpart je crois. Bon, je vais tester avec les signaux issus de tes images

----------


## pseudocode

Ah, je crois que j'ai compris le probleme.

Le calcul de la moyenne du signal doit se faire sur la fenetre de comparaison, pas sur toute la longueur.

En d'autres termes, il faut que tu calcules "moy2" uniquement sur ton itervalle [d, d+size(y1)]. Je connais pas matlab, mais en java mon algo ressemble a ca:



```

```

Ici, je ne m'occupe que de l'offset. Il faut rajouter l'echelle.

----------


## Orus

> Hum... je voyais plutot un fichier avec des nombres spars par des virgules  .
> 
> Enfin bon, apres tests sur un signal "fait main" ca marche dans les 2 cas: 
> - Offset positif , pas de conjugaison
> - Offset ngatif, avec conjugaison
> 
> A mon avis, tu as du tester pil poil les autres cas .
> 
> Donc, le plus simple, c'est de ne PAS faire de conjugaison et d'utiliser un offset positif... ce qui etait ton code de dpart je crois. Bon, je vais tester avec les signaux issus de tes images


j'ai pris l'habitude de travailler avec des images sur matlab
et find() me retrouve toutes les valeurs non nulles  ::): 

mais j'ai trouv comment exporter les vecteurs, j'en ai mis quelques uns
http://univ.anhor.com/Stage/DATA/DataOut/horizons/





> Ah, je crois que j'ai compris le probleme.
> 
> Le calcul de la moyenne du signal doit se faire sur la fenetre de comparaison, pas sur toute la longueur.
> 
> En d'autres termes, il faut que tu calcules "moy2" uniquement sur ton itervalle [d, d+size(y1)]. Je connais pas matlab, mais en java mon algo ressemble a ca:
> 
> 
> 
> ```
> ...


ok je vais essayer de voir avec !

----------


## pseudocode

Bon, j'ai test et les rsultats ne sont pas concluant  ::aie::  

1. Ca marche bcp mieux quand on ne soustrait pas la valeur moyenne du signal.
2. En faisant cela, les correlations sont en gros les memes (0.8->0.9) quelquesoit l'echelle. Bon, la meilleur correlation reste quand meme la plus vraissamblable.

En fait, j'ai de meilleurs rsultats avec une bete erreur quadratique.
Je pense meme que je peux amliorer en retaillant le pattern a la taille du signal... 

je vais tester pout voir

----------


## Orus

> Bon, j'ai test et les rsultats ne sont pas concluant  
> 
> 1. Ca marche bcp mieux quand on ne soustrait pas la valeur moyenne du signal.
> 2. En faisant cela, les correlations sont en gros les memes (0.8->0.9) quelquesoit l'echelle. Bon, la meilleur correlation reste quand meme la plus vraissamblable.
> 
> En fait, j'ai de meilleurs rsultats avec une bete erreur quadratique.
> Je pense meme que je peux amliorer en retaillant le pattern a la taille du signal... 
> 
> je vais tester pout voir


en corrigeant la moyenne j'avais en effet peu de changements  ::): 

on m'avait orient sur l'obtention de signal 1D, car apres suffirait de faire un comparaison, je m'attendais  plus simple  ::D: 

en fait je dois justement dterminer si cette voie est prometteuse (donc  priori ralisation d'un prototype autre que matlab) ou pas

----------


## pseudocode

Ca marche bien mieux avec un simple calcul d'erreur (difference entre les 2 signaux, au carr).




> 8_046_1_R.bmp / pattern1.bmp
> Best match at scale 3.42, offset=217.0. Error is 21606   
> 
> 3_001_1_R.bmp / pattern1.bmp
> Best match at scale 3.98, offset=14.0. Error is 2318   
> 
> 3_001_4_R.bmp / pattern1.bmp
> Best match at scale 4.37, offset=0.0. Error is 4270

----------


## pseudocode

```

```




> 8_046_1_R.bmp / pattern1.bmp
> Best match at scale 2.37, offset=466  Error is 45517
> 
> 3_001_1_R.bmp / pattern1.bmp
> Best match at scale 3.46, offset=168  Error is 4834
> 
> 3_001_4_R.bmp / pattern1.bmp
> Best match at scale 3.88, offset=101  Error is 5160
> 
> ...

----------


## Orus

> ```
> 
> ```


ok interessant !
il serait possible de donner un score  la ressemblance selon le taux d'erreur

par contre la 3001_4 avec la 3001_1 donne 27000 erreurs ?

----------


## pseudocode

> par contre la 3001_4 avec la 3001_1 donne 27000 erreurs ?


Et oui. c'est parceque j'utilise l'une des 2 comme pattern, et qu'il y a peu de chance qu'une autre image colle avec ce "pattern".

c'est pour ca qu'il vaut mieux crer les pattern a la main, avec des figures simples.

----------


## Orus

> Et oui. c'est parceque j'utilise l'une des 2 comme pattern, et qu'il y a peu de chance qu'une autre image colle avec ce "pattern".
> 
> c'est pour ca qu'il vaut mieux crer les pattern a la main, avec des figures simples.


vi mais celles la sont quand meme particulirement ressemblantes  ::): 
mais la 1 a un bout en plus devant, en tant que pattern elle colle pas trop, avec l'autre ca marche mieux je testerais demain, chez moi j'ai pas matlab

----------


## Orus

l'ordinateur de travail a quelques problemes ce qui m'a ralentit

mais j'ai test ton algorithme de 2 facons :
1/ En faisant comme auparavant, le changement d'chelle par retaillage de l'image

2/ En reproduisant ta formule
d'ailleurs je pensais que ca se ferait avec des moyennes de points, un peu dans le style des ondelettes, alors que la on se base uniquement sur certains points, sur quelle formule tu t'es bas ?  ::): 


Pour le 1/ je pense que j'ai fait une erreur quelquepart mais j'ai pas encore trouv, car il trouve une erreur relativement lve  chaque fois et plus l'echelle est grande plus elle est leve  ::D: 

le code quand meme :


```

```


Pour le 2/, les rsultats semblent plutot bons

le code :


```

```




> 3001_1 / pattern
> Erreur : 466.0538
> Echelle rduite  85.00% de l'image (1076.10 pixels)
> 
> 3001_4 / pattern
> Erreur : 648.3608
> Echelle rduite  85.00% de l'image (1115.20 pixels)
> 
> 1036_1 / pattern
> ...


Par contre ce qui est bizarre est que plus on descend en chelle, moins bons sont les rsultats.
http://bp2.blogger.com/_lvcwrI5TIgU/...0-h/compar.PNG
A gauche ce sont les rsultats pour les diffrentes chelles, et  chaque fois on obtient quelquechose de tres similaire (pourtant pour le 1036_1 le chateau doit pas dpasser les 50% de l'image).
A droite c'est quel niveau de l'image qu'on trouve le meilleur rsultat, et la pareil, on a gnralement cette forme la, donc au dbut, sauf pour le 8046_1 ou c'est tres diffrent et  la fin

Donc faudrait faire plus de tests mais ca parait en effet interessant. A voir comment  partir de ces erreurs tablir un score de ressemblance.

par contre quelle est la formule utilise pour la comparaison ? diffrence quadratique tu disais ?
Car faudra que j'explique ce que j'utilise.
Or le traitement du signal c'est un peu nouveau pour moi  ::D: 
On m'avait parl de corrlation, la on m'a parl de regarder la cohrence, mais je pense que ca serait pas utile ici.

----------


## pseudocode

> Par contre ce qui est bizarre est que plus on descend en chelle, moins bons sont les rsultats.


Ben c'est assez normal. Le profil du chateau occupe toute l'image. Il faut donc que le ratio Taille_Image/Taille_Pattern soit proche de 1.




> par contre quelle est la formule utilise pour la comparaison ? diffrence quadratique tu disais ? Car faudra que j'explique ce que j'utilise.


lol. Hum... la diffrence quadratique c'est la "magouille de base" pour comparer 2 series en statistique. (je nierai avoir dit cette phrase  ::P: )

En fait, Pour chaque element dans la Serie A (ex. A[k]), tu prends l'element "de meme rang" dans la Serie B (-> B[k]).

Tu soustrais les 2 elements, et tu prends le carr:  D[k] = ( A[k] -  B[k] )^2 

Tu construis ainsi une nouvelle Serie D.

Ensuite, pour avoir la "diffrence quadratique moyenne", tu calcules la moyenne de D (somme des D[k] / longueur de D)

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

----------


## Orus

> Ben c'est assez normal. Le profil du chateau occupe toute l'image. Il faut donc que le ratio Taille_Image/Taille_Pattern soit proche de 1.


Oui mais je disais pas que pour l'image du chateau mais pour toutes les images tests  ::): 
pour la 1036 ca devrait pas etre le cas par exemple





> lol. Hum... la diffrence quadratique c'est la "magouille de base" pour comparer 2 series en statistique. (je nierai avoir dit cette phrase )
> 
> En fait, Pour chaque element dans la Serie A (ex. A[k]), tu prends l'element "de meme rang" dans la Serie B (-> B[k]).
> 
> Tu soustrais les 2 elements, et tu prends le carr:  D[k] = ( A[k] -  B[k] )^2 
> 
> Tu construis ainsi une nouvelle Serie D.
> 
> Ensuite, pour avoir la "diffrence quadratique moyenne", tu calcules la moyenne de D (somme des D[k] / longueur de D)
> ...


 ::D: 
ok merci pour l'info  ::): 

pour le changement d'chelle, tu as utilis une formule particulire ? j'avais chercher des infos la dessus pour un signal j'avais pas trouv grand chose

----------


## pseudocode

> Oui mais je disais pas que pour l'image du chateau mais pour toutes les images tests 
> pour la 1036 ca devrait pas etre le cas par exemple


Ah ok. A mon avis ca vient du fait que je n'ai pas recentr les signaux. Donc, pour des grandes echelles (c-a-d un pattern tres petit), il y a un grand ecart entre la "hauteur" du profil et la "hauteur" du pattern. Quand l'echelle s'approche de 1, les 2 signaux sont a peu pres a la meme hauteur, donc l'erreur est moins grande.  a tester...




> pour le changement d'chelle, tu as utilis une formule particulire ? j'avais chercher des infos la dessus pour un signal j'avais pas trouv grand chose


non, c'est juste une bete augmentation/reduction de l'image. A noter qu'il vaut mieux rduire l'image que augmenter le pattern. Rduire l'image permet de filtrer le bruit.

----------


## Orus

> Ah ok. A mon avis ca vient du fait que je n'ai pas recentr les signaux. Donc, pour des grandes echelles (c-a-d un pattern tres petit), il y a un grand ecart entre la "hauteur" du profil et la "hauteur" du pattern. Quand l'echelle s'approche de 1, les 2 signaux sont a peu pres a la meme hauteur, donc l'erreur est moins grande.  a tester...


ok donc un rajustement des y devraient amliorer la chose ?
je vais tester  ::): 





> non, c'est juste une bete augmentation/reduction de l'image. A noter qu'il vaut mieux rduire l'image que augmenter le pattern. Rduire l'image permet de filtrer le bruit.


c'est vrai que je faisais le contraire (rajustement du pattern), c'est en effet mieux de faire ca  ::):

----------


## Orus

```

```

j'ai retaill la hauteur du signal par rapport  celui du pattern
et en effet ca se faisait bien que pour les grandes echelles

le probleme est que maintenant il en detecte  tout va en petite echelle :p




> 3001_1 / pattern
> Erreur : 531.0158
> Echelle rduite  85.00% de l'image (1076.10 pixels)
> 
> 3001_4 / pattern
> Erreur : 551.2284
> Echelle rduite  55.00% de l'image (721.60 pixels)
> 
> 8046_1 / pattern
> ...

----------


## pseudocode

Hum... je pense qu'on pourra pas aller beaucoup plus loin dans cette voie.

Pour avoir de meilleur rsultat, il va falloir "nettoyer" le signal du profil afin d'avoir une reprsentation plus simple (genre des segments de droites).

----------


## Orus

> Hum... je pense qu'on pourra pas aller beaucoup plus loin dans cette voie.
> 
> Pour avoir de meilleur rsultat, il va falloir "nettoyer" le signal du profil afin d'avoir une reprsentation plus simple (genre des segments de droites).


en fait on arrive au meme soucis qu'avec l'intercorrlation

tu penses qu'avec une approximation on aurait un meilleur rsultat ? (Hough, ondelettes ou encore Fourier)

----------


## pseudocode

> en fait on arrive au meme soucis qu'avec l'intercorrlation
> 
> tu penses qu'avec une approximation on aurait un meilleur rsultat ? (Hough, ondelettes ou encore Fourier)


J'ai test en lissant les sigaux, ca marche un peu mieux, mais c'est pas encore terrible.

Ce que je pense surtout c'est que pour avoir une classification efficace il faut abandonner le principe de la correlation de profil et utiliser quelque chose de plus conventionnel (contour, texture, points d''interet, ...)

Au vu des quelques photos que tu as montr dans tes posts, je pense que l'analyse des textures devrait donner des bons rsultats.

Les contours aussi:  les contours verticaux/horizontaux sont representatif des constructions (chateau, immeubles).

----------


## Orus

> J'ai test en lissant les sigaux, ca marche un peu mieux, mais c'est pas encore terrible.
> 
> Ce que je pense surtout c'est que pour avoir une classification efficace il faut abandonner le principe de la correlation de profil et utiliser quelque chose de plus conventionnel (contour, texture, points d''interet, ...)
> 
> Au vu des quelques photos que tu as montr dans tes posts, je pense que l'analyse des textures devrait donner des bons rsultats.
> 
> Les contours aussi:  les contours verticaux/horizontaux sont representatif des constructions (chateau, immeubles).


dans l'approche propose que je devais tudier, une des primitive a extraire tait cette ligne d'horizon pour obtenir le profil d'un objet, son echelle et son orientation.
le probleme sont les fausses detections

mais avec un pattern beaucoup plus prcis, on pourrait pas limiter cela ?

ou alors faut que je couple avec d'autres primitives

pour la texture, on m'en avait parl pour la detection du ciel, qui normalement n'est pas textur, mais vu que ce sont de vieilles images, elles se sont abimes et donc ce n'est plus vraiment le cas

pour les contours, faut arriver  isoler les objets alors ?

----------


## pseudocode

Bon comme je l'ai dit, j'ai regard en "lissant" les profils. Ca permet d'utiliser la formule de cross-correlation lorsque les 2 profils sont TRES proche, genre les 2 chateaux.

Correlation "Montagne / Chateau" a differentes echelles (en rouge)


Correlation "Chateau / Chateau" a differentes echelles (en rouge)


Quand on essaye avec un (gros) pattern, les resultats sont trop proches pour permettre une decision




> le probleme sont les fausses detections
> mais avec un pattern beaucoup plus prcis, on pourrait pas limiter cela ?
> ou alors faut que je couple avec d'autres primitives


Je pense qu'on pourrait tester plusieurs  "petits" pattern, plutot que d'avoir un pattern qui tente de coller a l'integralit du profil.

Par exemple, un pattern creneau (avec 1 seul creneau), un pattern donjon (avec un seul triangle), un pattern tour, ...

a tester...




> pour les contours, faut arriver  isoler les objets alors ?


J'ai fait un detecteur basique qui compte les blocs d''image qui ont des bords verticaux ou horizontaux. Les rsultats sont dja meilleurs que la correlation de profil avec un "gros" pattern.




Pour la detection par texture, je n'ai pas encore test car mon code de classification de texture ne compile plus  ::aie:: . Il faut que je le remette au propre. J'en profiterai pour le poster sur le forum...

----------


## Orus

> Bon comme je l'ai dit, j'ai regard en "lissant" les profils. Ca permet d'utiliser la formule de cross-correlation lorsque les 2 profils sont TRES proche, genre les 2 chateaux.
> 
> Correlation "Montagne / Chateau" a differentes echelles (en rouge)
> 
> 
> Correlation "Chateau / Chateau" a differentes echelles (en rouge)
> 
> 
> Quand on essaye avec un (gros) pattern, les resultats sont trop proches pour permettre une decision
> ...


C'est ralis avec l'intercorrlation ?
ce qui pose soucis ce sont les fausses detections
et avec des tous petits pattern on risque pas d'avoir le meme probleme ? car /\ par exemple c'est  la fois des tours (chateau, glise) mais aussi les crneaux





> J'ai fait un detecteur basique qui compte les blocs d''image qui ont des bords verticaux ou horizontaux. Les rsultats sont dja meilleurs que la correlation de profil avec un "gros" pattern.
> 
> 
> 
> 
> Pour la detection par texture, je n'ai pas encore test car mon code de classification de texture ne compile plus . Il faut que je le remette au propre. J'en profiterai pour le poster sur le forum...


sympa cette mthode,
par contre comment ca marche ? tu compares des blocs entre 2 images ?

----------


## pseudocode

> C'est ralis avec l'intercorrlation ?
> ce qui pose soucis ce sont les fausses detections
> et avec des tous petits pattern on risque pas d'avoir le meme probleme ? car /\ par exemple c'est  la fois des tours (chateau, glise) mais aussi les crneaux


Oui, il y aura des fausses detections de certains pattern. Mais il faut esperer qu'une majorit des patterns "associs au chateaux" seront bien detect. Les erreurs (faux postif ou faux negatif) devraient etre en minorit...  ::roll::  




> sympa cette mthode,
> par contre comment ca marche ? tu compares des blocs entre 2 images ?


Non, non. il n'y a pas de comparaison. J'ai post 2 images passs a travers le meme algo.

L'algo detecte les contours Horizontaux et Verticaux (en rouge). Ensuite, pour chaque "case", il compte le nombre de pixel rouge. Si ce comptage dpasse un certain seuil, il selectionne la case (en blanc).

Ensuite, on peut faire un ratio "cases selectiones / cases totales" pour decider si c'est plutot une image avec des construction, ou plutot une image de nature...

Bon, j'ai reussi a recompiler mon algo de texture. Va falloir que je test sur tes images

----------


## pseudocode

> Bon, j'ai reussi a recompiler mon algo de texture. Va falloir que je test sur tes images


Premier essai, super basic. J'ai juste fait un apprentissage avec 3 motifs de 32x32  ::aie::   (un bour de ciel, de fenetre et d'arbre)



Ca serait certainement mieux si j'ajoutais des motifs d'eau et de buisson...  ::mrgreen::

----------


## Orus

> Oui, il y aura des fausses detections de certains pattern. Mais il faut esperer qu'une majorit des patterns "associs au chateaux" seront bien detect. Les erreurs (faux postif ou faux negatif) devraient etre en minorit...


oui faut esperer  ::D: 
mais c'est pas certain  ::): 





> Non, non. il n'y a pas de comparaison. J'ai post 2 images passs a travers le meme algo.
> 
> L'algo detecte les contours Horizontaux et Verticaux (en rouge). Ensuite, pour chaque "case", il compte le nombre de pixel rouge. Si ce comptage dpasse un certain seuil, il selectionne la case (en blanc).
> 
> Ensuite, on peut faire un ratio "cases selectiones / cases totales" pour decider si c'est plutot une image avec des construction, ou plutot une image de nature...
> 
> Bon, j'ai reussi a recompiler mon algo de texture. Va falloir que je test sur tes images


ok !

sympa sinon l'algo pour la texture

----------


## Orus

> Premier essai, super basic. J'ai juste fait un apprentissage avec 3 motifs de 32x32   (un bour de ciel, de fenetre et d'arbre)
> 
> 
> 
> Ca serait certainement mieux si j'ajoutais des motifs d'eau et de buisson...


par contre quelles perspectives de traitement avec une telle image ?
rcuprer les zones non identifies (les grises) ? et tenter de dcrire les formes contenus ?

----------


## pseudocode

> par contre quelles perspectives de traitement avec une telle image ?
> rcuprer les zones non identifies (les grises) ? et tenter de dcrire les formes contenus ?



Non, les zones GRISES ne sont pas "non identifies". Elles correspondent a la texture "fenetre"  ::aie::  

En ce moment, l'algo force une association entre "texture image" et "texture reference". 

Deja, il faudrait ignorer les textures trop loigns des references (avec un seuil). Ca eviterait certainement que les buissons de l'image soient associs a la texture fenetre  ::?:  

Donc il ne resterait que des textures "correctement" identifies  (ou du moins dans le seuil de tolerance). On pourrait alors compter le ratio "nmb texture identifies" / "nmb texture totale de l'image".

- Si le ratio est "correct" (encore un seuil), on peut classifier l'image (genre 30% foret + 40% chateau + 30% ciel)

- Si le ration est trop bas, il faut une intervention manuelle. Par exemple pour apprendre a l'algo a identifier les textures inconnues.

Bref, plein d'ide possible. Le tout c'est de coder les algos  ::mouarf::  

En ce moment mon algo est super basique. La "distance" entre une texture image (Ti) et une texture de reference (Tr), c'est la somme des distances entre les coefficients:

d(Ti,Tr) = |ai-ar| + |bi-br| + |ci-cr| + ...

avec a,b,c,... les coefficients de Haralick (et encore, juste les 10 premiers).

Donc beaucoup d'amelioration possible...

----------


## Orus

> Non, les zones GRISES ne sont pas "non identifies". Elles correspondent a la texture "fenetre"  
> 
> En ce moment, l'algo force une association entre "texture image" et "texture reference". 
> 
> Deja, il faudrait ignorer les textures trop loigns des references (avec un seuil). Ca eviterait certainement que les buissons de l'image soient associs a la texture fenetre  
> 
> Donc il ne resterait que des textures "correctement" identifies  (ou du moins dans le seuil de tolerance). On pourrait alors compter le ratio "nmb texture identifies" / "nmb texture totale de l'image".
> 
> - Si le ratio est "correct" (encore un seuil), on peut classifier l'image (genre 30% foret + 40% chateau + 30% ciel)
> ...


ah d'accord  ::D: 
par contre on risque d'identifier plusieurs batiments plutot que juste le chateau comme ici non ?

ca fait beaucoup de seuils sinon  ::aie::

----------


## pseudocode

> ah d'accord 
> par contre on risque d'identifier plusieurs batiments plutot que juste le chateau comme ici non ?


Oui, tout a fait. Mais le but de cet algo c'etait de classifier les images par leur contenu.  C'est pas du tout fait pour differencier un Chateau d'un Immeuble. Et encore moins pour comparer 2 chateaux entre eux.

Si je me souvient bien, ton probleme c'etait juste de differencier les villes et les paysages, non ?




> ca fait beaucoup de seuils sinon


Arf. Oui... les algos ''tout automatique" je ne sais pas faire  ::aie::

----------


## Orus

> Oui, tout a fait. Mais le but de cet algo c'etait de classifier les images par leur contenu.  C'est pas du tout fait pour differencier un Chateau d'un Immeuble. Et encore moins pour comparer 2 chateaux entre eux.
> 
> Si je me souvient bien, ton probleme c'etait juste de differencier les villes et les paysages, non ?


en fait c'est plus compliqu que ca  ::aie::  
c'est d'identifier ce que contient les images pour les indexer automatiquement
pour commencer, et afin de trouver des approches on a choisi de reconnaitre 3 entits : le chateau, l'glise et une montagne
apres je pense que si on arrivait  faire ca ca s'tofferait (y a une cathdrale, un pont, une statut, et j'ai qu'un apercu des images, donc surement d'autres choses  ::aie::  )





> Arf. Oui... les algos ''tout automatique" je ne sais pas faire


 ::mrgreen::  
les algos tout automatique ca coure pas les rues de toute facon :p

----------


## pseudocode

> on a choisi de reconnaitre 3 entits : le chateau, l'glise et une montagne. Apres je pense que si on arrivait  faire ca ca s'tofferait (y a une cathdrale, un pont, une statut, et j'ai qu'un apercu des images, donc surement d'autres choses  )


Houla. Differencier un chateau d'une eglise, ca va etre coton. C'est deja pas evident pour un etre humain

Il va falloir taper dans la reconnaissance de forme. Du genre vectoriser ton image, et faire de la segmentation avance (rseaux neuronaux, bayesiens, ...)

----------


## Orus

> Houla. Differencier un chateau d'une eglise, ca va etre coton. C'est deja pas evident pour un etre humain
> 
> Il va falloir taper dans la reconnaissance de forme. Du genre vectoriser ton image, et faire de la segmentation avance (rseaux neuronaux, bayesiens, ...)


oui  ::aie:: 
pour ca que je voulais essayer d'avoir un profil relativement prcis  ::): 
enfin vu le temps imparti et la vitesse o les jours passent, ca va etre dur !

j'ai pass du temps  tudier et comprendre la reconnaissance de formes, et j'avais en effet compris que c'est ce qu'on cherche rellement  faire ici, mais ce domaine est relativement vaste et il existe pas mal de techniques
Enfin faut que je continue  me renseigner sur quelles primitives peuvent etre extraites, mais j'ai vu que les vecteurs caractristiques pouvaient avoir de tres grande dimension

niveau applicatif, je pense qu'on a voulu que je cherche des corrlations entre des images, en utilisant le profil pour voir si c'etait exploitable pour pouvoir le combiner avec d'autres primitives

----------

