Comparer 2 image [Résolu]

Signaler
Messages postés
23
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
24 mai 2009
-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
-
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.

12 réponses

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
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!
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
oups,


inverse le test d'égalité !!!

C# is amazing, enjoy it!
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
41
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 ! -
Messages postés
23
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
24 mai 2009

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
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
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!
Messages postés
23
Date d'inscription
vendredi 28 novembre 2008
Statut
Membre
Dernière intervention
24 mai 2009

Oui en effet jai pus remarquer cela. mais mais image ne font que 15 par 15 Pixel.
Messages postés
3
Date d'inscription
lundi 28 janvier 2008
Statut
Membre
Dernière intervention
25 novembre 2009

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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
41
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é ! -
Messages postés
32
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
25 juillet 2012

Salut
les tests pat getPixel sont long...
Va voir la librairie OpenCV - gratuite. elle permet de tester deux images
Zan
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
41
@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é. -
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
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!
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
41
@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é. -