Comparer 2 image [Résolu]

Messages postés
23
Date d'inscription
vendredi 28 novembre 2008
Dernière intervention
24 mai 2009
- - Dernière réponse : krimog
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 17 mars 2010 à 09:38
Bonjour je suis a la recherche d'un code qui marche bien. Se code vas me premetre de comparer des image.

Exemple:      Jai un ImageBox1 et ImageBox2. si l'image qui apparait dans mon Imagebox1 est identique au ImageBox2 alors
                    le programme vous affiche un message.

Mercie.
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
3
Merci
Bonjour,

à ma connaissance il n'y a pas de méthode toute faite, il va donc faloir comparer les images pixel par pixel.

D'abord il faut verifier que les 2 images ont les même dimensions.
puis une boucle sur les pixels,
genre:

for (
int i=0; i < image1.Width; i++)

   for (
int j=0; j < image1.Height; j++)
   {

      if (image1.GetPixel(i,j) == image2.GetPixel(i,j))
         return

false;

   }
returntrue
; //images identiques

C# is amazing, enjoy it!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Robert33
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
0
Merci
oups,


inverse le test d'égalité !!!

C# is amazing, enjoy it!
Commenter la réponse de cs_Robert33
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
Salut
Le problème, Robert33, c'est que ton code (en mettant effectivement un !à la place du), même s'il marche bien, est probablement lent (je dis probablement car je n'ai pas testé la méthode GetPixel() sans la méthode SetPixel()). Grâce au code non managé (unsafe), tu gagneras certainement en performances (enfin s'il est nécessaire que ton code soit rapide).
Si tu veux plus d'informations, je suis sûr qu'en faisant quelques recherches, tu trouveras rapidement via le moteur de recherche de CS, ou à la limite via Google.

Bonne chance

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
Messages postés
23
Date d'inscription
vendredi 28 novembre 2008
Dernière intervention
24 mai 2009
0
Merci
Je vous remercie a tout pour vos belle réponse! Jai reussie a fair fonction le premier code donner.
Désoler pour le retard :P
Commenter la réponse de leonardo14
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
0
Merci
Bonsoir,

Krimog, il est certain que le code ne sera pas premier dans une course de vitesse, car la methode GetPixel "lock" le bitmat à chaque fois.
Donc à eviter si les images sont trop grandes ou s'il y a trop d'images.
mais pour de petites tailles c'est assez simple.

C# is amazing, enjoy it!
Commenter la réponse de cs_Robert33
Messages postés
23
Date d'inscription
vendredi 28 novembre 2008
Dernière intervention
24 mai 2009
0
Merci
Oui en effet jai pus remarquer cela. mais mais image ne font que 15 par 15 Pixel.
Commenter la réponse de leonardo14
Messages postés
3
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
25 novembre 2009
0
Merci
pour la comparaison de deux images, il ne faut pas utilisé les opérateur == ou !=: il faut calculer la distance entre ces deux images (la similarité entre ces deux images càd le degré de ressemblance entre celle ci). il faut extraire les signatures (Histogram par exemple) de chaqu'une de ces images, puis calculer la distence (EMd, euclidiennne) entre ces signatures ; sila distance est plus petit alors les deux images sont plus ressemblentes et vice versa
Commenter la réponse de bahriprofinfo
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
Salut Bahriprofinfo

Ce post date de mai pour info ;)

De plus, il ne cherchait pas à savoir si deux images étaient similaires, mais si elles étaient identiques (c'est une petite nuance verbale et une énorme nuance au niveau de l'algorithme).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Commenter la réponse de krimog
Messages postés
32
Date d'inscription
lundi 3 février 2003
Dernière intervention
25 juillet 2012
0
Merci
Salut
les tests pat getPixel sont long...
Va voir la librairie OpenCV - gratuite. elle permet de tester deux images
Zan
Commenter la réponse de cs_zanzan
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
@Zanzan:
Ce post date de presque un an.
De plus, il a déjà été indiqué dans le post que la méthode GetPixel est lente. Cependant, comme j'en ai parlé, il est possible de passer par du code unsafe pour éviter cela. La bibliothèque OpenCV n'est absolument pas nécessaire pour ça, et je doute très fortement que ce soit plus rapide que du traitement unsafe.
Enfin, cette bibliothèque est à la base en C/C++/Python. Je crois qu'il existe cependant une version C#, mais non officielle. Toujours est-il que c'est plus compliqué que d'utiliser les méthodes directement disponibles en C#.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
0
Merci
bonsoir,

en effet ce post date un peu.

pour info on peut aussi utiliser la methode LockBits du bitmap en lecture seule elle permet d'aller tres vite.
mais je suis d'accord avec toi Krimog, un peu de code unsafe permet d'accelerer certain traitement.


C# is amazing, enjoy it!
Commenter la réponse de cs_Robert33
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
@Robert33
Il est vrai que LockBits n'oblige pas à utiliser du code unsafe (cependant, le code unsafe oblige à utiliser LockBits), mais je trouve ça tellement plus pratique que d'utiliser InteropServices.Marshal ;)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.