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é?
Répondre
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!
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. –
- filtre selon la taille d'image identique (largeur & hauteur)
- fichier ouvert
- hachage contenu non compressé (md5 ferait probablement)
magasin hachage
comparer hash pour trouver ceux identiques
Pourquoi trier par taille identique? – zneak
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. –
Oh, d'accord. Je pensais que c'était "taille" comme dans "taille du fichier". – zneak
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 :)
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.
- 1. Un moyen facile de tester l'application réseau
- 2. Problèmes de légalité @ font-face
- 3. Existe-t-il un moyen simple de tester si un attribut Moose est en lecture seule?
- 4. Un moyen d'automatiser - pour tester - une action dépendante de l'homme?
- 5. Simple Captcha - Comment tester?
- 6. Quel est le moyen le plus simple de tester un client .NET SAML?
- 7. Un moyen efficace de détecter les fichiers png corrompus?
- 8. Le moyen le plus simple de tester l'existence d'un GPU compatible cuda de cmake?
- 9. Syntaxe simple pour tester les erreurs de validation
- 10. Existe-t-il un moyen de tester un contrôle désactivé?
- 11. Existe-t-il un moyen simple de déterminer si deux transformations sont identiques?
- 12. Comment tester ce simple contrôleur ASP.NET MVC
- 13. Besoin d'un moyen efficace pour un problème simple dans C#
- 14. Regex pour remplacer un guillemet simple avec deux guillemets simples
- 15. Android - Un moyen de tester Gestures sur l'émulateur?
- 16. Exécution d'un script VBA simple pour tester une connexion
- 17. Existe-t-il un moyen de tester une variable pour "isForEachable"
- 18. moyen simple et direct pour empaqueter un programme python pour debian?
- 19. Un moyen simple de compresser un fichier existant en Java?
- 20. Quel est un moyen rapide de tester pour voir un fichier existe?
- 21. un moyen simple d'additionner un résultat de UNION dans MySQL
- 22. XSLT: Un moyen simple de fusionner des fichiers xml
- 23. Existe-t-il un moyen plus simple de référencer l'élément source pour un événement?
- 24. Le moyen le plus efficace pour tester les liens
- 25. NullPointerException Utiliser JMockit pour tester deux fois raillé java.io.File
- 26. Meilleur/le plus simple/le moyen le plus rapide d'obtenir un chemin relatif entre deux fichiers?
- 27. Premier TDD, simple projet C# à deux niveaux - Que dois-je tester?
- 28. Existe-t-il un moyen facile, simple et paresseux de tester les règles par rapport au mod_rewrite d'Apache?
- 29. Conseils pour créer un jeu simple .net
- 30. fichier de commandes pour .png?
Pourquoi avez-vous besoin de 2 boucles? Une boucle suffit. – kennytm
Un pour X, un pour Y –
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