Hallo alle zusammen,
Gleich mal meine erste Frage. Ich habe eine .jpg-datei, die aus zwei übereinander liegenden Bildern besteht.
Das erste Bild zeigt eine Landung von Eroberern in ein fremdes Land. Auf das Bild, oder darunter liegt ein nur zum Teil sichtbarer QR-Code, den es
zu entschlüsseln gilt.
Olli
Nachtrag : Da Harry Stahl schon eine Prozedur zum Vergleich geliefert hat (während ich den Artikel schrieb) gilt das nachfolgende natürlich nur noch für die Anpassung der beiden Bilder aneinander.
Den Hinweis das Du das Originalbild vom Bild mit QR-Code abziehen kannst haben dir ja schon mehrere gegeben. Prinzipiell ist das schon mal der richtige Ansatz.
Mit den unterschiedlichen Größen von Referenzbild und Abbildung kannst Du auf verschiedene Arten umgehen, um nicht mit der Bazooka loszumarschieren [1] kannst Du Dir eine einfache Form von Bildregistrierung selbst basteln :
Wenn die Bilder sich nur in der Größe unterscheiden dann kannst Du eines der Bilder natürlich einfach skalieren. Da die Seitenverhältnisse bei beiden Bildern gleich sein müssten dürfte eine Skalierung eine relativ gute Abbildung ergeben.
Alternativ dazu kannst Du natürlich auch ohne Skalierung auskommen und einfach die Koordinaten umrechnen um für jeden Punkt (X,Y) im Bild 1 einen Punkt(X,Y) im Bild 2 zu bekommen.
Ist das Bild darüber hinaus verzerrt dann musst Du Dir drei oder vier Stützpunkte suchen die in beiden Bildern an der gleichen Position vorkommen. Diese Stützpunkte kannst Du mittels Template-Matching in beiden Bildern suchen (dazu kannst Du beispielsweise OpenCV verwenden) und wendest anschließend eine bilineare Interpolation auf das zu transformierende Bild an. (
https://en.wikipedia.org/wiki/Bilinear_interpolation)
1. Anschließend gehst Du den bereits vorgeschlagenen Weg und erstellst Die eine SW - Maske die die gleichen Ausmaße wie Deine Bilder hat. An der Stelle an der der sich das Abbild vom Original unterscheidet setzt Du einen schwaren Punkt. Die weißen Quadrate des QR-Codes kannst Du auf diese Art zunächst nicht finden, denn Dein Bild sieht so aus als ob Weiß den Farbwert der Abbildung nicht beeinflusst, aber das dürfte keine Rolle spielen.
Wenn Du Glück hast, dann war es das. Du müstest Dir nur noch die Bounding-Box Deiner Maske suchen (als das minimale Quadrat das alle schwarzen Pixel einschließt) um diesen Bereich zu kopieren und du hättest Deinen QR-Code gefunden.
Die meisten der hier genannten und notwendigen Verfahren, einschließlich bilinearer Interpolation und logischen oder arithmetischen Operationen auf Bildern (Bilder mit OR,UND,SUB usw. bearbeiten) sind übrigens in Leptonica (
www.leptonica.org/) implementiert.
Ich habe mir erlaubt eine selbst compilierte
DLL und eine unvollständig getestete Headerübersetzung anzuhängen. Möglicherweise kannst Du ja was damit anfangen. Wenn etwas nicht funktioniert ist anstelle eines var XXX eine pXXX als Parameter verlangt (oder umgekehrt).
Leptonica steht unter der BSD Lizenz.
In Anbetracht des Umfangs bitte ich zu verzeihen das ich nur die Funktionen getestet habe die ich selbst verwende.
[1]
http://www.itk.org/
Numerical Methods for Image Registration, ISBN 978-0-19-852841-8
2-D and 3-D Image Registration, ISBN 978-0-471-64952-0