2013-04-09 7 views
6

Die Situation ist irgendwie einzigartig von allem, was ich schon gefunden habe gefragt, und ist wie folgt: Wenn ich ein Foto von zwei ähnlichen Bildern machte, I ' Ich möchte gerne die unterschiedlichen Merkmale der beiden Bilder hervorheben. Zum Beispiel die folgenden zwei Hälften eines Flecks Kinder der Unterschied Spiel:Vergleichen von ähnlichen Bildern als Fotos - Erkennen von Differenz, Bildverschiedenheit

left half of spot the differenceright half of spot the difference

Die Unterschiede in den Bildern werden Bits fehlt/hinzugefügt und/oder Farbwechsel, und die Art der Unterschiede, die würde leicht erkennbar aus den ursprünglichen Bilddateien, indem nichts cleverer als ein Pixel-für-Pixel-Vergleich gemacht wird. Aufgrund der Tatsache, dass sie den Schwankungen des Lichts und der Ungenauigkeit der Fotografie ausgesetzt sind, benötige ich einen weit nachsichtigeren/schlaueren Algorithmus.

Wie Sie sehen können, werden die Bilder nicht unbedingt perfekt ausgerichtet, wenn sie überlagert werden.

Diese Frage sprachunabhängig markiert als ich Antworten erwarten, die mir gegenüber relevanten Algorithmen weisen jedoch auch in aktuellen Implementierungen interessiert sein Ich würde, wenn sie vorhanden sind, vor allem in Java, Ruby, oder C. Mein

Antwort

5

Der folgende Ansatz sollte funktionieren. Alle diese Funktionalitäten sind in OpenCV verfügbar. Werfen Sie einen Blick auf this example für Computer-Homographien.

  • Erkennen Sie die Schlüsselpunkte in den zwei Bildern mit einem Eckendetektor.
  • Extraktionsdeskriptoren (SIFT/SURF) für die Schlüsselpunkte.
  • Ordnen Sie die Schlüsselpunkte zu und berechnen Sie eine Homographie mit RANSAC, die das zweite Bild an das erste anpasst.
  • Wenden Sie die Homographie auf das zweite Bild an, so dass es mit dem ersten ausgerichtet ist.
  • Berechnen Sie einfach den pixelweisen Unterschied zwischen den beiden Bildern, und das Differenzbild hebt alles hervor, was sich vom ersten zum zweiten geändert hat.
+0

Große klare Antwort, ich werde heute Abend etwas in OpenCV implementieren. –

+2

Achten Sie darauf, dass eine Homographie fast starr ist: Sie bildet eine Ebene (in 3d) auf eine Ebene ab (Verformungen werden nicht berücksichtigt). In Ihrem obigen Beispiel würde dies zu einer einfachen globalen Übersetzung nach rechts führen. Homographien werden verwendet, um die Kamerabewegung zu kompensieren, wenn die Kamera auf eine planare Oberfläche blickt. – WhitAngl

+1

Yup ich zweite das. Im aktuellen Beispiel sieht es so aus, als würden Sie ein planares Objekt (das Gemälde) zuordnen. Es sollte also in Ordnung sein, Homographien zu verwenden. Wenn Sie diese Methode jedoch auf reale 3D-Objekte anwenden, wird die Homographie mit der Annahme berechnet, dass alle Features auf derselben Ebene liegen, was wiederum zu einer unerwarteten Ausrichtung der Bilder führen kann. – Zaphod

4

Allgemeiner Ansatz wäre, einen optischen Fluss zu verwenden, um beide Bilder auszurichten und einen Pixel-für-Pixel-Vergleich durchzuführen, sobald sie ausgerichtet sind.

Jedoch, für die Besonderheiten, Standard optische Strömungen (OpenCV etc.) werden wahrscheinlich scheitern, wenn die beiden Bilder deutlich wie in Ihrem Fall abweichen. Wenn das tatsächlich fehlschlägt, gibt es neue Techniken für den optischen Fluss, die auch dann funktionieren sollen, wenn die Bilder sich drastisch unterscheiden. Zum Beispiel könnten Sie das Papier über SIFT flows by Ce Liu et al betrachten, das dieses Problem mit spärlichen Übereinstimmungen behandelt.

Verwandte Themen