Ich habe zwei verschiedene Bilder:
und
Wie Sie sehen können, sind die beiden aus menschlicher Sicht eindeutig "gleich". Jetzt möchte ich programmgesteuert feststellen, dass sie gleich sind. Ich habe Bildmagie über den Rubinstein verwendet, der rmagick
so heißt:
img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first
img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first
if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images
puts "they are the same!!!"
end
Dies funktioniert zwar gut für Bilder mit demselben Verhältnis / Zuschneiden, ist jedoch nicht ideal, wenn sie geringfügig unterschiedlich beschnitten sind und auf die gleiche Breite angepasst wurden.
Gibt es eine Möglichkeit, dies für Bilder mit unterschiedlichem Zuschneiden zu tun? Ich interessiere mich für eine Lösung, bei der ich etwas sagen kann wie: Ein Bild ist im anderen enthalten und deckt etwa 90% davon ab.
PS. Ich kann die Bilder in höherer Auflösung bekommen, wenn das hilft (zB das Doppelte)
quelle
compare
Befehlszeilentool von ImageMagick verfügt über einen-subimage-search
Schalter.Antworten:
Vielleicht möchten Sie einen Blick auf die Funktionsübereinstimmung werfen. Die Idee ist, Features in zwei Bildern zu finden und sie abzugleichen. Diese Methode wird häufig verwendet, um eine Vorlage (z. B. ein Logo) in einem anderen Bild zu finden. Ein Merkmal kann im Wesentlichen als Dinge beschrieben werden, die Menschen in einem Bild interessant finden würden, wie z. B. Ecken oder offene Räume. Es gibt viele Arten von Merkmalerkennungstechniken. Ich empfehle jedoch, eine skaleninvariante Merkmalstransformation (SIFT) als Merkmalerkennungsalgorithmus zu verwenden. SIFT ist unveränderlich gegenüber Bildübersetzung, Skalierung, Drehung, teilweise unveränderlich gegenüber Beleuchtungsänderungen und robust gegenüber lokaler geometrischer Verzerrung. Dies scheint Ihrer Spezifikation zu entsprechen, bei der die Bilder leicht unterschiedliche Verhältnisse haben können.
In Anbetracht der beiden bereitgestellten Bilder wird hier versucht, die Funktionen mithilfe des FLANN-Feature-Matchers abzugleichen . Um festzustellen, ob die beiden Bilder gleich sind, können wir sie auf einen vorgegebenen Schwellenwert stützen, der die Anzahl der Übereinstimmungen verfolgt, die den Verhältnis-Test bestehen, der in Unterscheidungsbildmerkmale aus skalierungsinvarianten Schlüsselpunkten von David G. Lowe beschrieben ist . Eine einfache Erklärung für den Test ist, dass der Verhältnis-Test prüft, ob Übereinstimmungen nicht eindeutig sind und entfernt werden sollten. Sie können ihn als Ausreißer-Entfernungstechnik behandeln. Wir können die Anzahl der Übereinstimmungen zählen, die diesen Test bestehen, um festzustellen, ob die beiden Bilder gleich sind. Hier sind die Ergebnisse der Funktionsübereinstimmung:
Die Punkte stellen alle erkannten Übereinstimmungen dar, während die grünen Linien die "guten Übereinstimmungen" darstellen, die den Verhältnis-Test bestehen. Wenn Sie den Verhältnis-Test nicht verwenden, werden alle Punkte gezogen. Auf diese Weise können Sie diesen Filter als Schwellenwert verwenden, um nur die am besten übereinstimmenden Funktionen beizubehalten.
Ich habe es in Python implementiert, ich bin nicht sehr vertraut mit Rails. Hoffe das hilft, viel Glück!
Code
quelle
Da ImageMagick sehr alt, fortschrittlich und mit vielen Funktionen ausgestattet ist, ist es schwierig, eine Benutzeroberfläche zu erstellen, die die meisten Funktionen abdeckt. So großartig es auch ist, rmagick deckt nicht alle Funktionen ab (und auch nicht die vielen Versuche, die Python unternommen hat).
Ich stelle mir für viele Anwendungsfälle vor, dass es sicher genug und viel einfacher ist, einfach eine Befehlszeilenmethode auszuführen und daraus zu lesen. In Rubin sieht das so aus;
Ich werde wichtige Dinge behandeln und dann über zusätzliche Notizen sprechen.
Der Befehl verwendet magick compare, um zu überprüfen, ob das zweite Bild (
small
) ein Teilbild des ersten (large
) ist. Diese Funktion überprüft nicht, ob klein streng kleiner als groß ist (sowohl Höhe als auch Breite). Die Zahl, die ich für die Ähnlichkeit angegeben habe, ist 0,2 (20% Fehler), und der Wert für die von Ihnen bereitgestellten Bilder beträgt ungefähr 0,15. Vielleicht möchten Sie dies fein abstimmen! Ich finde, dass Bilder, die eine strenge Teilmenge sind, weniger als 0,01 erhalten.stderr
undstdout
ist nicht "notwendig", aber du sollst.quelle
Holen Sie sich das Histogramm beider Bilder und vergleichen Sie sie. Dies würde für Crop und Zoom sehr gut funktionieren, es sei denn, es gibt aufgrund dieser zu drastische Änderungen.
Dies ist besser als der derzeitige Ansatz, bei dem Sie die Bilder direkt subtrahieren. Dieser Ansatz hat jedoch noch wenige.
quelle
Normalerweise hat der Vorlagenabgleich in diesen Situationen ein gutes Ergebnis. Der Vorlagenabgleich ist eine Technik zum Auffinden von Bereichen eines Bildes, die mit einem Vorlagenbild (zweites Bild) übereinstimmen (ähnlich sind). Dieser Algorithmus gibt eine Punktzahl für die beste Position im Quellbild (die zweite).
In opencv mit der Methode TM_CCOEFF_NORMED wird die Punktzahl zwischen 0 und 1 angegeben. Wenn die Punktzahl 1 ist, bedeutet dies, dass das Vorlagenbild genau ein Teil (Rect) des Quellbilds ist, wenn Sie jedoch eine geringfügige Änderung der Beleuchtung oder Perspektive dazwischen haben Bei den beiden Bildern wäre die Punktzahl niedriger als 1.
Wenn Sie nun einen Schwellenwert für die Ähnlichkeitsbewertung berücksichtigen, können Sie herausfinden, ob sie gleich sind oder nicht. Dieser Schwellenwert kann durch Ausprobieren einiger Beispielbilder ermittelt werden. Ich habe deine Bilder ausprobiert und die Punktzahl 0,823863 erhalten . Hier ist der Code (opencv C ++) und der gemeinsame Bereich zwischen den beiden Bildern, der durch das Matching erhalten wird:
quelle
Betrachten Sie die Methode find_similar_region . Verwenden Sie das kleinere der beiden Bilder als Zielbild. Probieren Sie verschiedene Werte für die Fuzz-Attribute auf dem Bild und dem Zielbild aus.
quelle