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?
quelle
Antworten:
Wahrnehmungs-Hashes könnten die Antwort sein:
http://www.phash.org/
quelle
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.
quelle
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.
quelle
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.
quelle