Vergleichen (ähnliche) Bilder mit Python/PIL

Ich versuche zu berechnen, die ähnlichkeit (Lesen: die Levenshtein-Distanz) der beiden Bilder, die mit Python 2.6 PIL -.

Ich planen, uns
e die python-levenshtein - Bibliothek für den schnellen Vergleich.

Wichtigste Frage:

Was ist eine gute Strategie für den Vergleich der Bilder? Meine Idee ist so etwas wie:

  • Konvertieren zu RGB (transparent -> weiß) (oder vielleicht konvertieren zu Monochrom?)
  • Scale-up der kleineren zu der größeren Größe
  • Konvertieren jeden Kanal (= der einzige Kanal, bei der Umwandlung in schwarz-weiß), um eine Sequenz (item value = Farbwert des pixels)
  • Berechnung der Levenshtein-Distanz zwischen zwei Sequenzen

Natürlich, dies wird nicht zur Behandlung von Fällen wie gespiegelte Bilder, Bilder, etc. Aber für grundlegende Vergleich, sollte dies nützlich sein.

Ist es eine bessere Strategie irgendwo dokumentiert?

EDIT: Aaron H ist zu Recht über die speed-Ausgabe. Berechnung Levelshtein dauert etwa ewig für Bilder, die größer als ein paar hundert von ein paar hundert Pixel. Allerdings ist der Unterschied zwischen den Ergebnissen nach downscaling auf 100x100 und 200x200 ist weniger als 1% in meinem Beispiel, so könnte es klug sein, um set-up eine maximale Bildgröße von ~100px oder so...

EDIT: Dank PreludeAndFugue, die Frage ist, was ich suchte.

Durch die Art und Weise, die Levenshtein-Distanz optimiert werden kann es scheint, aber es ist mir einige wirklich schlechte Ergebnisse, denn vielleicht gibt es viele redundante Elemente in den hintergrund. Habe bis auf einige andere algorithmen.

EIDT: Root-mean-square-deviation-und Peak-signal-to-noise-ration scheinen zwei weitere Optionen, die nicht sehr schwer zu implementieren und sind scheinbar nicht sehr CPU-intensiv sein. Jedoch, es scheint, ich bin gehen zu müssen, eine Art von Kontext-Analyse für das erkennen von Formen, usw.

Trotzdem, vielen Dank für all die links, und auch für den Hinweis auf die Richtung, zu NumPy/SciPy.

  • Ich kann nicht direkt Antworten, aber ich vermute, dass, weil der Verlust der Genauigkeit der Daten in das scaling-up, Sie haben eine Menge der "Abstand" zwischen den beiden, wo der Verkleinerung der größeren ergeben könnten, in eine engere Beziehung zwischen den beiden. -- Wie für die Levenshtein-Distanz, ich habe keine Ahnung, aber dieses Zitat aus wikipedia macht mich skeptisch, es ist auch der nutzen in dieser Anwendung: "Die Levenshtein-Distanz kann auch berechnet werden, der zwischen zwei mehr Saiten, aber die Kosten zu berechnen, die in etwa proportional zum Produkt der beiden string-Längen, macht dies unpraktisch."
  • Diese Frage kann helfen: stackoverflow.com/questions/613146/...
  • Auch, konvertieren PIL Bild zu numpy-array zu tun-die mathematische manipulation. numpy ist entworfen, um zu manipulieren, große arrays von numerischen Daten. Diese Frage zeigt die Vorgehensweise: stackoverflow.com/questions/384759/pil-and-numpy
InformationsquelleAutor Attila O. | 2010-04-08
Schreibe einen Kommentar