Comparer 2 image

Résolu
leonardo14 Messages postés 23 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 24 mai 2009 - 16 mai 2009 à 01:08
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre 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.
A voir également:

12 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
17 mai 2009 à 10:46
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!
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
17 mai 2009 à 10:47
oups,


inverse le test d'égalité !!!

C# is amazing, enjoy it!
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
18 mai 2009 à 12:24
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 ! -
0
leonardo14 Messages postés 23 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 24 mai 2009
23 mai 2009 à 21:36
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
24 mai 2009 à 00:49
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!
0
leonardo14 Messages postés 23 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 24 mai 2009
24 mai 2009 à 01:10
Oui en effet jai pus remarquer cela. mais mais image ne font que 15 par 15 Pixel.
0
bahriprofinfo Messages postés 3 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 25 novembre 2009
25 nov. 2009 à 11:29
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
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
25 nov. 2009 à 13:46
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é ! -
0
cs_zanzan Messages postés 32 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 25 juillet 2012
15 mars 2010 à 06:44
Salut
les tests pat getPixel sont long...
Va voir la librairie OpenCV - gratuite. elle permet de tester deux images
Zan
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
15 mars 2010 à 10:13
@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é. -
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
16 mars 2010 à 18:19
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!
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mars 2010 à 09:38
@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é. -
0
Rejoignez-nous