Finden Sie doppelte Bilder in verschiedenen Größen

9

Ich frage mich, ob es einen bereits existierenden Algorithmus / eine Bibliothek / ein Framework gibt, um zwei Bilder zu vergleichen, um zu sehen, ob es sich bei der einen um eine redimensionierte Version des anderen handelt? Die Programmiersprache spielt in diesem Stadium keine Rolle.

Wenn da draußen nichts ist, müsste ich etwas aufschreiben. Woran ich bisher gedacht habe:

  • (Teuer) Ändern Sie die Größe auf die kleinere Größe und vergleichen Sie Pixel für Pixel.

  • Besser noch, skalieren Sie einfach ein paar zufällige "Bereiche" auf dem Bild und vergleichen Sie. Wenn sie übereinstimmen, konvertieren Sie mehr, usw. ...

  • Brechen Sie das Bild in eine Reihe von Zeilen und Spalten und führen Sie eine Art Paritätsrechnung für die Farbwerte durch.

Das Problem, das ich besonders bei den ersten beiden Ideen sehe, ist, dass es verschiedene Möglichkeiten gibt, ein Bild an erster Stelle zu skalieren, so dass die Mathematik wahrscheinlich nicht gleich funktionieren wird. Einige Größenanpassungen fügen Unschärfe usw. hinzu.

Wenn mich jemand auf eine gute Literatur zu diesem Thema hinweisen könnte, wäre das großartig. Mein Googeln stellt meistens Shareware-Anwendungen dar, was ich nicht will.

Das Ziel ist, dies auf der Rückseite eines Webservers laufen zu lassen.

    
VaporwareWolf 26.10.2012, 17:28
quelle

2 Antworten

2

Der beste Ansatz hängt von den Eigenschaften der Bilder ab, die Sie vergleichen. Wie viel Prozent der Wahrscheinlichkeit ist es, dass die Bilder gleich sind und wenn sie unterschiedlich sind, sind sie typischerweise sehr weit entfernt oder könnten so klein wie sein ein einzelner Pixelunterschied?

Wenn die obigen Antworten lauten, dass die Bilder, die Sie vergleichen müssen, völlig zufällig sind, dann ist es vielleicht die beste Lösung, mit der teuren Lösung zu gehen oder ein verfügbares Paket.

Wenn Sie wissen, dass die Bilder meistens anders sind, und dass die Bilder in der Regel sehr unterschiedlich sind, und Sie wirklich eine Lösung von Hand erstellen möchten, können Sie einige schnelle Schritte durchführen wäre weniger teuer und das würde schnell eine Menge der Fälle identifizieren, in denen die Bilder unterschiedlich sind.

Sie könnten zum Beispiel das größere Bild vergrößern und dann entweder pixelweise (oder berechnen Sie einen Hash der Pixelwerte) nur eine "diagonale Linie" des Bildes (von oben links nach unten rechts) und nach Dadurch werden unterschiedliche Bilder ausgeschlossen und nur der teurere Vergleich für diejenigen, die diesen Test bestehen, durchgeführt.

Oder nehmen Sie eine voreingestellte Anzahl von Punkten bei einer "guten Verteilung", abhängig vom Bildtyp, und führen Sie nur den teureren Vergleich für diejenigen durch, die diesen Test bestehen.

Wenn Sie eine Menge über die Bilder wissen, die Sie vergleichen werden, haben sie bekannte Eigenschaften und sie sind häufiger verschieden als sie gleich sind, die Implementierung eines billigen "schnellen Eliminierungsvergleichs" entlang der obigen Linien könnte sich lohnen.

    
user469104 26.10.2012 18:56
quelle
1

Sie müssen dafür in den dHash-Algorithmus schauen.

Ich habe eine reine Java-Bibliothek nur für diese paar Tage geschrieben. Sie können es mit dem Verzeichnispfad (einschließlich Unterverzeichnis) füttern und es werden die doppelten Bilder in der Liste mit dem absoluten Pfad aufgeführt, den Sie löschen möchten. Alternativ können Sie damit auch alle eindeutigen Bilder in einem Verzeichnis finden.

Es hat intern awt api verwendet, kann also nicht für Android verwendet werden. Da imageIO Probleme hat, viele neue Arten von Bildern zu lesen, verwende ich zwölf Affen, die intern verwendet werden.

Ссылка

Jar mit intern gebündelten Abhängigkeiten kann heruntergeladen werden von Ссылка

Die API kann auch unter Bildern verschiedener Größen Duplikate finden.

    
Abhishek Anand 26.01.2016 17:45
quelle

Tags und Links