Frage

Ich suche ein ID-System für die Katalogisierung Bilder zu erstellen. Ich kann nicht md5 (), da diese verwenden wird sich ändern, wenn ich die EXIF-Tags des Bildes ändern.

Ich bin derzeit das SHA1-Prüfsumme von ImageMagick berechnet. Es funktioniert perfekt, aber es ist wirklich, wirklich langsam auf größere Bilder (~ 15 Sekunden auf einem Quad-Core-Xeon für eine 21-Megapixel JPG).

Gibt es noch andere „visuelle“ Methoden der eindeutig ein Bild zu identifizieren, die schneller sein würde?

War es hilfreich?

Lösung

Sie könnten versuchen, MD5 auf den tatsächlichen Bitmap-Daten ausgeführt anstelle der JPEG-Datei. Getestet habe ich auf meinem Rechner (auch ein Quad-Core-Xeon) und die folgenden Läufe in etwa 900ms auf einem 23-Megapixel-Bild.

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

Andere Tipps

Was meinst du mit „visual Prüfsumme“? die Algorithmen erwähnen Sie (md5 / sha / FRK) Arbeit in einem Byte basiert, aber berücksichtigen nicht die visuelle Information des Bildes. Wenn Sie eines Ihrer Bilder in JPEG konvertieren, zeigen die beiden Dateien das gleiche Bild, aber haben ganz andere md5 / sha / CRC-Prüfsummen.

, wenn Ihre einzige Sorge der EXIF-Änderungen sind, können Sie eine temporäre Kopie des Bildes machen, Streifen alle Metadaten aus mit der exiv2 Bibliothek und den Prüfsummen-Algorithmus laufen dann. Ich nehme an, das ist viel schneller als die manuelle Skalierung der Bilder unten. Sie könnten auch die Berechnung unter Verwendung nur die ersten n Kilobyte der Quelldatei für die Prüfsumme beschleunigen.

Wenn alle Ihre Bilddateien direkt von einer Kamera kommen, sind Sie noch besser: Sie extrahieren konnte vorgenerierte exif Thumbnail mit exiv2 (in der Regel nur wenige Kilobyte) und seine Prüfsumme berechnen

.

Über den Scale-Down-Ansatz: dass auch der Tatsache bewusst, dass ImageMagick könnte seine Skalierung algorithmsin Zukunft ändern, die Ihre Prüfsummen ungültig machen würde (die Byte-Struktur der abgespeckte Versionen dann würde sich ändern)

Wie von Todd Yandell, MD5 ist wahrscheinlich schnell genug. Wenn nicht, können Sie etwas noch schneller durch die Verwendung eines 32-Bit- oder 64-Bit- CRC erhalten für Ihre Prüfsumme. Der wesentliche Unterschied besteht darin, dass jeder kann ein neues Bild mit dem gleichen CRC bilden; es ist sehr leicht zu fälschen. Es ist ziemlich schwer für jemand ein MD5-Prüfsumme zu fälschen. Ein kleiner Unterschied besteht darin, dass der CRC viele wenige Bits hat, aber wenn Sie eine sehr große Anzahl von Bildern haben, eine Kollision ist noch unwahrscheinlich.

exiftool Ansprüche der Lage sein, das binäre Bild zu extrahieren aus eine JPEG-Datei, so dass Sie Ihre Prüfsumme ohne Dekomprimierung berechnen können, aber ich kann nicht von der man-Seite herausfinden, wie es zu tun.

Ich habe einige Experimente an einem Laptop Intel Core 2 Duo L7100 CPU und eine 8MP JPEG dauert etwa 1 Sekunde bis Kompresse auf PPM-Format, dann noch 1 Sekunde, um die Prüfsumme zu tun. Checksum Zeiten waren nicht dramatisch anders mit md5sum, sum und sha1sum. So Ihre beste Wette ohne Dekomprimierung die binären Daten extrahieren könnte sein, einen Weg zu finden.

Ich stelle auch fest, dass Ihre Prüfsumme fast so gut sein werden, auch wenn es weit weniger Pixel verwendet. Vergleichen Sie diese beiden:

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

Sie sollten, dass jemand betrachten kann das Bild beschneiden oder die Palette, Farbtiefe oder etwas zu ändern, dann eine flache Prüfsumme wird anders sein, auch wenn optisch das Original und das modifizierte Bild noch hübsch aussehen sehr ähnlich. Vielleicht gibt es einen effektiven Algorithmus für beschnittene oder Re-farbig diejenigen, wie Google Bilder Anwendungen für ähnliche Bilder zu suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top