2010-09-24 12 views
11

Mögliche Duplizieren:
Image comparison algorithmErkennung ähnliche Bilder

Also im Grunde muß ich ein Programm schreiben, der überprüft, ob zwei Bilder gleich sind oder nicht. Betrachten Sie die folgenden zwei Bilder:

http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night.jpg

http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night2.jpg

Nun, sie beide sind die gleichen Bilder, sondern Wie kann ich überprüfen, um zu sehen, ob diese Bilder sind die gleichen. Ich bin nur auf die Medienfunktionen beschränkt. Alles, woran ich gerade denken kann, ist die Breitenhöhenskalierung und vergleiche die RGB für jedes Pixel, aber wäre die Farbe nicht anders?

Ich bin völlig verloren auf dieser, jede Hilfe wird geschätzt.

* Hinweis: Dies ist in Python sein und verwenden Sie die (Medienbibliothek)

+1

Siehe [ Bildvergleichsalgorithmus ] (http://stackoverflow.com/questions/1819124/image-comparison-algorithmus). –

Antwort

4

Wow - das ist eine große Frage, und eine, die eine große Anzahl von möglichen Lösungen hat. Ich fürchte, ich bin kein Python-Experte, aber ich fand Ihre Frage interessant - also wollte ich eine Methode vorschlagen, die ich implementieren würde, wenn ich mit diesem Problem konfrontiert würde.

Offensichtlich sind die beiden Bilder, die Sie geschrieben sind eigentlich ganz anders - so Sie zu prüfen, müssen ‚wie viel anders ist die gleiche‘, vor allem, wenn die Arbeit mit Bildern und verschiedene Bildformate und Kompression unter Berücksichtigung usw.

Wie dem auch sei , für eine Lösung, die einen bestimmten Unterschied in den Farbwerten zulässt (aber nicht für Pixel an den falschen Stellen), würde ich etwas wie das Folgende tun;

  1. Wählen Sie zwei Bilder.

  2. Skalieren Sie das größte Bild auf genau die gleiche Höhe und Breite wie das erste Bild (verzerren Sie das Bild bei Bedarf).

  3. Möglicherweise Graustufen der Bilder, um die nächsten Schritte einfacher zu machen, ohne viel an Effektivität zu verlieren. Eigentlich könnte hier auch eine Flankenerkennung funktionieren.

  4. Gehen Sie durch jedes Pixel in beiden Bildern und speichern Sie die Differenz in jedem der RGB-Kanäle oder nur den Unterschied in der Graustufenintensität. Sie würden mit einer Anordnung der Größe des Bildes enden, die den Unterschied zwischen den Pixelintensitäten auf den zwei Bildern notiert.

  5. Nun kenne ich die genauen Werte nicht, aber Sie würden dann wahrscheinlich feststellen, dass Sie bei einer Iteration über das Array sehen können, ob der Unterschied zwischen den einzelnen Pixeln in beiden Bildern derselbe ist (oder fast derselbe)) über alle Pixel hinweg. Vielleicht einmal über das Array iterieren, um die durchschnittliche Differenz zwischen den Pixelintensitäten in den beiden Bildern zu finden, und dann erneut über das Bild iterieren, um zu sehen, ob 90% der Differenzen innerhalb einer bestimmten Schwelle liegen (5% Unterschied?).

Nur eine Idee. Natürlich könnte es einige nette Funktionen geben, die mir nicht leicht fallen, aber ich würde nicht den Atem anhalten!

+0

Das ist gut !! Allerdings verstehe ich nicht, was Sie mit "Graustufen Intensität" meinen. Um das Bild Graustufen zu machen, müssen Sie jedes Pixel normalisieren, wie den Durchschnitt von R + G + B nehmen und dann das RGB auf den Durchschnitt zurücksetzen? – 1337holiday

+0

Graustufen ist nicht der Durchschnitt von RGB, aber der gewichtete Durchschnitt, mit R = 0,299, G = 0,587, B = 0,114. (Das liegt daran, dass unsere Augen für Grün empfindlicher sind als für Rot oder Blau und am wenigsten für Blau.) – kindall

+0

Hmm, ist das immer noch etwas unklar, kannst du eine sehr einfache Berechnung für ein Pixel zeigen? – 1337holiday

1

ImageMagick hat Python-Bindungen und eine Vergleichsfunktion. Es sollte die meiste Arbeit für dich erledigen, aber ich habe es nie in Python verwendet.

0

Ich denke, Schritt 2 von John Wordsworths Antwort kann eine der härtesten sein - hier haben Sie es mit einer gestreckten Kopie des Bildes, aber erlauben Sie auch gedreht, beschnitten oder auf andere Weise verzerrte Bilder? Wenn dies der Fall ist, benötigen Sie einen Feature-Matching-Algorithmus, wie er in Hugin oder einer anderen Software zur Erstellung von Panoramen verwendet wird. Dies wird übereinstimmende Funktionen finden, verzerren, um zu passen, und dann können Sie die anderen Stufen des Vergleichens durchführen. Idealerweise möchten Sie Van Goghs Gemälde aus Fotos erkennen, sogar Fotos auf Bechern! Es ist einfach für einen Menschen, dies zu tun, für einen Computer braucht es etwas komplexere Mathematik.