2010-03-21 1 views
6

J'ai un tas d'images PNG, et je cherche un moyen d'identifier les doublons. Par doublons, je veux dire, spécifiquement, deux fichiers PNG dont les données d'image non compressées sont identiques, pas nécessairement dont les fichiers sont identiques. Cela signifie que je ne peux pas faire quelque chose de simple comme comparer les valeurs de hachage CRC. Je pense que cela peut effectivement être fait de manière fiable, car les PNG utilisent une compression sans perte, mais je m'inquiète pour la vitesse. Je sais que je peux un peu faire les choses en testant d'abord les dimensions égales, mais quand vient le temps de comparer les images les unes par rapport aux autres, y a-t-il un moyen de le faire raisonnablement efficacement? (Ie. Plus vite que les "double boucle for valeurs de pixel de contrôle contre l'autre" méthode de force brute?)Existe-t-il un moyen simple de tester deux PNG pour l'égalité?

+0

Pourquoi avez-vous besoin de 2 boucles? Une boucle suffit. – kennytm

+0

Un pour X, un pour Y –

+0

Certes, si vous mettez une image par compression PNG, il apparaîtra de la même manière si vous le faites deux fois, ce qui signifie que vous devriez pouvoir comparer les deux PNG directement. – Chris

Répondre

3

Sauf si vous attendez beaucoup de doublons, en moyenne, vous ne comparerez pas beaucoup de pixels avant de déterminer que 2 fichiers sont différents. Surtout si chaque pixel que vous testez est situé loin des pixels déjà testés. Cela aidera avec, par exemple, fichiers de dessin au trait qui ont la même couleur de fond.

De plus, à quel point devez-vous être précis? Par exemple, si 10 pixels testés de la même manière sont identiques, pouvez-vous conclure sans risque que les images sont identiques? 10 pixels RVB = 240 bits, donc le taux de fausse correspondance avec les images aléatoires devrait être de 1 sur 2^240 = 1 sur 10^72!

+0

Ce ne sont pas des images aléatoires, et je m'attends à une proportion assez élevée de doublons. Mais l'idée de tester des valeurs aléatoires comme technique de filtrage est une bonne idée. –

13
  1. filtre selon la taille d'image identique (largeur & hauteur)
  2. fichier ouvert
  3. hachage contenu non compressé (md5 ferait probablement)
  4. magasin hachage

  5. comparer hash pour trouver ceux identiques

+1

Pourquoi trier par taille identique? – zneak

+3

Je pense que c'est une réponse solide. Après le filtre, un échantillonnage rapide des pixels/compare sur quelques points aléatoires pourrait également éliminer certaines images. –

+0

Oh, d'accord. Je pensais que c'était "taille" comme dans "taille du fichier". – zneak

0

Je suppose que vous pourriez être en mesure d'ajuster la taille des données en cours de lecture, même si le format de stockage est complètement différent. Ainsi, si votre image est en 24 bits, vous pouvez éventuellement utiliser un type de données 32 bits ou 64 bits (compilé en 64 bits) et continuer d'empaqueter les données dans deux variables de ces types des deux images et comparer les deux pour l'égalité . Cela pourrait accélérer un peu les choses :)

6

Au lieu de faire défiler tous les pixels pour vérifier l'égalité, il peut être utile de commencer par le milieu et de travailler vers l'extérieur. La plupart des images ont le sujet au milieu, ce qui signifie que plus de données de caractéristiques se trouvent ici. Essentiellement, il sera beaucoup plus rapide de savoir si deux images sont différentes de cette façon.

Questions connexes