3D-Barcodes mit Farbfiltern auslesen...

18.01.2016 yahe legacy thoughts

Bereits vor einer ganzen Weile hatte ich mal mit Licht und Farbfiltern herum experimentiert. Damals hatte ich mit Hilfe von Farbfiltern das Licht aufgespalten, das von einer RGB-LED emittiert wurde und dabei auch erwähnt, dass man auf Basis dieser Bündelung Daten übertragen könne.

Einige Zeit später war ich auf der Suche nach einer Möglichkeit, Binärdaten über ein Druckerzeugnis zu übertragen. Dabei denkt man heutzutage natürlich erst einmal an 2D-Barcodes (z.B. Aztec-Codes, Matrix-Codes oder die allseits bekannten QR-Codes). Leider reichte deren Datendichte nicht aus. In ähnlichen Fällen werden deshalb gelegentlich 3D-Barcodes (z.B. der "HCCB"-Code von Microsoft) eingesetzt. Diese funktionieren, indem zusätzlich zu den beiden Dimensionen Höhe und Breite noch die dritte Dimension der Farbe eingeführt wird. Allerdings benötigen solche 3D-Barcodes typischerweise mehrere Dinge:

  1. Eine Lizenz, um das Verfahren nutzen zu dürfen.
  2. Stark angepasste Lesegeräte und/oder Erkennungsalgorithmen.

In dem Moment dachte ich an das Experiment mit den Farbfiltern zurück. Wenn man es hinbekäme, die Komplexität des Barcode-Lesens und die Komplexität des gesteigerten Farbraums voneinander zu trennen, könnte man einfach reproduzierbare Barcodes erzeugen, die gleichzeitig mit vorhandenen Standardmitteln lesbar wären. Geboren war der kombinierte Farb-Barcode.

kombinierter Farb-Barcode

Herstellen lässt er sich recht einfach:

  1. Man nimmt sich zwei normale 2D-Barcodes und legt diese übereinander.
  2. Pixel, die in beiden Barcodes vorkommen, werden schwarz gefärbt.
  3. Pixel, die in keinem der beiden Barcodes vorkommen, werden weiß gefärbt.
  4. Pixel, die nur im ersten Barcode vorkommen, werden mit einer Farbe A eingefärbt.
  5. Pixel, die nur im zweiten Barcode vorkommen, werden mit einer Farbe B eingefärbt.

Gedanken machen muss man sich nun darum, wie man die Barcodes wieder getrennt bekommt. Dafür ist es wichtig, Farbe A und Farbe B richtig zu wählen. Diese beiden Farben müssen eine Beziehung zueinander haben, die sich wie folgt beschreiben lässt:

  1. Wenn Farbe A durch einen Farbfilter der Farbe B betrachtet wird, muss ein möglichst starker Farbkontrast entstehen.
  2. Wenn Farbe B durch einen Farbfilter der Farbe A betrachtet wird, muss ein möglichst starker Farbkontrast entstehen.

Glücklicherweise hatte ich Farbfilter zuhause, die diese beiden Bedingungen erfüllen, rote und blaue:

roter und blauer Farbfilter

Wichtig für einen produktiven Einsatz ist, dass die Farbfilter und die für den Druck verwendeten Farben aufeinander abgestimmt werden. Im Haushaltsgebrauch wird man das nicht unbedingt hinbekommen, weshalb das Auslesen des Barcodes im selbstgebastelten Umfeld wohl mehr Geduld erfordert, als es im professionellen Umfeld der Fall wäre.

gedruckter Farb-Barcode

Um nun den Inhalt der Barcodes auslesen zu können, platziert man einen Farbfilter vor der Kamera und scannt den Code. Anschließend tauscht man den Farbfilter vor der Kamera aus und scannt den Code erneut (sogenanntes "shuttern"). Eine Alternativmöglichkeit ist, zwei Kameras gleichzeitig zu verwenden, die jeweils einen der Farbfilter fest zugeordnet bekommen. So ist es möglich, trotz doppelter Datendichte die Lesegeschwindigkeit konstant zu halten.

Farb-Barcode mit Farbfilter Farb-Barcode mit Farbfilter

Wie man erkennt, geschehen beim Aufnehmen des Barcodes durch die Farbfilter nun mehrere Dinge:

  1. Schwarze Pixel bleiben unverändert und stellen die Kontrastfarbe dar.
  2. Weiße Pixel werden eingefärbt und stellen die Grundfarbe dar.
  3. Pixel in der Farbe des Filters werden herausgefiltert und stellen die Grundfarbe dar.
  4. Pixel in der Gegenfarbe des Filters werden verstärkt und stellen die Kontrastfarbe dar.

Durch Einsatz der Farbfilter und dem Effekt der Kontraständerung der Gegenfarbe entstehen zwei unterschiedliche Barcode-Abbildungen auf Basis eines einzigen Farb-Barcodes. Jeder QR-Code-Leser, der einen automatischen Kontrastabgleich vornimmt, kann diese Barcodes bereits lesen. Zur Verbesserung der Barcode-Erkennung können nach dem Einsatz des Filters noch zwei Schritte unternommen werden, um das Leseergebnis zu verbessern. Im ersten Schritt kann eine Überführung in ein Graustufenbild erfolgen, um den Bias des Farbsensors abzumildern. Denn wie man in den Ausgangsbildern erkennt, ist der Kontrast im Blaufilter-Bild wesentlich schlechter erkennbar als im Rotfilter-Bild.

Farb-Barcode mit Farbfilter als Graustufenbild Farb-Barcode mit Farbfilter als Graustufenbild

Im zweiten Schritt kann mit Hilfe eines Schwellwertabgleichs der tatsächlich benötigte Bildinhalt gut herausgefiltert werden. GIMP bietet hierfür beispielsweise ein einfach zu verwendendes Werkzeug, das einem eindeutig anzeigt, welche Schwellwerte von Interesse sind:

Schwellwertabgleich Schwellwertabgleich

Die daraus entstehenden Barcodes sollten nun wirklich von jedem Barcode-Scanner gelesen werden können:

Farb-Barcode mit Farbfilter als Graustufenbild nach Schwellwertfilter Farb-Barcode mit Farbfilter als Graustufenbild nach Schwellwertfilter

Um zu zeigen, dass das Auslesen auch mit Standardmitteln funktioniert, habe ich einen prototypischen Versuch unternommen und zuhause einen Farb-Barcode ausgedruckt, eine normale QR-Code-App auf meinem iPhone installiert und einen Farbfilter vor die Kamera gehalten. Den Versuch, die beiden Ebenen des 3D-Barcodes aufzunehmen habe ich als Video bei Youtube hochgeladen. Ja, es funktioniert nicht perfekt, aber weder Licht, Druckerfarbe, Farbfilter noch die verwendete App sind in irgendeiner Form aufeinander abgestimmt. Das sollte man beim Betrachten des Videos im Hinterkopf behalten.

Einsatz finden kann solch ein Verfahren in meinen Augen in zwei Situationen:

  1. In Situationen, in denen in einem Barcode mehr Daten gespeichert werden müssen, als in einen konventionellen Barcode passen.
  2. In Situationen, in denen in einem Barcode Daten für mehrere Empfänger gespeichert werden sollen. Möglich wäre beispielsweise das Szenario, dass zwei Verarbeitungsschritte Informationen aus einem Barcode lesen sollen. Der Barcode-Leser des ersten Verarbeitungsschritts erhält einen blauen Farbfilter, dessen zu lesende Daten werden in rot encodiert. Der Barcode-Leser des zweiten Verarbeitungsschritts erhält einen roten Farbfilter, dessen zu lesende Daten werden in blau encodiert. Bei gut abgestimmten Filtern und Druckfarben sind die Barcode-Leser nun optisch nicht mehr in der Lage, die falschen Daten vom Farb-Barcode auszulesen.

Search

Categories

administration (45)
arduino (12)
calcpw (3)
code (38)
hardware (20)
java (2)
legacy (113)
linux (31)
publicity (8)
raspberry (3)
review (2)
security (65)
thoughts (22)
update (11)
windows (17)
wordpress (19)