Digits/Zahlen aus Bilddateien extrahieren (OCR)

bertibots

Newbie
Registriert
Juli 2022
Beiträge
3
Wertes Forum,

ich bin auf der Suche nach einer Möglichkeit Zahlen aus Bildern/Videos zu digitalisieren. Ich habe dazu
1. ein Video von einem Messaufbau während eines Tests gemacht
2. aus diesem Video mittels ffmpeg in einem bestimmten Intervall Bilder exportieren lassen (jeweils von den Bild-Bereichen in denen die Messwerte im Video zu sehen sind.)

Anbei sind ein paar Beispiele von den so erzeugten Bildern. Ich habe jetzt diverse online OCR-Dienste und auch den gImageReader getestet um aus diesen Bildern die Zahlen zu extrahieren - leider ohne Erfolg, obwohl ich bspw. beim gImageReader die möglichen Zeichen mit einer Whitelist (0123456789.) eingeschränkt habe.

Hat hier jemand eine Idee wie man das hinbekommen kann? Ich habe hier pro Video zwischen 100 und 1000 Bildern, die ich ungern per Hand in eine Excel übertragen würde.

Besten Dank schonmal und viele Grüße
Berti
 

Anhänge

  • H_12_T_0021.png
    H_12_T_0021.png
    1,9 KB · Aufrufe: 176
  • H_12_T_0063.png
    H_12_T_0063.png
    1,5 KB · Aufrufe: 170
  • H_12_T_0153.png
    H_12_T_0153.png
    1,8 KB · Aufrufe: 167
  • H_12_VA_0009.png
    H_12_VA_0009.png
    17,6 KB · Aufrufe: 167
  • H_12_VA_0029.png
    H_12_VA_0029.png
    14,4 KB · Aufrufe: 167
  • H_12_VA_0081.png
    H_12_VA_0081.png
    7,1 KB · Aufrufe: 179
Da gimagereader tesseract als engine nutzt, könntest du versuchen, tesseract direkt auf die Zahlen zu trainieren. Allerdings musst du dich ein wenig durch die tesseract Dokumentation wühlen. Vielleicht gibt es ein vorgefertigtes Trainigsset für Segment-Digitalzahlen.

Grundsätzllich erhälst du bessere Ergebnisse, wenn du die Bilder/Videos nicht komprimierst.

Oder ein unkonventioneller Vorschlag:
Male auf dem Display die Zwischenräume zwischen den Segmenten schwarz aus, sodass die Zahlen mehr den üblichen Zahlen entsprechen und guck mal, wie dann die Ergebnisse sind.

Edit: Man kann natürlich auch mit imagemagick o.ä. die Bilder vorab bearbeiten (bspw. mit Masken), um das Aussehen anzugleichen.

Ergänzung ()

madmax2010 schrieb:
tesseract ist der Stdard im Bereich OCR. Alle grossen bauen daran mit.
Ich habe damit verdammt viele ebooks im Studium aus schlecht gescannten PDFs gemacht.
:)
gimagereader nutzt tesseract ...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: bertibots und madmax2010
  • Gefällt mir
Reaktionen: bertibots
Eigentlich hatte ich auch zu Tesseract und Font-Training schreiben wollen...

Aber wenn die Ausgangslage derart ist, dass ein fester Messaufbau vorhanden ist, könnte man (nachdem man mit ffmpeg Bilder extrahiert hat) auch eine eigene Mustererkennung programmieren, welche systematisch differenziert: Ist an Koordinate x-y der Punkt eher hell oder eher dunkel? Das macht man pro Sieben-Segment-Stelle siebenmal und dies für jede Stelle einmal (einfache Schleife) und kann anhand der Dunkel-Hell-Lage für die sieben Segmente je Stelle (wie ich glaube) ganz gut die Zahl interpretieren.
Das macht eine OCR auch nicht soo anders... aber mit etwas grösserem Aufwand.
 
  • Gefällt mir
Reaktionen: bertibots und Arc Angeling
Keine Ahnung ob´s dir was bringt, aber wir haben sowas mal im Laborbetrieb über NI LabView / Vision realisiert. Das hat gut funktioniert, lassen die sich aber glaube ich auch dementsprechend gut bezahlen.

VG Hirsch
 
  • Gefällt mir
Reaktionen: bertibots
Vielen, vielen lieben Dank euch allen für die Tips! Ich bin leider nicht vertraut mit dem Programmieren, und ffmpeg in der Kommandozeile hat mich zugegebenermaßen schon nah an meine Grenzen gebracht :D
Aber seih's drum: Ich habe jetzt mal Tesseract heruntergeladen und versucht das über die Kommandozeile zum laufen zu bringen, aber alles was ich da als Output bekomme ist "empty page!"

Eure Tipps waren aber trotzdem (zum jetzigen Zeitpunkt noch vermutlich) hilfreich:
was grundsätzlich zu funktionieren scheint, ist die "letsgodigital"-Sprache auf die oben mehrfach verwiesen wurde in den gImageReader zu laden, damit habe ich jetzt zumindest eine(!) etwas modifizierte Input-Datei (im wesentlichen weichgezeichnet und Kontrast hochgezogen so dass die einzelnen Zahlen etwas mehr zusammenhängend sind und nicht mehr nur einzelne LCD-Segmente).

Das ging, d.h. jetzt muss ich "nur noch" eine automatisierte Lösung finden um alle Bilddateien in diese Richtung zu bearbeiten (oder nochmal "bessere" Bilder aus meinen Videos extrahieren). Ich nehme an, dass sollte mit "imagemagick" gehen? Daran werde ich mich jetzt mal versuchen...

ich halte euch auf dem Laufenden :)
 
Ich hatte das damals so gelöst:
Manuell herausfinden, welche Bildvorbearbeitung die besten Ergebnisse bringt. Die Einstellungen für imagemagick und tesseract aufeinander abstimmen.
Danach habe ich alles in ein Visualbasic Script gepackt, das auch das restliche (Datei)Handling löst. Zudem habe ich via VBS automatisch auch wiederkehrende Fehler in den finalen Textdateien korrigiert (0 und O sind bspw immer Kandidaten für Verwechslungen bei OCR).
So musste ich nur noch das script starten und alle Dateien wurden in einem Rutsch bearbeitet.
 
  • Gefällt mir
Reaktionen: bertibots
So allerseits, es hat geklappt - ohne kostenpflichtige Programme! :)

Hier meine Dokumentation für die Nachwelt..
genutzte Programme:
ffmpeg,
ImageMagick,
gImageReader (mit tesseract trainingsdaten "letsgodigital" (nicht so toll) und "ssd" (einwandfrei))

Grundlegende Schritte:
1. mit ffmpeg Bildausschnitte für jeden Messwert 1x pro Sekunde aus den Videos extrahieren
2. mit ImageMagick Bildausschnitte so bearbeiten dass sie
3. mit gImageReader in eine Zahlenkombination umgewandelt werden können
4. die Daten aus dem gImageReader in eine txt und die dann
5. in Excel importiert und händisch die Daten nachgebessert.

Hauptproblem war: am Anfang habe ich mich abgemüht die Bilddateien vorher so zu bearbeiten, dass der gImageReader sie mit den "letsgodigital.traineddata" erkennen kann. Das ging dann immer für einzelne Bilder ganz gut, aber mit dem selben "Filter" auf allen Bildern waren die Ergebnisse dann im Schnitt eher schlecht (die Ausgangsbilder hatten etwas Varianz weil z.B. die Helligkeit mal variierte weil im dunklen Raum die Tür aufging oder die Kamera nachfokussiert hat etc.). Die Trainingsdaten für tesseract hab ich einfach in den Ordner \gImageReader\share\tessdata\ reinkopiert, nach einem Programm-Neustart waren die dann einfach als Sprache im Dropdown-Menü auswählbar.
Der Trick war am Ende einfach bessere Trainingsdaten zu finden: der "SSD" Datensatz (ich nehme an für SevenSegmentDisplay") hat hier wesentlich besser/robuster funktioniert als der "letsgodigital".
Quelle dafür: https://github.com/Shreeshrii/tessdata_ssd

Die Bearbeitung im ImageMagick war am Ende recht simpel, für eine rote LCD-Anzeige auf schwarzem Grund waren dass die einzigen Befehle die es brauchte: "-blur 3x50 -threshold 15% -negate"
Für eine andere Anzeige war es etwas komplizierter, hier musste ich über eine Zwischendatei gehen, dabei hat es mir am Anfang die Reihenfolge der Bilder etwas durcheinander geworfen. Lösen ließ sich dass dann recht einfach indem man in den Zwischenschritten als *.tif exportiert, da dort dann alle Bilder in einer Datei landen und die Reihenfolge gleich bleibt.

Im gImageReader hab ich dann die bearbeiteten Bilder reingeladen und ordnerweise "konvertiert"/ausgelesen/exportiert (bei manchen Datensätzen stand die Kamera vermutlich schief, da musste ich den Datensatz noch etwas kippen aber dann hat er alles relativ problemlos erkannt).

Nach dem Import in Excel muss man noch etwas "sauber machen", aber das ging z.B. einfach indem man mit bedingter Formatierung die Zellen nach Größe einfärbt, da fallen die Ausreißer in der Reihe dann auf und man kann sie händisch nachkorrigieren (für einen Datensatz mit ca. 1000 Werten je 3 Messgrößen hat das vllt. 5-10 Minuten gedauert, akzeptabel für mich).

Ich hoffe das hilft in Zukunft nochmal jemandem weiter. Von mir nochmal ein großes, fettes, dickes Dankeschön!!! für die Hilfe und Tipps eurerseits die mich in die richtige Spur geschickt haben :)

Beste Grüße
Berti
 
  • Gefällt mir
Reaktionen: der_hirsch, Demon_666 und Phrasendreher
Zurück
Oben