[Visual Studio C++] recherche code pour la comparaison de 2 images

recherche code pour la comparaison de 2 images [Visual Studio C++] - C++ - Programmation

Marsh Posté le 14-02-2003 à 14:02:05    

bonjour,  
 
je recherche du code pour pouvoir comparer 2 images (une petite et une grande), afin de chercher l'occurence de la petite image dans la grande.  
 
je recherche surtout une solution pour traiter ces images le plus rapidement possible (en mode console, incluant le MFC).  
 
Je vous remercie d'avance pour votre aide

Reply

Marsh Posté le 14-02-2003 à 14:02:05   

Reply

Marsh Posté le 14-02-2003 à 14:25:26    

aucune idée, mais si tu trouves tu pourrais poster ca ici ?

Reply

Marsh Posté le 14-02-2003 à 15:20:29    

ca dépends du format, ca... en bmp ca doit etre trivial, par contre en jpeg ca doit etre impossible sans passer par de la reconnaissance de formes

Reply

Marsh Posté le 14-02-2003 à 15:47:08    

lorill a écrit :

ca dépends du format, ca... en bmp ca doit etre trivial, par contre en jpeg ca doit etre impossible sans passer par de la reconnaissance de formes


 
c pour une comparaison d'image de type BMP

Reply

Marsh Posté le 14-02-2003 à 15:59:26    

Laurent2210 a écrit :


 
c pour une comparaison d'image de type BMP


Ben c'est sûr que dans ce cas t'as l'algo trivial de parcourir les pixels ... Mais pas très performants !


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 14-02-2003 à 17:42:42    

comprends pas le contexte...
 
tu veux savoir quoi si dans une image tu en retrouve une autre à position+ratio+orientation différente ?

Reply

Marsh Posté le 14-02-2003 à 18:29:17    

tomlameche a écrit :


Ben c'est sûr que dans ce cas t'as l'algo trivial de parcourir les pixels ... Mais pas très performants !


 
 
encore faut il que l'image soit incluses parfaitement dans l'autre au pixel près !

Reply

Marsh Posté le 14-02-2003 à 18:35:16    

Et qu'il n'y ait pas eu le moindre traitement "photographique".
 
Y a eu une thèse par la méthode des "ondelettes" ou "vaguelettes", je sais plus (oublié) pour retrouver photo dans bibliothèque, mais pas trivial.
 
Si c'est un BOUT d'une photo non retravaillée, on doit pouvoir chercher la séquence des pixels de la première ligne dans la grande puis les autres si première trouvée. Si l'une passée en N/B, tintin !
 
Google ne donne rien ? :ange:

Reply

Marsh Posté le 14-02-2003 à 18:37:20    

sur la recherche je me rapelle d'un article dont le titre etait "fast search in image database using tree structured VQ" (ou faut changer un peu le tiercé), mais je sais pas si c ca qui est exactement demandé
 

Reply

Marsh Posté le 15-02-2003 à 16:44:23    

y a gqview(sous gpl) qui implémente un algo qui permet de rechercher les doublons. Ça marche pas trop mal, une app kde allait meme l'implémenter.

Reply

Marsh Posté le 15-02-2003 à 16:44:23   

Reply

Marsh Posté le 15-02-2003 à 19:49:09    

Faut que tu soit plus precis dans la description de ton probleme.
 
- Si tu EXACTEMENT la meme image dans une autre image, pas de probleme, tu parcours ton buffer et tu recherche une sequence a l'interieur.
- Par contre, si c'est pas exactement  la meme, t'es mal : la c'est segmentation, block-matching, registration ou autre...

Reply

Marsh Posté le 16-02-2003 à 01:33:29    

tu peux faire une convolution d'une image dans l'autre sous forme d'une fonction d'erreur (traitement canal par canal en ponderant ou bien recherche sur la luminosite uniquement)
 
Pour la convolution rapide je te recommande de trouver la librairie qui te fait la transformee de fourier rapide
(http://www.fftw.org/)
sachant que pour avoir la convolution il suffit de multiplier une image par l'autre dans l'espace des fréquences et de faire la transformation inverse sur l'image résultat.
 
Les maximums ou minimums (suivant ta fonction d'erreur) locaux de ton image résultat te donnera la position dans la grande image du motif recherché.
 
C'est probablement pas trés optimal (en temps de calcul). L'inconvénient également c'est que ça ne te donne
pas les images transformées par transformation affines (rotations/homothéties) uniquement les translations.
 
A+
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 16-02-2003 à 11:29:31    

legreg a écrit :


Les maximums ou minimums (suivant ta fonction d'erreur) locaux de ton image résultat te donnera la position dans la grande image du motif recherché.
 


 
on dit maxima et minima ;-)

Reply

Marsh Posté le 16-02-2003 à 22:44:39    

Kyle_Katarn a écrit :

=
on dit maxima et minima ;-)


 
Si je parlais en latin, je dirais maxima minimaque (en plus cela aurait valeur de citation)
mais aux dernières nouvelles on est sur un forum (des fora?)
français et j'applique les règles de l'orthographe française aux mots empruntés: c'est à dire la forme la plus courante mis au singulier et au pluriel régulier. (d'où l'expression très curieuse "les médias".)
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 17-02-2003 à 09:03:20    

legreg a écrit :


 
Si je parlais en latin, je dirais maxima minimaque (en plus cela aurait valeur de citation)
mais aux dernières nouvelles on est sur un forum (des fora?)
français et j'applique les règles de l'orthographe française aux mots empruntés: c'est à dire la forme la plus courante mis au singulier et au pluriel régulier. (d'où l'expression très curieuse "les médias".)
 
LeGreg


 
Le seuls problème est qu'en FRANCAIS on dit minima et maxima, de même qu'on dit pas des scénarios mais des scenarii, etc etc ..

Reply

Marsh Posté le 17-02-2003 à 09:05:54    

je vais un peu plus détaillé le contexte de ma recherche.
 
il fo ke je recherche la ou les position(s) d'une image(bmp), dans une autre image, l'image à rechercher peut ne pas etre tou a fait la meme dans l'autre image --> g une image de 100 pixels, et g un paramatre ou je donne la precision (soit en %, soit en pixel) dans notre cas je donne par exemple 90%, donc je recherche une image ki est a 90% proche de celle ci dans l'autre image. J'orai egalement la possibilité de mettre les deux images en noir et blanc et de faire ensuite la recherche sur celles-ci.
 
Je suis très intéressé par la solution avec la convolution, g également eu une réponse ki me proposé de faire une corrélation, je vais donc approndir mes recherches sur ces 2 possibilités.  
 
J'ajoute a ceci (pour legreg) ke la translation devrait suffir, donc pas besoin de rotation ou koi ke ce soit.
 
Encore un grand merci,  
 
et si vous avez d'otres propositions ou conseils, n'hésitez pas à me les transmettre, merci  
 

Reply

Marsh Posté le 17-02-2003 à 11:05:28    

Kyle_Katarn a écrit :


Le seuls problème est qu'en FRANCAIS on dit minima et maxima, de même qu'on dit pas des scénarios mais des scenarii, etc etc ..


 
tu n'as pas suivi le débat sur les mots empruntés
qui est une épine dans le pied de l'orthographe française.
 
Je répète: en latin, la forme plurielle de maximum est maxima  
et lorsque l'on cite le latin on est tenu de respecter la forme originelle comme dans "des mea culpa". Par contre pour ce qui est des mots empruntés aux langues étrangères (et il s'agit d'une règle de bon sens!) on est seulement prié de prendre la forme la plus couramment utilisée et ceci pour éviter des dérives d'incohérence.
 
Cela te paraît sans doute logique pour toi latinisant ou personne ayant fait du latin dans ta jeunesse que certains mots en "um" aient leur pluriel en "a". Or pour le vulgum pecus (oh le beau barbarisme) c'est une incohérence du français.
Tiens puisqu'on est dans les mots étrangers : d'après toi quel est le singulier de "taliban" ou de "moujahidin"(puisqu'il sont tous les deux employés sous leur forme pluriel)? Quel est le pluriel d'oduseus (Odysseus) ?
 
Je suis bien d'accord qu'il est souvent tentant de faire savant en utilisant des mots en étranger (langue la plus parlée en dehors de l'hexagone) dans le texte et puis ça fait tout de suite plus cool de savoir que l'on dit un soprano mais des soprani (je connais une série qui devra penser sérieusement à changer de nom) mais pour moi (je parle en mon nom propre)
ça n'est qu'une démonstration de connaissance par quelques uns et pas une règle applicable ou généralisable en pratique (et d'ailleurs que tu serais sans doute bien en mal d'étendre à d'autres langues que le latin ou l'italien..).
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 17-02-2003 à 11:13:47    

Laurent2210 a écrit :


 
J'ajoute a ceci (pour legreg) ke la translation devrait suffir, donc pas besoin de rotation ou koi ke ce soit.


 
Si tu pas besoin de rotation ni de changement d'echelle la correlation devrait suffire.  

Reply

Marsh Posté le 17-02-2003 à 12:17:30    

la correlation entre deux images x(i,j) et y(i,j)
avec i et j qui designent les deux dimensions des images
est egale a la fonction suivante:
 
x*y(i,j) = somme sur t (somme sur v de x(t,v).y(t-i, v-j))
 
Ce n'est pas exactement une convolution parce que la formule
de la convolution implique de retourner l'image y autour du point(i,j). C'est évidemment symétrique si tu étends l'image y par sa répétition au delà de ses bornes (tu rends les fonctions x et y periodiques).
 
A ceci tu ajoutes un theoreme important dans l'analyse d'image
a savoir que la convolution dans l'espace des temps(les variables i et j) est egal a une simple multiplication dans l'espace des frequences (apres transformee de fourier).  
Ce theoreme s'applique egalement aux correlations comme on peut le deviner mais le changement dans la formule implique de considérer le conjugué de la transformée de Fourier de x (les transformées de fourier sont définies dans le corps des complexes).
 
Comme la convolution (ou la correlation) est une operation couteuse en n.m et que la transformee de fourier rapide peut etre effectuee en n.logn operations, tu peux te rendre compte que des que la taille des deux images a comparer devient trop importante, il est beaucoup plus intéressant de passer par la transformée de Fourier.
 
En principe la correlation est maximale aux points de l'image de départ ou l'on peut trouver une "quasi translation" de l'image comparée (à considérer avec un grain de sel; ça dépendra des caractéristiques des deux images comparées). C'est pour ça que tu dois chercher les maximums locaux dans l'image résultat de la transformée de fourier inverse.
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 17-02-2003 à 14:14:34    

legreg a écrit :

la correlation entre deux images x(i,j) et y(i,j)
avec i et j qui designent les deux dimensions des images
est egale a la fonction suivante:
 
x*y(i,j) = somme sur t (somme sur v de x(t,v).y(t-i, v-j))
 
Ce n'est pas exactement une convolution parce que la formule
de la convolution implique de retourner l'image y autour du point(i,j). C'est évidemment symétrique si tu étends l'image y par sa répétition au delà de ses bornes (tu rends les fonctions x et y periodiques).
 
A ceci tu ajoutes un theoreme important dans l'analyse d'image
a savoir que la convolution dans l'espace des temps(les variables i et j) est egal a une simple multiplication dans l'espace des frequences (apres transformee de fourier).  
Ce theoreme s'applique egalement aux correlations comme on peut le deviner mais le changement dans la formule implique de considérer le conjugué de la transformée de Fourier de x (les transformées de fourier sont définies dans le corps des complexes).
 
Comme la convolution (ou la correlation) est une operation couteuse en n.m et que la transformee de fourier rapide peut etre effectuee en n.logn operations, tu peux te rendre compte que des que la taille des deux images a comparer devient trop importante, il est beaucoup plus intéressant de passer par la transformée de Fourier.
 
En principe la correlation est maximale aux points de l'image de départ ou l'on peut trouver une "quasi translation" de l'image comparée (à considérer avec un grain de sel; ça dépendra des caractéristiques des deux images comparées). C'est pour ça que tu dois chercher les maximums locaux dans l'image résultat de la transformée de fourier inverse.
 
LeGreg


 :jap:  
Voilà qui vient d'élever grandement le niveau intellectuel de 20 derniers postes du forum.


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 18-02-2003 à 10:56:20    

OK, et pour réaliser toutes c formules mathématiques en programmation, y orait-il des exemples afin de manipuler tout cela, parce ke g pas tres bien compris l'histoire des maximums locaux dans l'image résultat de la transformée de fourier inverse.  
 
Merci
 
@+

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed