Comment savoir si deux images sont identiques? [fermé]

20

J'ai plus de 10000 images dont environ 2000 sont des doublons dans d'autres formats (comme en JPEG, PNG, GIF). Ces deux chiffres augmentent chaque jour. J'ai besoin de supprimer ces doublons et pour cela je dois d'abord savoir comment les trouver.

Ma première pensée a été de vérifier les pixels d'une image et de trouver d'autres images qui ont les mêmes pixels colorés dans les mêmes coordonnées. Mais cette option ne fonctionne pas toujours. Disons que je recherche un doublon. Quant à l'objet consultable, je choisis un fichier PNG 8 bits. Il trouvera tous les doublons de cette image, mais seulement le PNG 8 bits, parfois le GIF 8 bits et rarement le JPEG (à cause des images algorithmiques je suppose?).

Ma deuxième pensée a été de dupliquer toutes ces images et de les recolorer dans une palette stricte de deux couleurs (disons noir et blanc) et de faire le même scan comme indiqué ci-dessus. Encore une fois, l'image JPEG n'est pas 100% similaire au format PNG ou GIF (la même raison que ci-dessus?).

La troisième pensée était de diminuer le pourcentage sur la quantité d'image que vous devez connaître et d' augmenter la variation des couleurs, entraînant une suppression d'image indésirable ...

Des pensées?

Aistis
la source
Les formats avec compression avec perte entraîneront des images qui ne sont pas 100% identiques aux versions sans perte. Devez-vous avoir un utilitaire de ligne de commande ou pourriez-vous exécuter un programme gui, qui fait des suggestions, puis montre les images qui ont, disons> 90% de pixels similaires (calculez un écart moyen)? (et bien sûr, la taille des pixels doit être identique dans tous les formats)
thorsten müller
1
Combien auraient le même nom de fichier mais une extension différente?
JeffO
4
Réponse utile qui ne nécessite pas de semaines de codage: stackoverflow.com/questions/596262/…
mac

Réponses:

17

Les hachages perceptifs peuvent être la réponse:

http://www.phash.org/

Un hachage perceptuel est une empreinte digitale d'un fichier multimédia dérivée de diverses fonctionnalités de son contenu. Contrairement aux fonctions de hachage cryptographiques qui reposent sur l'effet d'avalanche de petits changements en entrée conduisant à des changements drastiques en sortie, les hachages perceptuels sont "proches" les uns des autres si les caractéristiques sont similaires.

Joe
la source
9
  1. Vérifiez les dimensions. Si différent => les images ne sont pas identiques.
  2. Vérifiez les formats. S'il en est de même => Effectuez une comparaison précise, pixel par pixel.
  3. Si différents formats le font:

Ne comparez pas RVB (rouge, vert, bleu). Comparez la luminosité à la moitié du poids et comparez la couleur / la teinte à l'autre moitié (ou 2/3 vs 1/3). Calculez la différence de valeurs et en fonction de la valeur de «tolérance», elles sont identiques ou non.

JPEG compresse fortement les informations de couleur mais essaie de ne pas ruiner les valeurs de liminance.

Boris Yankov
la source
6

Il y a quelques années, lorsque je projetais un tas d'images pour les dupes, j'ai trouvé que tout réduire à des miniatures 8x8, puis calculer un score de similitude basé sur le carré de la distance (en traitant les trois couleurs séparément) entre les miniatures fonctionnait assez bien. Notez que vous pouvez conserver BEAUCOUP de miniatures 8x8 en mémoire.

Pratiquement tous les dupes ont obtenu un score inférieur aux non-dupes, les seuls problèmes étant certaines images à très faible contraste et similaires dans l'ensemble, même si le contenu réel variait (l'arrière-plan dans chaque cas était du sable de plage).

Cela a également été efficace pour capturer des images qui étaient dupes, sauf que quelqu'un avait réduit la résolution ou la qualité sur une afin de réduire la taille du fichier.

Loren Pechtel
la source
1
Typiquement, YUV est meilleur que RVB, moins sensible aux changements mineurs dans l'équilibre des couleurs.
Martin Beckett
Cette technique de vignettes pour présélectionner les correspondances potentielles est valide, YUV est une bonne touche et je l'ai vue se transformer en une carte de luminance pure pour les mêmes raisons.
Patrick Hughes
@Martin Beckett: La somme des carrés de différence RVB a été la première chose que j'ai essayée et cela a fonctionné suffisamment bien pour que je n'essaye pas de l'améliorer - et à cela, il attrapait des dupes avec l'édition. Avec une définition stricte de dupe, c'était assez bon que je l'aurais laissé supprimer automatiquement.
Loren Pechtel
@ Loren, s'il s'agissait de modifications mineures de pixels de la même image qui devraient fonctionner. C'est juste que des choses comme jpeg gâchent RGB plus qu'un espace colorimétrique YUV. Juste un conseil ;-)
Martin Beckett
Par nature, les images très sombres ont tendance à avoir une somme des carrés des différences plus faible, même si elles ne sont pas du tout similaires. Le seuil peut être ajusté avec la luminosité moyenne de l'image. J'utilise cette luminosité moyenne comme un pré-filtre pour éviter les comparaisons d'images O (n ^ 2), donc il est déjà là.
Gabriel
1

Vous devriez peut-être écrire du code qui scanne les images pour leur ressemblance. Vous pouvez convertir toutes les photos au format ARGB et les comparer. (en mémoire)

Une approche possible pourrait être la suivante: divisez les images en zones. Scannez la couleur et / ou la luminosité moyenne des zones pour comparer deux images pour leur ressemblance.

Si plus que disons, 90% des zones correspondent, vous en avez choisi une pour passer à la liste des candidats à la suppression. De cette façon, vous avez une liste de candidats. Vous pouvez utiliser le rapport d'aspect des images pour classer les images en images horizontales et verticales afin d'accélérer les comparaisons. de cette façon, vous pouvez compenser les algorithmes avec perte qui ne reproduisent pas les bonnes couleurs pixel par pixel. Vous exécutez le programme pendant la nuit et le matin, vous l'avez fait :) dans .Net, cela peut être fait assez facilement avec GDI + lib.

Onno
la source