Woher wissen, ob zwei Bilder gleich sind? [geschlossen]


20

Ich habe über 10000 Bilder, von denen etwa 2000 in anderen Formaten (wie JPEG, PNG, GIF) dupliziert wurden. 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, ein Bild Pixel 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. Als durchsuchbares 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 algorithmischen Bilder, nehme ich an?).

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

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

Irgendwelche Gedanken?



Formate mit verlustbehafteter Komprimierung führen zu Bildern, die nicht zu 100% mit verlustfreien Versionen identisch sind. Benötigen Sie ein Kommandozeilenprogramm oder können Sie ein GUI-Programm ausführen, das Vorschläge macht und dann Bilder mit> 90% ähnlichen Pixeln anzeigt (berechnen Sie eine durchschnittliche Abweichung)? (und natürlich Pixelgrße sollte in jedem Format identisch sein)
thorsten Müller


1
Wie viele haben den gleichen Dateinamen, aber unterschiedliche Endung?
JeffO

4
Nützliche Antwort, die keine wochenlange Codierung erfordert: stackoverflow.com/questions/596262/…
mac

Antworten:


17

Wahrnehmungs-Hashes könnten die Antwort sein:

http://www.phash.org/

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


9
  1. Maße prüfen. Wenn anders => Bilder sind nicht gleich.
  2. Überprüfen Sie die Formate. Ist das Gleiche => Führen Sie einen präzisen Vergleich Pixel für Pixel durch.
  3. Wenn verschiedene Formate dies tun:

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

JPEG komprimiert die Farbinformationen stark, versucht jedoch, die Liminanzwerte nicht zu beeinträchtigen.


6

Als ich vor einigen Jahren eine Reihe von Bildern auf Dupes durchsuchte, stellte ich fest, dass es ziemlich gut funktionierte, alles auf 8 x 8 Miniaturbilder zu reduzieren und dann einen Ähnlichkeitswert basierend auf dem Quadrat des Abstands (die drei Farben getrennt zu behandeln) zwischen den Miniaturbildern zu berechnen. Beachten Sie, dass Sie VIELE 8x8 Thumbnails im Speicher haben können.

Praktisch alle Dupes wurden unterhalb der Nicht-Dupes bewertet, wobei die einzigen Probleme darin bestanden, dass einige Bilder sehr kontrastarm und insgesamt ähnlich waren, obwohl der tatsächliche Inhalt variierte (der Hintergrund war jeweils Strandsand).

Auf diese Weise konnten auch Bilder abgefangen werden, 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.


1
YUV ist in der Regel besser als RGB und reagiert weniger empfindlich auf geringfügige Änderungen der Farbbalance.
Martin Beckett

Diese Technik der Miniaturansichten zur Vorauswahl möglicher Übereinstimmungen ist gültig. YUV ist eine nette Geste, und ich habe gesehen, dass sie aus denselben Gründen zu einer reinen Luminanzkarte geworden ist.
Patrick Hughes

@Martin Beckett: Die Summe der Quadrate der RGB-Differenz war das erste, was ich ausprobiert habe, und es hat gut genug funktioniert, dass ich nicht versucht habe, es zu verbessern. Mit einer strengen Definition von Dupe war es gut genug, dass ich es automatisch löschen lassen hätte.
Loren Pechtel

@Loren, wenn es sich um geringfügige Pixelbearbeitungen desselben Bildes handelt, die funktionieren sollten. Es ist nur so, dass Dinge wie JPEG RGB mehr durcheinander bringen als ein YUV-Farbraum. Nur ein Tipp ;-)
Martin Beckett

Sehr dunkle Bilder haben naturgemäß eine geringere Summe von Quadraten der Unterschiede, auch wenn sie sich überhaupt nicht ähneln. Die Schwelle kann mit der durchschnittlichen Helligkeit des Bildes angepasst werden. Ich benutze diese durchschnittliche Leuchtkraft als Vorfilter, um O (n ^ 2) Bildvergleiche zu vermeiden. Sie ist also bereits vorhanden.
Gabriel vor

1

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 aussehen: Unterteilen 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 wechseln. Auf diese Weise haben Sie eine Kandidatenliste. 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 nicht pixelgenau die richtigen Farben reproduzieren. Sie führen das Programm über Nacht aus und morgens haben Sie es geschafft :) in .Net ist dies mit der GDI + lib recht einfach möglich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.