2008-09-16 12 views
69

Ich brauche einen Algorithmus, der bestimmen kann, ob zwei Bilder "ähnlich" sind und ähnliche Muster von Farbe, Helligkeit, Form usw. erkennen. Ich brauche vielleicht ein paar Hinweise, welche Parameter das menschliche Gehirn benutzt. kategorisieren 'Bilder. ..Algorithmus zum Finden ähnlicher Bilder

Ich habe auf Hausdorff basierte Matching geschaut, aber das scheint hauptsächlich für passende transformierte Objekte und Muster der Form.

+0

Es gibt einige gute Antworten auf diese ähnliche Frage: http://stackoverflow.com/questions/25977/how-can-i-measure-the-similarity-between-two-images – blak

+0

a Viele "Könner" und "Könner". Jeder versucht all diese Vorschläge und weiß, was das Beste ist? –

+0

Es ist eine Weile her, dass ich Computer Vision tat, aber Matlab Check-out, es gibt einige gute Funktionen gibt es in Bilder zu analysieren und dann die Ähnlichkeit der resultierenden Matrizen zu vergleichen, basierend auf verschiedenen Metriken für Ihren Vergleich. – Mason

Antwort

53

Ich habe etwas ähnliches getan, indem Sie Bilder in Signaturen mit wavelet transform zerlegen.

Mein Ansatz bestand darin, die wichtigsten n Koeffizienten aus jedem transformierten Kanal auszuwählen und deren Position aufzuzeichnen. Dies wurde getan, indem die Liste der (Potenz-, Orts-) Tupel nach abs (Potenz) sortiert wurde. Ähnliche Bilder werden Ähnlichkeiten aufweisen, da sie an denselben Stellen signifikante Koeffizienten haben.

Ich fand es am besten, in das Bild in YUV-Format zu transformieren, das effektiv Ähnlichkeit in Form (Y-Kanal) und Farbe (UV-Kanäle) ermöglicht.

Sie können in meiner Umsetzung der oben in mactorii finden, die habe ich leider nicht so viel gearbeitet wie ich :-)

Eine andere Methode haben sollte, die einige Freunde von mir mit überraschend verwendet haben gute Ergebnisse, ist einfach zu verkleinern Sie Ihr Bild nach unten, sagen, ein 4x4 Pixel und speichern, die Ihre Unterschrift sind. Wie ähnlich 2 Bilder sind, kann z. B. durch Berechnen der Manhattan distance zwischen den 2 Bildern unter Verwendung entsprechender Pixel ermittelt werden. Ich habe nicht die Details, wie sie die Größenänderung durchgeführt haben, also müssen Sie vielleicht mit den verschiedenen Algorithmen, die für diese Aufgabe verfügbar sind, spielen, um eine passende zu finden.

+6

Die Resize-4x4-Methode ist eine wunderbare Idee (nicht, dass Ihre Methode ist auch nicht so toll), aber die erste ist einfacher. –

+0

@freespace, könnten Sie bitte erklären dies „Berechnung der Manhattan-Abstand zwischen den Bildern 2, entsprechenden Pixel mit“ – Ambika

+0

@Ambika: die Farbe jedes Pixels als ein Vektor der Länge 3, behandeln und die Manhattan-Distanz zwischen den entsprechenden Pixeln in dem Rechen Bilder werden verglichen. Das gibt Ihnen 4 Manhattan Entfernungen. Wie Sie daraus eine einzelne Kennzahl ableiten, liegt bei Ihnen. Am offensichtlichsten ist es, sie zusammenzufassen. – freespace

1

Sie könnten eine Art Block-Matching-Bewegungsschätzung zwischen den beiden Bildern durchführen und die Gesamtsumme der Residuen und Bewegungsvektorkosten messen (ähnlich wie bei einem Videoencoder). Dies würde die Bewegung kompensieren; für Bonuspunkte, affine-Transformation Bewegungsschätzung (kompensiert Zooms und Stretching und ähnliches). Sie könnten auch überlappende Blöcke oder optischen Fluss machen.

4

könnten Sie verwenden Perceptual Image Diff

Es ist ein Kommandozeilen-Utility, die zwei Bilder unter Verwendung eines Wahrnehmungsmetrik vergleicht. Das heißt, es verwendet ein Rechenmodell des menschlichen visuellen Systems, um zu bestimmen, ob zwei Bilder visuell unterschiedlich sind, so dass kleine Änderungen in Pixeln ignoriert werden. Darüber hinaus wird die Anzahl falsch positiver Ergebnisse drastisch reduziert, die durch Unterschiede bei der Generierung von Zufallszahlen, Betriebssystemen oder Maschinenarchitekturen verursacht werden.

1

Als Erstes können Sie Farbhistogramme verwenden. Sie müssen jedoch Ihre Problemdomäne wirklich eingrenzen. Generischer Bildvergleich ist ein sehr schweres Problem.

4

Es ist ein schwieriges Problem! Es hängt davon ab, wie genau Sie sein müssen, und es hängt davon ab, mit welcher Art von Bildern Sie arbeiten. Sie können Histogramme zum Vergleichen von Farben verwenden, aber das berücksichtigt natürlich nicht die räumliche Verteilung dieser Farben innerhalb der Bilder (d. H. Die Formen). Kantenerkennung, gefolgt von irgendeiner Art von Segmentierung (d. H. Auswählen der Formen) kann ein Muster zum Vergleichen mit einem anderen Bild bereitstellen. Sie können Kookrenzmatrizen verwenden, um Texturen zu vergleichen, indem Sie die Bilder als Matrizen von Pixelwerten betrachten und diese Matrizen vergleichen. Es gibt ein paar gute Bücher über Image Matching und Machine Vision - Eine Suche bei Amazon findet mancher.

Hoffe, das hilft!

0

Es gibt einige gute Antworten in dem anderen Thread zu diesem Thema, aber ich frage mich, ob etwas mit einer Spektralanalyse funktionieren würde? Das heißt, brechen Sie das Bild auf seine Phasen- und Amplitudeninformationen herunter und vergleichen Sie diese. Dies kann einige der Probleme beim Beschneiden, Transformieren und Intensitätsunterschieden vermeiden. Wie auch immer, ich spekuliere nur, weil dies ein interessantes Problem zu sein scheint. Wenn Sie nach http://scholar.google.com gesucht haben, sind Sie sicher, dass Sie mehrere Papiere dazu finden könnten.

+0

Spektralanalyse ist mit Fourier-Transformation, gibt es kein Farb-Histogramm, da Sie das Bild aus den beiden Teilen - imaginär und real rekonstruieren können. (Ich weiß nicht, ob es funktionieren wird, lass dich einfach wissen, dass es nicht in dieser Kategorie ist). – nlucaroni

+0

Ja, eine Fourier-Transformation ist das, was ich meinte. – dbrien

2

Das klingt wie ein Sehproblem. Vielleicht möchten Sie sich den Adaptive Boosting und den Burns Line Extraction Algorithmus ansehen. Die Konzepte in diesen beiden sollten helfen, dieses Problem anzugehen. Kantenerkennung ist ein noch einfacherer Startpunkt, wenn Sie mit Bildverarbeitungsalgorithmen noch nicht vertraut sind, da dies die Grundlagen erklärt.

Soweit Parameter für Kategorisierung:

  • Farbpalette & Ort (Gradient Berechnung, Histogramm der Farben)
  • Enthalten Formen (Ada Boosting/Training Formen zu erkennen.)
2

Abhängig davon, wie viele genaue Ergebnisse Sie benötigen, können Sie die Bilder in nxn-Pixel-Blöcken einfach aufteilen und analysieren.Wenn Sie im ersten Block andere Ergebnisse erhalten, können Sie die Verarbeitung nicht anhalten, was zu einigen Leistungsverbesserungen führt.

Für die Analyse der Quadrate können Sie beispielsweise die Summe der Farbwerte erhalten.

3

Es bezieht sich die Forschung mit Kohonen neuronale Netze/selbstorganisierenden Karten

Both mehr akademische Systeme (Google für PicSOM) oder weniger akademische
(http://www.generation5.org/content/2004/aiSomPic.asp, (eventuell nicht geeignet für alle Arbeits enviroments)) Präsentationen existieren .

11

Ich habe SIFT verwendet, um das gleiche Objekt in verschiedenen Bildern wieder zu erkennen. Es ist wirklich mächtig, aber ziemlich komplex und könnte übertrieben sein. Wenn die Bilder ziemlich ähnlich sein sollen, können einige einfache Parameter, die auf dem Unterschied zwischen den beiden Bildern basieren, ziemlich viel sagen. Einige Hinweise:

  • Normalisieren die Bilder der durchschnittliche Helligkeit der beiden Bilder machen, dh die gleichen, indem die durchschnittliche Helligkeit beide Berechnung und Skalierung den hellsten nach unten gemäß der Ration (zur Vermeidung von auf höchstem Niveau Clipping)) vor allem, wenn Sie sind mehr an Form als an Farbe interessiert.
  • Summe der Farbdifferenz über das normalisierte Bild pro Kanal.
  • Finden Sie Kanten in den Bildern und messen Sie den Abstand zwischen den Kantenpixeln in beiden Bildern. (für Form)
  • Teilen Sie die Bilder in einer Gruppe von einzelnen Bereichen auf und vergleichen Sie die durchschnittliche Farbe jeder Region.
  • Schwenken Sie die Bilder auf eine (oder eine Reihe von) Ebenen und zählen Sie die Anzahl der Pixel, bei denen sich die resultierenden Schwarz/Weiß-Bilder unterscheiden.
+0

Kannst du auf den Code verweisen, der siftähnliche Fetures verwendet, um Bildähnlichkeit zu berechnen? – mrgloom

+0

Es tut mir leid, ich bin mir sicher, dass es einen öffentlich verfügbaren Code gibt, aber keine, die mir bekannt ist. Es gibt einige Beispiele auf dieser Site. Zum Beispiel hier: http://stackoverflow.com/questions/5461148/sift-implementation-with-opencv-2-2 –

40

pHash könnte Sie interessieren.

Wahrnehmungs hash n. ein Fingerabdruck einer Audio-, Video- oder Bilddatei, der mathematisch auf dem darin enthaltenen Audio- oder visuellen Inhalt basiert. Im Gegensatz zu kryptografischen Hashfunktionen, die auf dem Lawineneffekt von kleinen Änderungen der Eingabe beruhen, die zu drastischen Änderungen in der Ausgabe führen, sind Wahrnehmungshashs "nah" bei einander, wenn die Eingaben visuell oder auditiv ähnlich sind.

+6

Just ausgecheckt pHash der Website.Sie haben derzeit diese Funktion auf ihrer Website, mit der Sie zwei Bilder hochladen können und es sagt Ihnen, ob sie ähnlich sind oder nicht. Ich habe ungefähr 10 Bilder ausprobiert, die ähnlich und 10 nicht waren. Die Erfolgsquote war leider nicht so beeindruckend. –

+1

pHash ist eigentlich ziemlich streng, Sie können "ahash" oder durchschnittlichen Hash verwenden, der weniger streng ist. Sie können eine Python-Implementierung finden Sie hier https://github.com/JohannesBuchner/imagehash/blob/master/find_similar_images.py – Rohit

2

Berechnung der Summe der Quadrate der Differenzen der Pixelfarbwerte eines drastisch verkleinerte Version (zB: 6x6 Pixel) funktioniert gut. Identische Bilder ergeben 0, ähnliche Bilder ergeben kleine Zahlen, andere Bilder ergeben große.

Die Idee der anderen Jungs, zuerst in YUV einzudringen, klingt faszinierend - während meine Idee großartig funktioniert, möchte ich, dass meine Bilder als "anders" berechnet werden, damit sie ein korrektes Ergebnis liefert - sogar aus der Perspektive eines farbenblinden Beobachters .

0

Apologies für spät in der Diskussion verbinden.

Wir können sogar ORB Methodik verwenden, um ähnliche Merkmale Punkte zwischen zwei Bildern zu erkennen. Nach Link gibt direkte Umsetzung von ORB in Python

http://scikit-image.org/docs/dev/auto_examples/plot_orb.html

Auch hat OpenCV bekam direkte Umsetzung von ORB. Wenn Sie mehr Informationen haben, folgen Sie dem unten angegebenen Forschungsartikel.

https://www.researchgate.net/publication/292157133_Image_Matching_Using_SIFT_SURF_BRIEF_and_ORB_Performance_Comparison_for_Distorted_Images