Freitag, 17. Juni 2016

Barcodes in gescanten Dokumenten aufbereiten

Dieser Post ist "Follow-Up" zum Artikel

Barcodeerkennung mit OpenCV und ZXing

Mit mehr Testmaterial stellte sich heraus, dass durch die dort beschriebene Lösung leider nicht alle Barcodes erkannt werden. Die Bildbereiche werden zwar richtig ermittelt, jedoch liefert ZXing teilweise keine Ergebnisse.
Mit der Barcode Scanner App, die ebenfalls auf ZXing basiert konnte ich die Codes vom Bildschirm ablesen allerdings ging dies relativ zähe. Die Bildqualität ist also zu schlecht.

Ich habe die Online Services einiger kommerzieller Libraries getestet und die konnten die betroffenen Codes in der Regel korrekt auslesen. Es muss also möglich sein.

Grundsätzlich ist die Helligkeit des Scanmaterials unterschiedlich. Bis zu einem gewissen Grad funktioniert die Erkennung aber irgendwann werden die Barcodes nicht mehr erkannt.

Die Codes auf den folgenden 2 Bilder werden korrekt erkannt. Die unterschiedlichen Helligkeiten sind aber deutlich zu erkennen.

Korrekt erkannt - hoher schwarz Anteil

Korrekt erkannt - wenig schwarz

Einfache Weiß Interpolation


Der hier gezeigte Code wurde nicht mehr erkannt. Es ist deutlich zu sehen, dass die weißen Zwischenräume teilweise fast vollständig geschlossen sind.
Auch die Android App hat Schwierigkeiten, diesen Code vom Bildschirm zu scannen.

Das 2. Bild zeigt das veränderte Bild mit Hilfe einer einfachen Interpolation. Dabei wurden die weißen Bereiche vergrößert. Der Code wird nun erkannt und auch die Android App scannt den Code wesentlich schneller.

Scan mit zu wenig weiss. Code wird nicht erkannt.

Ergebnis der Interpolation. Code wird erkannt
Das Interpolationsverfahren ist sehr einfach aber funktioniert. Das Eingangsbild wird pixelweise verarbeitet.
Zu jedem Pixel werden die beiden Nachbarn rechts sowie oben und unten ausgewertet. Die Weiß Interpolation arbeitet nach folgender Logik:

Nachbar rechts = black UND 2. Nachbar rechts = white => setze Pixel auf white
Nachbar oben = white ODER 2. Nachbar oben = white => setze Pixel auf white
Nachbar unten = white ODER 2. Nachbar unten = white => setze Pixel auf white

Im Ergebnis werden die weißen Zwischenräume minimal breiter und auch nach oben und unten verlängert.

Im Moment führt die Interpolation noch dazu, dass durch die Regeln 2 und 3 oben und unten 2 Pixel des Codes abgeschnitten werden. Das ist ein bekannter Fehler, den ich jedoch in Kauf nehme.

Einfache Schwarz Interpolation


Der hier gezeigte Code wurde nicht mehr erkannt. Es ist deutlich zu sehen, dass die schwarzen Balken an den Kannten unscharf sind und weisse Lücken enthalten. Auch die Android App erkennt diesen Code nicht mehr ohne Weiteres.

Das 2. Bild zeigt das veränderte Bild mit Hilfe einer einfachen Interpolation. Dabei wird schwarz aufgefüllt und die schwarzen Bereiche vergrößert. Der Code wird nun erkannt und auch die Android App scannt den Code zuverlässig.


Scan mit zu wenig schwarz. Code wird nicht erkannt


Ergebnis der Interpolation. Code wird erkannt


Das Interpolationsverfahren funktioniert genauso wie das beschriebene Weiß Verfahren, nur umgekehrt.
Zu jedem Pixel werden die beiden Nachbarn rechts sowie oben und unten ausgewertet. Die Schwarz Interpolation arbeitet nach folgender Logik:

Nachbar rechts = white UND 2. Nachbar rechts = black => setze Pixel auf black
Nachbar oben = black ODER 2. Nachbar oben = black => setze Pixel auf black
Nachbar unten = black ODER 2. Nachbar unten = black => setze Pixel auf black

Im Ergebnis werden die scharzen Balken minimal breiter und auch nach oben und unten verlängert.

Im Moment führt die Interpolation noch dazu, dass durch die Regeln 2 und 3 der Code oben und um 2 Pixel erweitert wird. Das ist ein bekannter Fehler, den ich jedoch in Kauf nehme.


Ich hoffe, dass die Barcodeerkennung nun soweit ausgereift ist, dass sie die Anforderungen des aktuellen Projekts erfüllt. Budgetmäßig war dieser Aufwand nicht eingeplant.

Merkwürdigerweise sind es aber oft genau solche nicht eingeplanten aber interessenten Dinge, die den Spaß an der Arbeit erhalten.


Keine Kommentare:

Kommentar veröffentlichen