J'ai plus de fichiers de 10 000 de 10 000 produits, le problème est que nombre des images sont des duplicats.
S'il n'y a pas d'image, il existe une image standard qui dit "Aucune image". P>
Comment puis-je détecter si l'image est ce fichier image "nulographe" standard? P>
MISE À JOUR B> L'image est un nom différent, mais c'est exactement la même image sinon. P>
Les gens disent le hasch, alors je ferais cela? P>
im = cStringIO.StringIO(file.read()) img = im.open(im) md5.md5(img)
6 Réponses :
En supposant que vous parlez de même images en termes de données d'image les mêmes. P>
calcule le hachage fort> de l'image "Aucune image" et Comparez-le sur les hachages des autres images. Si les hachages sont les mêmes, c'est le même fichier. P>
Ce serait également un bon moyen de détecter des doublons ailleurs. Commencez à calculer les hachages des images, puis pour chaque image, assurez-vous qu'il n'existe pas déjà. Si c'est le cas, vous avez un duplicata. Sinon, ajoutez-le à la base de données et passez à autre chose.
En fait, si Blankman recherche des doublons d'un fichier particulier (par opposition à la recherche de tous les ensembles de doublons dans la collection), les hachages sont contre-productifs - voir ma réponse.
@Gilles: intéressant. Ouais, je sais que vous devriez lire complètement tous les fichiers, mais je n'ai jamais dit que c'est la meilleure ou une approche rapide;) Vous a donné +1.
Alors, comment puis-je faire ce hash sur une image?
@Blankman: Jetez un oeil au module Hashlib: docs.python.org/library/hashlib.html
hachage. Les collisions sont des doublons (au moins, c'est une impossibilité mathématique qu'ils ne sont pas le même fichier). P>
Je suppose que vous vouliez dire "improbabilité" i>, pas "impossibilité".
Vous devriez toujours i> considérer la possibilité de collisions de hasch. Multipliez le coût b> d'une collision avec la probabilité d'une collision b> pour obtenir le coût attendu attendu b>. Habituellement, le coût attendu est petit car même si le coût est un million de dollars, la probabilité d'une collision est si petite. Mais les photos de bébé, etc. sont irremplacbles, alors peut-être que certains efforts supplémentaires sont parfois nécessaires;)
@gnibbler c'est pourquoi nous gardons des sauvegardes.
Si vous recherchez des doublons exacts d'une image particulière: chargez cette image en mémoire, puis en boucle sur votre collection d'images; Ignorer tout fichier qui n'a pas la même taille; Comparez le contenu des fichiers qui ont la même taille, arrêtez-vous à la première différence. P>
Computing d'un hachage dans cette situation est en réalité contre-productive car vous devez lire chaque fichier complètement en mémoire (au lieu de pouvoir s'arrêter à la première différence) et effectuer une tâche intensive de la CPU. p>
S'il y a plusieurs ensembles de duplicats, d'autre part, calculer un hachage de chaque fichier est meilleur. P>
Si vous recherchez également des quasi-doublons visuels, FINITIMageDUPES peut vous aider. < / p>
Il peut calculer un hachage et économiser également la taille de l'image et sauter les images avec différentes tailles. Il serait intelligent de tester ce qui prend plus de temps. Informatique hachage ou comparer deux octets d'octet par octet.
Cela peut sembler être un gaspillage d'effort pour calculer tous ces hachages, mais la comparaison de N fichiers les uns aux autres est O (n * n). Avec un nombre suffisant de fichiers, l'algorithme O (n) Calculer les hachages et la comparaison dans un Set () code> ou dict () code> sera plus efficace. Notez que vous n'avez pas besoin de hachage dans tout le fichier - le premier KB ou de même être probablement aussi utile qu'un premier chèque
Comme Sidenote, pour les images, je trouve des données de données raster pour être beaucoup plus efficaces que les hachages de fichiers.
Imagemagick fournit un moyen fiable de calculer ces hatupes et de différentes liaisons pour Python disponibles. Il aide à détecter les mêmes images avec différentes compressions sans perte et différentes métadonnées. P>
Exemple d'utilisation: P>
>>> import PythonMagick
>>> img = PythonMagick.Image("image.png")
>>> img.signature()
'e11cfe58244d7cf98a79bfdc012857a9391249dca3aedfc0fde4528eed7f7ba7'
Cette méthode est bien meilleure que les haubans de fichiers afin de comparer les PNG et les BMP, deux des mêmes images avec différentes données Exif de données ou de techniques de codage doivent être considérées comme similaires.
Merci, Daniel. Cela m'a été incroyablement utile car certaines de mes images avaient été marquées et certaines n'avaient pas. Cela me permet de trouver des images en double quelles que soient leurs métadonnées.
Un lien vers la documentation appropriée ImageMagick sur cette fonctionnalité serait utile. Par exemple, une recherche Google pour ImageMagick Raster Data Hash fournit peut-être ou peut-être pas d'informations utiles à quelqu'un qui ne savent pas nécessairement exactement ce qu'ils cherchent.
@JPTROS J'ai ajouté un code d'exemple, mais gardez à l'esprit que PythonMagick n'est plus maintenu. Il y a d'autres liaisons de Python pour la messagerie instantanée pour la messagerie instantanée, qui sont mieux entretenues, mais je n'ai pas d'échantillon de code pour eux.
J'ai écrit un script pour cela un moment de retour. Tout d'abord, il analyse tous les fichiers, notant leurs tailles dans un dictionnaire. Vous courez avec: puis, pour chaque touche (taille d'image) où il y a plus d'un élément dans le dictionnaire, je lirais un montant fixe du fichier et faire un hachage. Quelque chose comme: p> C'est tout hors top de ma tête, je n'ai pas testé le code, mais vous obtenez l'idée. P> p>
Tous les fichiers Microsoft Bitmap sans compression rle qui ont les mêmes dimensions de pixels auront la même taille. Comme Will XPMS avec le nom interne de même longueur, de même que PNGS sans compression, de même que les images NetPBM ... La liste se passe et activée. Mais je suis d'accord; Vérification de la taille aidera à éviter des collisions sans signification
J'ai eu du mal à installer Pythonmagick sur Fedora mais WAND (un autre imagemagick Reliure) a fonctionné.
yum install python3-wand ImageMagick
Est-ce vraiment la même image (binaire) ou juste une image avec le même nom?
Qu'entendez-vous par «duplicata»? Même nom? Même checksum? Mêmes octets exacts?
Nous avons vraiment besoin de plus d'informations. En plus des questions déjà posées, comment sont-elles stockées? Ces répertoires contiennent-ils des répertoires contenant un fichier image avec d'autres fichiers? Sont les stockés dans une base de données? Sont-ils stockés d'une autre manière? À quoi ressemble le système? Est-ce que toutes les produits "No Image" utilisent le même fichier pour leur image ou s'agit-il d'une copie de la même image dupliquée pour chaque produit?