Ich brauche eine einfache und schnelle Möglichkeit, zwei Bilder auf Ähnlichkeit zu vergleichen. Das heißt, ich möchte einen hohen Wert erzielen, wenn sie genau dasselbe enthalten, aber möglicherweise einen etwas anderen Hintergrund haben und um einige Pixel verschoben / in der Größe geändert werden können.
(Konkreter, wenn das wichtig ist: Das eine Bild ist ein Symbol und das andere Bild ist ein Teilbereich eines Screenshots, und ich möchte wissen, ob dieser Teilbereich genau das Symbol ist oder nicht.)
Ich habe OpenCV zur Hand, aber ich bin immer noch nicht so daran gewöhnt .
Eine Möglichkeit, über die ich bisher nachgedacht habe: Teilen Sie beide Bilder in 10 x 10 Zellen und vergleichen Sie für jede dieser 100 Zellen das Farbhistogramm. Dann kann ich einen bestimmten Schwellenwert festlegen, und wenn der Wert, den ich erhalte, über diesem Schwellenwert liegt, gehe ich davon aus, dass sie ähnlich sind.
Ich habe es noch nicht ausprobiert, wie gut das funktioniert, aber ich denke, es wäre gut genug. Die Bilder sind bereits ziemlich ähnlich (in meinem Anwendungsfall), so dass ich einen ziemlich hohen Schwellenwert verwenden kann.
Ich denke, es gibt Dutzende anderer möglicher Lösungen dafür, die mehr oder weniger funktionieren würden (da die Aufgabe selbst recht einfach ist, da ich Ähnlichkeit nur erkennen möchte, wenn sie wirklich sehr ähnlich sind). Was würdest du vorschlagen?
Es gibt einige sehr verwandte / ähnliche Fragen zum Abrufen einer Signatur / eines Fingerabdrucks / eines Hash von einem Bild:
- OpenCV / SURF Wie wird aus den Deskriptoren ein Bild-Hash / Fingerabdruck / eine Signatur generiert?
- Bildfingerabdruck zum Vergleich der Ähnlichkeit vieler Bilder
- Nahezu doppelte Bilderkennung
- OpenCV: Fingerabdruckbild und Vergleich mit Datenbank .
- mehr , mehr , mehr , mehr , mehr , mehr , mehr
Außerdem bin ich auf diese Implementierungen gestoßen, die solche Funktionen haben, um einen Fingerabdruck zu erhalten:
- pHash
- imgSeek ( GitHub repo ) (GPL) basierend auf dem Papier Fast Multiresolution Image Querying
- Bildübereinstimmung . Sehr ähnlich zu dem, wonach ich gesucht habe. Ähnlich wie bei pHash, basierend auf einer Bildsignatur für jede Art von Bild, haben Goldberg et al . Verwendet Python und Elasticsearch.
- iqdb
- ImageHash . unterstützt pHash.
- Image Deduplicator (imagededup) . Unterstützt CNN, PHash, DHash, WHash, AHash.
Einige Diskussionen über Wahrnehmungsbild-Hashes: hier
Ein bisschen offtopic: Es gibt viele Methoden, um Audio-Fingerabdrücke zu erstellen. MusicBrainz , ein Webdienst, der eine auf Fingerabdrücken basierende Suche nach Songs ermöglicht, hat einen guten Überblick in seinem Wiki . Sie verwenden jetzt AcoustID . Dies dient zum Finden genauer (oder größtenteils genauer) Übereinstimmungen. Werfen Sie einen Blick auf Echoprint , um ähnliche Übereinstimmungen zu finden (oder wenn Sie nur einige Schnipsel oder ein hohes Rauschen haben) . Eine verwandte SO-Frage ist hier . Es scheint also, dass dies für Audio gelöst ist. Alle diese Lösungen funktionieren recht gut.
Eine etwas allgemeinere Frage zur Fuzzy-Suche im Allgemeinen ist hier . Zum Beispiel gibt es ortsabhängiges Hashing und die Suche nach dem nächsten Nachbarn .
Antworten:
Kann der Screenshot oder das Symbol transformiert werden (skaliert, gedreht, schief ...)? Es gibt einige Methoden auf meinem Kopf, die Ihnen möglicherweise helfen könnten:
Die meisten davon sind bereits in OpenCV implementiert - siehe zum Beispiel die cvMatchTemplate-Methode (verwendet Histogrammabgleich): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html . Die markanten Punkt- / Flächendetektoren sind ebenfalls verfügbar - siehe OpenCV Feature Detection .
quelle
Ich habe in letzter Zeit die gleichen Probleme. Um dieses Problem zu lösen (einfacher und schneller Algorithmus zum Vergleichen von zwei Bildern), trage ich ein img_hash-Modul zu opencv_contrib bei. Die Details finden Sie unter diesem Link .
Das Modul img_hash bietet sechs Bild-Hash-Algorithmen, die recht einfach zu verwenden sind.
Beispiel für Codes
Herkunft Lena
verwischen lena
Größe ändern lena
Schicht Lena
In diesem Fall liefert ColorMomentHash das beste Ergebnis
Vor- und Nachteile jedes Algorithmus
Die Leistung von img_hash ist auch gut
Geschwindigkeitsvergleich mit PHash-Bibliothek (100 Bilder von ukbench)
Wenn Sie die empfohlenen Schwellenwerte für diese Algorithmen kennen möchten, lesen Sie bitte diesen Beitrag ( http://qtandopencv.blogspot.my/2016/06/introduction-to-image-hash-module-of.html ). Wenn Sie interessiert sind, wie ich die Leistung von img_hash-Modulen messen kann (einschließlich Geschwindigkeit und verschiedener Angriffe), überprüfen Sie bitte diesen Link ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of) -opencvimghash.html ).
quelle
Enthält der Screenshot nur das Symbol? In diesem Fall kann der L2-Abstand der beiden Bilder ausreichen. Wenn die L2-Distanz nicht funktioniert, versuchen Sie im nächsten Schritt etwas Einfaches und Etabliertes wie: Lucas-Kanade . Was ich sicher bin, ist in OpenCV verfügbar.
quelle
Wenn Sie einen Index über die Ähnlichkeit der beiden Bilder erhalten möchten, empfehle ich Ihnen aus den Metriken den SSIM-Index. Es ist konsistenter mit dem menschlichen Auge. Hier ist ein Artikel darüber: Struktureller Ähnlichkeitsindex
Es ist auch in OpenCV implementiert und kann mit der GPU beschleunigt werden: OpenCV SSIM mit der GPU
quelle
Wenn Sie sicher sein können, dass Ihre Vorlage (das Symbol) genau auf den Testbereich ausgerichtet ist, funktioniert jede alte Summe von Pixelunterschieden.
Wenn die Ausrichtung nur geringfügig abweicht, können Sie beide Bilder mit cv :: GaussianBlur tiefpassieren, bevor Sie die Summe der Pixeldifferenzen ermitteln.
Wenn die Qualität der Ausrichtung möglicherweise schlecht ist, würde ich entweder ein Histogramm orientierter Verläufe oder einen der praktischen OpenCV-Algorithmen zur Erkennung / Beschreibung von Schlüsselpunkten (wie SIFT oder SURF ) empfehlen .
quelle
Wenn für identische Bilder übereinstimmen - Code für L2-Abstand
Schnell. Aber nicht robust gegenüber Änderungen der Beleuchtung / des Blickwinkels usw. Quelle
quelle
Wenn Sie das Bild auf Ähnlichkeit vergleichen möchten, empfehle ich Ihnen, OpenCV zu verwenden. In OpenCV gibt es nur wenige Feature-Matching und Template-Matching. Für die Merkmalsanpassung gibt es SURF-, SIFT-, FAST- usw. Detektor. Sie können dies verwenden, um das Bild zu erkennen, zu beschreiben und dann abzugleichen. Danach können Sie den spezifischen Index verwenden, um die Anzahl der Übereinstimmungen zwischen den beiden Bildern zu ermitteln.
quelle