12 votes

Détecter des images similaires

Possible Duplicate:
Algorithme de comparaison d'images

Donc, fondamentalement, j'ai besoin d'écrire un programme qui vérifie si 2 images sont les mêmes ou non. Considérez les 2 images suivantes :

http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night.jpg

http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night2.jpg

Eh bien, ce sont les mêmes images, mais comment puis-je vérifier si ces images sont identiques. Je suis uniquement limité aux fonctions multimédias. Tout ce à quoi je peux penser pour le moment, c'est la mise à l'échelle de la largeur, la hauteur et la comparaison des RGB pour chaque pixel, mais la couleur ne serait-elle pas différente ?

Je suis complètement perdu sur celui-ci, toute aide est appréciée.

*Note: cela doit être en python et utiliser la (bibliothèque multimédia)

5voto

John Wordsworth Points 1661

Wow - c'est une question massive, et qui a un nombre incroyable de solutions possibles. Je ne suis pas experte en python, mais j'ai trouvé ta question intéressante - donc je voulais proposer une méthode que j'implémenterais si j'étais confrontée à ce problème.

Évidemment, les deux images que vous avez postées sont en réalité très différentes - donc vous devrez considérer 'à quel point la différence est la même', surtout lorsque vous travaillez avec des images et que vous considérez différents formats d'image et la compression, etc.

Quoi qu'il en soit, pour une solution qui permet une différence donnée dans les valeurs des couleurs (mais pas pour que les pixels soient mal placés), je ferais quelque chose comme ce qui suit;

  1. Choisissez deux images.

  2. Redimensionnez la plus grande image à la même hauteur et largeur exactes que la première (même en déformant l'image si nécessaire).

  3. Éventuellement, mettez les images en niveaux de gris pour rendre les étapes suivantes plus simples, sans perdre beaucoup en termes d'efficacité. En fait, il pourrait être intéressant d'exécuter ici une détection de bord également.

  4. Passez en revue chaque pixel dans les deux images et enregistrez la différence dans chacun des canaux RGB, ou simplement la différence d'intensité en niveaux de gris. Vous obtiendriez un tableau de la taille de l'image notant la différence entre les intensités des pixels sur les deux images.

  5. Maintenant, je ne connais pas les valeurs exactes, mais vous constateriez probablement ensuite que si vous itérez sur le tableau, vous pourriez voir si la différence entre chaque pixel des deux images est la même (ou presque la même) pour tous les pixels. Peut-être itérer sur le tableau une fois pour trouver la différence moyenne entre les intensités des pixels des deux images, puis itérer sur l'image à nouveau pour voir si 90% des différences se situent dans une certaine plage (différence de 5% ?).

Juste une idée. Bien sûr, il pourrait y avoir des fonctions intéressantes dont je ne suis pas au courant pour rendre cela facile, mais je ne retiendrais pas mon souffle !

1voto

kindall Points 60645

ImageMagick a des liaisons Python et une fonction de comparaison. Il devrait faire la plupart du travail pour vous, mais je ne l'ai jamais utilisé en Python.

0voto

neil Points 1153

Je pense que l'étape 2 de la réponse de John Wordsworth peut être l'une des plus difficiles - ici vous travaillez avec une copie étirée de l'image mais autorisez-vous également des images tournées, recadrées ou déformées de différentes manières? Si oui, vous aurez besoin d'un algorithme de correspondance de fonctionnalités, tel que celui utilisé dans Hugin ou d'autres logiciels de création de panoramas. Cela permettra de trouver des fonctionnalités correspondantes, de les déformer pour les adapter, puis vous pourrez effectuer les autres étapes de comparaison. Idéalement, vous souhaitez reconnaître la peinture de Van Gogh à partir de photos, même des photos sur des tasses! C'est facile pour un humain de le faire, mais pour un ordinateur, il faut des mathématiques plutôt complexes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X