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?
Réponses:
Les hachages perceptifs peuvent être la réponse:
http://www.phash.org/
la source
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.
la source
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.
la source
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.
la source