c# - picture - compare two images




Algorithme pour comparer deux images en C# (3)

J'écris un outil en C # pour trouver des images en double. Actuellement, je crée une somme de contrôle MD5 des fichiers et les compare.

Malheureusement, mes images peuvent être

  • tourné de 90 degrés
  • avoir des dimensions différentes (image plus petite avec le même contenu)
  • avoir des compressions ou des types de fichiers différents (par exemple, des artefacts jpeg, voir ci-dessous)

Quelle serait la meilleure approche pour résoudre ce problème?


Après avoir ré-échantillonné les images à une résolution commune, vous pouvez utiliser une décomposition en ondelettes et comparer les coefficients de cette décomposition à la place des images elles-mêmes. La comparaison des seuls N premiers coefficients rendra cette méthode plus robuste au bruit et aux autres artefacts.

Il existe plusieurs implémentations C # pour les ondelettes disponibles. https://waveletstudio.codeplex.com/ est un exemple.


Question intéressante, la comparaison d'images n'est pas si difficile étant donné que,

  1. Ces images sont les mêmes (la première n’est pas une section de la seconde ou vice versa)
  2. Les images ne pivotent que par multiples de 90 degrés

Une façon de faire la comparaison serait de:

  1. Redimensionner les images à la plus basse diamention
  2. Appliquez une détection de bord sur chaque image résultante en image noir et blanc (ou un tableau de 0 et 1)
  3. Comparez les bitmaps obtenus (gardez le premier immobile et faites pivoter le second de 90 degrés 3 fois) et calculez le pourcentage de pixels correspondant et obtenez la valeur la plus élevée.

Maintenant, si la valeur se situe dans une valeur raisonnable, disons 90% (vous devrez probablement déterminer en effectuant peu d'expériences), alors vous pouvez sans risque supposer que les deux sont identiques, mais cela ne fonctionnera pas si,

  1. Même si quelques pixels diffèrent dans le coin, par exemple, la deuxième image est recadrée de la première
  2. La rotation des images n’est pas un multiple de 90 degrés (bien que ce ne soit pas très probable)

Vous pouvez vérifier l’ algorithme pour comparer deux images afin de voir les méthodes disponibles pour la comparaison d’images.

Sauf si vous souhaitez recréer vous-même l'intégralité des algorithmes, vous devriez essayer d'utiliser des bibliothèques déjà existantes ou une partie au moins de leur code (tant que leur licence vous convient).

Pour une implémentation C # open source de la détection Edge et des algorithmes de vision par ordinateur associés, vous pouvez essayer EmguCV un wrapper d'OpenCV.





hash