it-swarm.dev

Woher wissen, ob zwei Bilder gleich sind?

Ich habe über 10000 Bilder, von denen etwa 2000 Duplikate in anderen Formaten sind (wie JPEG, PNG, GIF). Beide Zahlen nehmen täglich zu. Ich muss diese Duplikate löschen und dafür muss ich zuerst wissen, wie ich sie finde.

Mein erster Gedanke war, die Pixel eines Bildes zu überprüfen und andere Bilder zu finden, die die gleichen farbigen Pixel in den gleichen Koordinaten haben. Diese Option funktioniert jedoch nicht immer. Angenommen, ich suche nach einem Duplikat. Für das durchsuchbare Objekt wähle ich eine 8-Bit-PNG-Datei. Es werden alle Duplikate dieses Bildes gefunden, aber nur das 8-Bit-PNG, manchmal 8-Bit-GIF und selten JPEG (wegen der Bildalgorithmus, nehme ich an?).

Mein zweiter Gedanke war, alle diese Bilder zu duplizieren und sie in einer strengen Zweifarbenpalette (sagen wir Schwarz-Weiß) neu einzufärben und denselben Scan wie oben angegeben durchzuführen. Wiederum ist das JPEG-Bild dem PNG- oder GIF-Format nicht 100% ähnlich (der gleiche Grund wie oben?).

Der dritte Gedanke war: verringern der Prozentsatz, um wie viel das Bild vertraut sein muss, und erhöhen wie stark die Farben variieren können, was zu unerwünschter Bildentfernung führt ...

Irgendwelche Gedanken?

21
Aistis

Wahrnehmungs-Hashes können die Antwort sein:

http://www.phash.org/

Ein Wahrnehmungs-Hash ist ein Fingerabdruck einer Multimedia-Datei, die aus verschiedenen Merkmalen ihres Inhalts abgeleitet wurde. Im Gegensatz zu kryptografischen Hash-Funktionen, die auf dem Lawineneffekt kleiner Änderungen der Eingabe beruhen, die zu drastischen Änderungen der Ausgabe führen, sind Wahrnehmungs-Hashes "ähnlich" zueinander, wenn die Merkmale ähnlich sind.

17
Joe
  1. Abmessungen prüfen. Wenn verschiedene => Bilder nicht gleich sind.
  2. Überprüfen Sie die Formate. Wenn das gleiche => Führen Sie einen genauen Vergleich durch, Pixel für Pixel.
  3. Wenn verschiedene Formate dies tun:

Vergleichen Sie nicht RGB (rot, grün, blau). Vergleichen Sie die Helligkeit mit der Hälfte des Gewichts und die Farbe/den Farbton mit der anderen Hälfte (oder 2/3 gegenüber 1/3). Berechnen Sie die Wertedifferenz und je nach Toleranzwert sind sie gleich oder nicht.

JPEG komprimiert die Farbinformationen stark, versucht jedoch, die Begrenzungswerte nicht zu ruinieren.

9
Boris Yankov

Als ich vor einigen Jahren eine Reihe von Bildern auf Dupes untersuchte, stellte ich fest, dass es ziemlich gut funktionierte, alles auf 8 x 8 Miniaturansichten zu reduzieren und dann eine Ähnlichkeitsbewertung basierend auf dem Quadrat des Abstands (wobei die drei Farben getrennt behandelt wurden) zwischen den Miniaturansichten zu berechnen. Beachten Sie, dass Sie eine MENGE von 8x8 Miniaturansichten im Speicher halten können.

Praktisch alle Dupes erzielten weniger Punkte als die Nicht-Dupes. Die einzigen Probleme waren einige Bilder, die sehr kontrastarm und insgesamt ähnlich waren, obwohl der tatsächliche Inhalt variierte (der Hintergrund war jeweils Strandsand).

Dies war auch effektiv beim Auffangen von Bildern, bei denen es sich um Dupes handelte, außer dass jemand die Auflösung oder Qualität eines Bildes verringert hatte, um die Dateigröße zu verringern.

6
Loren Pechtel

Vielleicht sollten Sie einen Code schreiben, der die Bilder auf Ähnlichkeit überprüft. Sie können alle Bilder in das ARGB-Format konvertieren und vergleichen. (in Erinnerung)

Ein möglicher Ansatz könnte folgendermaßen sein: Teilen Sie die Bilder in Zonen. Scannen Sie die durchschnittliche Farbe und/oder Helligkeit der Zonen, um zwei Bilder auf Ähnlichkeit zu vergleichen.

Wenn mehr als 90% der Zonen übereinstimmen, haben Sie eine ausgewählt, um zur Liste der Löschkandidaten zu gelangen. Auf diese Weise haben Sie eine Liste von Kandidaten. Sie können das Seitenverhältnis der Bilder verwenden, um die Bilder in horizontale und vertikale Bilder zu kategorisieren und Vergleiche zu beschleunigen. Auf diese Weise können Sie verlustbehaftete Algorithmen kompensieren, die Pixel für Pixel nicht die richtigen Farben wiedergeben. Sie führen das Programm über Nacht aus und am Morgen haben Sie es erledigt :) in .Net kann dies ganz einfach mit der GDI + lib durchgeführt werden.

1
Onno