Question

Je cherche à créer un système d'identification pour cataloguer les images.Je ne peux pas utiliser md5() car cela changera si je modifie les balises EXIF ​​​​de l'image.

J'utilise actuellement la somme de contrôle SHA1 calculée par imagemagick.Cela fonctionne parfaitement, mais c'est vraiment très lent sur des images plus grandes (~ 15 secondes sur un xeon quad-core pour un JPG de 21 mégapixels).

Existe-t-il d'autres méthodes « visuelles » permettant d'identifier de manière unique une image qui seraient plus rapides ?

Était-ce utile?

La solution

Vous pouvez essayer d'exécuter MD5 sur les données bitmap réelles au lieu du fichier JPEG.J'ai testé sur ma machine (également un Xeon quad core) et ce qui suit s'exécute en environ 900 ms sur une image de 23 mégapixels.

uint32_t width  = MagickGetImageWidth(imageWand);
uint32_t height = MagickGetImageHeight(imageWand);

uint8_t *imageData = malloc(width * height * 3);

MagickExportImagePixels(imageWand,
   0, 0, width, height, "RGB", CharPixel, imageData);

unsigned char *imageDigest = MD5(imageData, width * height * 3, NULL);

free(imageData);

Autres conseils

qu'entends-tu par « somme de contrôle visuelle » ?les algorithmes que vous mentionnez (md5/sha/crc) fonctionnent en octets, mais ne prennent pas en compte les informations visuelles de l'image.Si vous convertissez une de vos images en JPEG, les deux fichiers afficheront la même image, mais auront des sommes de contrôle md5/sha/crc totalement différentes.

si votre seul souci concerne les modifications exif, vous pouvez faire une copie temporaire de l'image, en supprimer toutes les métadonnées avec la bibliothèque exiv2 et exécuter ensuite l'algorithme de somme de contrôle.Je suppose que c'est beaucoup plus rapide que de réduire manuellement les images.Vous pouvez également accélérer le calcul en utilisant uniquement les n premiers kilo-octets du fichier source pour la somme de contrôle.

Si tous vos fichiers image proviennent directement d’un appareil photo, c’est encore mieux :vous pouvez extraire la vignette exif prégénérée avec exiv2 (généralement quelques kilo-octets seulement) et calculer sa somme de contrôle.

À propos de l’approche réduite :Soyez également conscient du fait qu'ImageMagick pourrait modifier ses algorithmes de mise à l'échelle à l'avenir, ce qui invaliderait vos sommes de contrôle (la structure en octets des versions réduites changerait alors).

Comme l'a noté Todd Yandell, MD5 est probablement assez rapide.Sinon, vous pouvez obtenir quelque chose d'encore plus rapide en utilisant un logiciel 32 bits ou 64 bits. CRC pour votre somme de contrôle.La différence majeure est que n'importe qui peut créer une nouvelle image avec le même CRC ;c'est très facile à usurper.Il est assez difficile pour quelqu'un d'usurper une somme de contrôle MD5.Une différence mineure est que le CRC comporte beaucoup moins de bits, mais à moins d'avoir un très grand nombre d'images, une collision est toujours peu probable.

exiftool prétend pouvoir extraire l'image binaire d'un fichier JPEG, afin que vous puissiez calculer votre somme de contrôle sans décompresser, mais je n'arrive pas à comprendre à partir de la page de manuel comment le faire.

J'ai fait quelques expériences sur un ordinateur portable Intel Core 2 Duo L7100, et un JPEG 8MP prend environ 1 seconde pour être compressé au format PPM, puis encore 1 seconde pour effectuer la somme de contrôle.Les temps de somme de contrôle n'étaient pas radicalement différents en utilisant md5sum, sum, et sha1sum.Le mieux serait donc de trouver un moyen d’extraire les données binaires sans les décompresser.

Je note également que votre somme de contrôle sera presque aussi bonne même si elle utilise beaucoup moins de pixels.Comparez ces deux :

djpeg -scale 1/8 big.jpg | /usr/bin/sha1sum   # 0.70s
djpeg            big.jpg | /usr/bin/sha1sum   # 2.15s

Vous devez considérer que quelqu'un peut recadrer l'image ou modifier la palette, la profondeur de couleur ou quoi que ce soit, alors une somme de contrôle plate sera différente, même si visuellement l'image originale et l'image modifiée se ressemblent toujours assez.Il existe peut-être un algorithme efficace pour les photos recadrées ou recolorées, comme celui utilisé par Google Images pour rechercher des images similaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top