Domanda

Sto cercando di creare un sistema di identificazione per catalogare le immagini.Non posso usare md5() poiché cambierà se modifico i tag EXIF ​​dell'immagine.

Attualmente sto utilizzando il checksum SHA1 calcolato da imagemagick.Funziona perfettamente, ma è davvero, davvero lento con immagini più grandi (~15 secondi su uno xeon quad-core per un JPG da 21 megapixel).

Esistono altri metodi "visivi" per identificare in modo univoco un'immagine che sarebbero più veloci?

È stato utile?

Soluzione

Potresti provare a eseguire MD5 sui dati bitmap effettivi anziché sul file JPEG.Ho effettuato il test sulla mia macchina (anch'essa una Xeon quad core) e quanto segue viene eseguito in circa 900 ms su un'immagine da 23 megapixel.

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);

Altri suggerimenti

cosa intendi per "checksum visivo"?gli algoritmi che menzioni (md5/sha/crc) funzionano in modo basato sui byte, ma non tengono conto delle informazioni visive dell'immagine.Se converti una delle tue immagini in JPEG, i due file mostreranno la stessa immagine, ma avranno checksum md5/sha/crc totalmente diversi.

se la tua unica preoccupazione sono le modifiche EXIF, potresti creare una copia temporanea dell'immagine, rimuovere tutti i metadati da essa con la libreria exiv2 ed eseguire quindi l'algoritmo di checksum.Suppongo che questo sia molto più veloce rispetto al ridimensionamento manuale delle immagini.Potresti anche velocizzare il calcolo utilizzando solo i primi n kilobyte del file sorgente per il checksum.

Se tutti i tuoi file immagine provengono direttamente da una fotocamera, stai ancora meglio:potresti estrarre la miniatura EXIF ​​pregenerata con exiv2 (di solito solo pochi kilobyte) e calcolarne il checksum.

Informazioni sull'approccio di riduzione:Tieni inoltre presente che ImageMagick potrebbe modificare i suoi algoritmi di ridimensionamento in futuro, il che invaliderebbe i tuoi checksum (la struttura dei byte delle versioni ridotte cambierebbe quindi).

Come notato da Todd Yandell, MD5 è probabilmente abbastanza veloce.In caso contrario, puoi ottenere qualcosa di ancora più veloce utilizzando una versione a 32 o 64 bit CRC per il tuo checksum.La differenza principale è che chiunque può creare una nuova immagine con lo stesso CRC;è molto facile falsificare.È piuttosto difficile per qualcuno falsificare un checksum MD5.Una piccola differenza è che il CRC ha molti meno bit, ma a meno che non si abbia un numero molto elevato di immagini, una collisione è comunque improbabile.

exiftool afferma di essere in grado di estrarre l'immagine binaria da un file JPEG, in modo da poter calcolare il checksum senza decomprimere, ma non riesco a capire dalla pagina man come farlo.

Ho fatto alcuni esperimenti su un laptop con CPU Intel Core 2 Duo L7100 e un JPEG da 8 MP impiega circa 1 secondo per comprimersi in formato PPM, quindi un altro 1 secondo per eseguire il checksum.I tempi del checksum non erano notevolmente diversi utilizzando md5sum, sum, E sha1sum.Quindi la soluzione migliore potrebbe essere quella di trovare un modo per estrarre i dati binari senza decomprimerli.

Noto anche che il tuo checksum sarà quasi altrettanto buono anche se utilizza molti meno pixel.Confronta questi due:

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

Dovresti considerare che qualcuno potrebbe ritagliare l'immagine o modificare la tavolozza, la profondità del colore o altro, quindi un checksum piatto sarà diverso, anche se visivamente l'immagine originale e quella modificata sembrano ancora più o meno simili.Forse esiste un algoritmo efficace per quelle ritagliate o ricolorate, come Google Immagini utilizza per la ricerca di immagini simili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top