Unterstützt OpenCV den Vergleich zweier Bilder und gibt einen Wert (möglicherweise einen Prozentsatz) zurück, der angibt, wie ähnlich diese Bilder sind? ZB würden 100% zurückgegeben, wenn dasselbe Bild zweimal übergeben würde, 0% würden zurückgegeben, wenn die Bilder völlig unterschiedlich wären.
Ich habe hier auf StackOverflow bereits viele ähnliche Themen gelesen. Ich habe auch ziemlich viel gegoogelt. Leider konnte ich keine zufriedenstellende Antwort finden.
image
opencv
comparison
similarity
Boris
quelle
quelle
Antworten:
Dies ist ein riesiges Thema mit Antworten aus 3 Codezeilen auf ganze Forschungsmagazine.
Ich werde die gebräuchlichsten derartigen Techniken und ihre Ergebnisse skizzieren.
Histogramme vergleichen
Eine der einfachsten und schnellsten Methoden. Vor Jahrzehnten vorgeschlagen, um Bildähnlichkeiten zu finden. Die Idee ist, dass ein Wald viel Grün und ein menschliches Gesicht viel Rosa oder was auch immer haben wird. Wenn Sie also zwei Bilder mit Wäldern vergleichen, werden Sie einige Ähnlichkeiten zwischen Histogrammen feststellen, da Sie in beiden viel Grün haben.
Vorlagenübereinstimmung
Ein gutes Beispiel hier matchTemplate, um eine gute Übereinstimmung zu finden . Es faltet das Suchbild mit dem, in dem gesucht wird. Es wird normalerweise verwendet, um kleinere Bildteile in einem größeren zu finden.
Feature Matching
Wird als eine der effizientesten Methoden zur Bildsuche angesehen. Eine Reihe von Merkmalen wird aus einem Bild so extrahiert, dass garantiert wird, dass dieselben Merkmale auch dann wieder erkannt werden, wenn sie gedreht, skaliert oder verzerrt werden. Die auf diese Weise extrahierten Features können mit anderen Bildfeaturesätzen verglichen werden. Bei einem anderen Bild, bei dem ein hoher Anteil der Merkmale mit dem ersten übereinstimmt, wird dieselbe Szene dargestellt.
Wenn Sie die Homografie zwischen den beiden Punktsätzen finden, können Sie auch den relativen Unterschied im Aufnahmewinkel zwischen den Originalbildern oder den Überlappungsgrad ermitteln.
Drüben auf der OpenCV-Q & A- Site spreche ich über den Unterschied zwischen Feature-Deskriptoren, die beim Vergleich ganzer Bilder großartig sind, und Textur-Deskriptoren, mit denen Objekte wie menschliche Gesichter oder Autos in einem Bild identifiziert werden.
quelle
absdiff
codota.com/code/java/methods/org.opencv.core.Core/absdiff Thresholding das Ergebnis Erstellt eine Maske, mit der Sie die Bereiche hervorheben können, die sich von Szene zu Szene geändert haben.Wenn zum Abgleichen identischer Bilder (gleiche Größe / Ausrichtung)
Quelle
quelle
Sams Lösung sollte ausreichen. Ich habe eine Kombination aus Histogrammdifferenz und Vorlagenabgleich verwendet, da in 100% der Fälle nicht eine Methode für mich funktioniert hat. Ich habe der Histogrammmethode jedoch weniger Bedeutung beigemessen. Hier ist, wie ich in einem einfachen Python-Skript implementiert habe.
quelle
Ein wenig abseits des Themas, aber nützlich ist der pythonische
numpy
Ansatz. Es ist robust und schnell, vergleicht jedoch nur Pixel und nicht die Objekte oder Daten, die das Bild enthält (und es erfordert Bilder gleicher Größe und Form):Ein sehr einfacher und schneller Ansatz, um dies ohne openCV und jede Bibliothek für Computer Vision zu tun, besteht darin, die Bildarrays nach zu normieren
Nachdem Sie beide normierten Bilder (oder Matrizen) definiert haben, können Sie einfach die Multiplikation der Bilder summieren, die Sie vergleichen möchten:
1) Wenn Sie ähnliche Bilder vergleichen, ergibt die Summe 1:
2) Wenn sie nicht ähnlich sind, erhalten Sie einen Wert zwischen 0 und 1 (ein Prozentsatz, wenn Sie mit 100 multiplizieren):
Bitte beachten Sie, dass Sie bei farbigen Bildern dies in allen drei Dimensionen tun oder einfach eine Graustufenversion vergleichen müssen. Ich muss oft große Mengen von Bildern mit beliebigen Inhalten vergleichen, und das ist ein sehr schneller Weg.
quelle