Frage

Ich möchte vergleichen, einen screenshot von einer Anwendung (könnte eine Web-Seite) mit einem zuvor aufgenommenen screenshot zu bestimmen, ob die Anwendung zeigt sich korrekt.Ich will nicht eine genaue übereinstimmung Vergleich, weil der Aspekt könnte etwas anders sein (im Fall einer Web-app, abhängig vom browser, einige element könnte in einer etwas anderen Lage).Es sollte geben ein Maß dafür, wie ähnlich sind sich die screenshots.

Gibt es eine Bibliothek / tool, das bereits tut?Wie würden Sie das umsetzen?

War es hilfreich?

Lösung

Dies hängt ganz davon ab, wie klug Sie möchten, dass der Algorithmus zu werden.

Zum Beispiel sind hier einige Fragen:

  • Bilder vs.ein nicht freigestelltes Bild
  • Bilder mit text Hinzugefügt vs.ein anderes ohne
  • gespiegelte Bilder

Der einfachste und einfachste Algorithmus Ich habe gesehen, denn dies ist einfach zu tun die folgenden Schritte, um jedes Bild:

  1. skalieren, um etwas kleines, wie 64x64 oder 32x32, ignorieren Sie Seitenverhältnis, verwenden Sie eine Kombination von Skalierung-Algorithmus anstelle des nächsten pixel
  2. skalieren Sie die Farbe reicht, so dass die dunkelsten ist schwarz und die hellsten weiß
  3. drehen und spiegeln Sie das Bild so ein, dass die lighest Farbe ist oben Links und dann oben rechts neben dunkler, unten Links neben dunkler (soweit natürlich möglich)

Bearbeiten Ein die Kombination von Skalierung Algorithmus ist eine, bei der Skalierung von 10 Pixel nach unten zu tun es mit eine Funktion, die die Farbe von allen, die die 10 Pixel und kombiniert Sie zu einem.Kann getan werden, mit algorithmen wie Mittelwertbildung, Mittelwert, oder komplexere wie der bikubischen splines.

Dann berechnen Sie die mittlere Entfernung von Pixeln zwischen den beiden Bildern.

Um eine mögliche übereinstimmung in einer Datenbank speichern, die pixel-Farben als einzelne Spalten in der Datenbank, index, ein paar von Ihnen (aber nicht alle, es sei denn, Sie verwenden ein sehr kleines Bild), und führen Sie eine Abfrage, die verwendet einen Bereich für jeden pixel-Wert, dh.jedes Bild, wo die pixel in das kleine Bild ist zwischen -5 und +5 von dem Bild, das Sie nachschlagen möchten.

Dies ist einfach zu implementieren, und ziemlich schnell laufen, aber natürlich nicht handhaben, die meisten erweiterte Unterschiede.Dafür benötigen Sie viel mehr erweiterte algorithmen.

Andere Tipps

Die "klassische" Art und Weise zu Messen, diese zu brechen, das Bild bis in eine kanonische Anzahl der Abschnitte (sagen wir ein 10x10-raster) und dann computing ein Histogramm, RGB-Werte, die innerhalb jeder Zelle und vergleichen Sie die entsprechenden Histogramme.Diese Art von Algorithmus wird bevorzugt, weil sowohl seine Einfachheit und es ist Invarianz zu skalieren und (kleine!) übersetzung.

Verwenden Sie ein normierter Farbe Histogramm.(Lesen Sie den Abschnitt Anwendungen hier), Sie sind Häufig in Bild-retrieval - /matching-Systeme und sind eine standardisierte Möglichkeit, den passenden Bildern, ist sehr zuverlässig, relativ schnell und sehr einfach zu implementieren.

Im wesentlichen ein Farb-Histogramm erfasst die Farbverteilung des Bildes.Diese kann dann im Vergleich mit anderen Bild zu sehen, wenn die Farbe Distributionen übereinstimmen.

Diese Art von matching ist ziemlich resiliant scaling (sobald das Histogramm ist normalisiert) und rotation/Verschiebung/Bewegung etc.

Vermeiden pixel-by-pixel-Vergleiche als wenn das Bild gedreht/leicht verschoben, es können führen zu einem großen Unterschied berichtet.

Histogramme wäre einfach zu selbst erzeugt (vorausgesetzt, Sie können erhalten Zugang zu die pixel-Werte), aber wenn Sie nicht Lust haben, die OpenCV die Bibliothek ist eine großartige Ressource für diese Art von Sachen. Hier ist eine powerpoint-Präsentation, die zeigt, wie Sie erstellen Sie ein Histogramm mit OpenCV.

Nicht-video-encoding-algorithmen wie MPEG berechnen Sie die Differenz zwischen jedem frame eines Videos so können Sie nur codieren, die delta?Vielleicht schauen Sie zu, wie video-encoding-algorithmen berechnen diejenigen, die frame-Unterschiede.

Blick auf das open-source-Bild-such-Anwendung http://www.semanticmetadata.net/lire/.Es beschreibt mehrere Bild ähnlichkeit algorighms, von denen drei von der MPEG-7 standard:ScalableColor, ColorLayout, EdgeHistogram und "Auto-Farbe" Correlogram.

Sie könnten einen rein mathematischen Ansatz O(n^2), aber es wird nützlich sein, nur, wenn Sie sicher sind, dass es keine offset-oder so etwas wie, dass.(Obwohl, dass, wenn Sie ein paar Gegenstände mit homogener Färbung, es wird immer noch ziemlich gut funktionieren.)

Trotzdem, die Idee ist die Berechnung der normalisierten dot-Produkt von zwei Matrizen.C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Diese Formel ist eigentlich die "Cosinus" des Winkels zwischen den Matrizen (wierd).Je größer die ähnlichkeit (können sagen, Pij=Qij), C-1, und wenn Sie sind völlig Verschieden, sagen wir, für jeden i,j Qij = 1 (Vermeidung von null-division), Pij = 255, dann für Größe nxn, die größer n werden, der näher an null wir werden Holen Sie.(Durch überschlagsrechnung: C=1/n^2).

Du wirst brauchen pattern recognition für, dass.Bestimmen kleine Unterschiede zwischen zwei Bildern, Hopfield-Netze funktioniert ziemlich gut und sind Recht einfach zu implementieren.Ich weiß nicht, alle verfügbaren Implementierungen, obwohl.

Ein ruby-Lösung gefunden hier

Aus der readme:

Phashion ist ein Ruby-wrapper für die pHash Bibliothek "perceptual hash", die erkennt, duplizieren und in der Nähe von multimedia-Dateien zu duplizieren

Wie zu Messen der ähnlichkeit zwischen zwei Bildern ganz hängt davon ab, was Sie möchten, nach Maß, zum Beispiel:Kontrast, Helligkeit, Modalität, Lärm...und wählen Sie dann die am besten geeigneten ähnlichkeit Maß es für Sie.Sie können wählen aus MAD (mittlere absolute Differenz), MSD (mean squared difference), die gut sind für die Messung der Helligkeit...es gibt auch verfügbar CR (correlation coefficient), die gut in der Vertretung der Korrelation zwischen zwei Bildern.Sie können auch wählen, von der Histogramm-basierte ähnlichkeit Maßnahmen wie SDH (Standardabweichung der Differenz Histogramm) oder Multimodalität ähnlichkeit Maßnahmen wie MI (mutual information) oder NMI (normalisierte gegenseitige Informationen).

Da diese ähnlichkeit Maßnahmen Kosten viel Zeit, es wird empfohlen, skalieren Sie die Bilder nach unten vor der Anwendung dieser Maßnahmen auf Sie.

Ich Frage mich (und ich bin wirklich einfach das werfen der Idee heraus, dort abgeschossen werden), wenn etwas abgeleitet werden könnte, indem man das eine Bild von der anderen, und dann komprimieren Sie das resultierende Bild als jpeg-gif, und wobei die Größe der Datei, die als ein Maß für die ähnlichkeit.

Wenn Sie zwei identische Bilder, die Sie bekommen würde, eine weiße box, die würde komprimieren wirklich gut.Je mehr die Bilder unterschieden sich, je komplexer es wäre zu vertreten, und damit die weniger komprimierbar.

Vermutlich nicht die ideale test, und wahrscheinlich viel langsamer als nötig, aber es könnte auch Arbeit als eine schnelle und schmutzige Implementierung.

Sie könnten den code für die open-source-tool findimagedupes, obwohl es scheint zu haben gewesen geschrieben in perl, also kann ich nicht sagen, wie einfach es sein wird, zu analysieren...

Lesen Sie die findimagedupes Seite, die ich mochte, ich sehe, dass es eine C++ - Implementierung des gleichen Algorithmus.Vermutlich ist es einfacher zu verstehen.

Und es scheint, Sie können auch verwenden gqview.

Naja, nicht zur Beantwortung Ihrer Frage direkt, aber ich habe gesehen, dass dies geschieht.Microsoft vor kurzem ein tool namens PhotoSynth die macht etwas sehr ähnliches, um zu bestimmen, überlappende Bereiche in einer großen Zahl der Bilder (was von verschiedenen Seitenverhältnissen).

Ich Frage mich, ob Sie alle verfügbaren Bibliotheken und code-snippets auf Ihren blog.

erweitern Vaibhav Hinweis, hugin ist ein open-source 'autostitcher", die sollten einen Einblick auf das problem.

Es gibt software für content-based image retrieval, die nicht (teilweise), was Sie brauchen.Alle Referenzen und Erklärungen sind im Zusammenhang von der Projekt-Website und es gibt auch einen kurzen text, Buch (Kindle): LIRE

Auch eine wirklich grundlegende Methode verwenden könnten, durch die jedes pixel in Farbe, und vergleichen Sie Sie mit den entsprechenden pixel Farbe auf dem zweiten Bild - aber das ist wohl ein sehr sehr langsam Lösung.

Wenn dies etwas ist, was werden Sie tun, auf gelegentlicher basis und muss nicht automatisieren, können Sie tun es in einem Bildbearbeitungsprogramm, das Ebenen unterstützt, wie Photoshop oder Paint Shop Pro (wohl GIMP oder Paint.Net auch, aber ich bin mir nicht sicher über diese).Öffnen Sie die beiden screenshots, und setzen Sie ein, wie eine Schicht über der anderen.Ändern der layer-blending-Modus auf "Differenz", und alles, was die gleichen zwischen die zwei schwarz geworden.Sie können verschieben der oberen Ebene um die zur Minimierung der Ausrichtung unterschieden.

Können Sie siamesische Netzwerk, um zu sehen, ob die zwei Bilder, die ähnlich oder unähnlich folgenden tutorial.Dieses tutorial cluster, die ähnliche Bilder in der Erwägung, dass die Sie verwenden können, L2 Entfernung zum Messen der ähnlichkeit von zwei Bildern.

Beyond Compare hat pixel-für-pixel-Vergleich für Bilder, z.B.,

enter image description here

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top