Logo

Was mir in Sachen Linux einfällt

Texterkennung in gescannten Dokumenten

Update vom 1.8.2013 unten

OCR heißt ausgeschrieben: "Optical Character Recognition", übersetzt "optische Zeichenerkennung. Das ist das Lesen von Zeichen in Bildern. Woher die Bilder stammen, ist egal, also kann man sowohl den Fotoapparat nehmen als auch den heimischen Scanner.

Wozu? Menschen kann man Bilder hinhalten und sie können jeden Text lesen, der darauf enthalten ist, also warum nicht einfach die Bilder benutzen? Ja, aber: Bilder kann man nur als Bilder ververarbeiten, wenn man die Texte für eine Textverarbeitung braucht, dann hilft entweder jemand, der den Text vom Bild vorliest und Du tippst ihn ein oder eben OCR ...

Das geht natürlich auch mit Linux. Im Moment kommt das Ergebnis nicht an die der professionellen-Windowsprogramme ran, aber dafür ist natürlich wieder alles kostenlos. Die Texterkennung ist gut, aber mit dem Layout hapert es. Wer damit leben kann, dass die Ausgabe nur eine unformatierte Text-Datei ist, sollte sich diese Lösung durchlesen.

Das eigentliche OCR-Programm ist tesseract. Es ist Opensource und muss zusammen mit einer Sprachdatei Deiner Wahl installiert werden, also beu uns üblicherweise "deutsch". Dann ruft man es so auf (die Bilddatei muss natürlich schon vorhanden sein):

tesseract -l deu Pfad/zur/Bilddatei.ext /Pfad/zur/Ausgabedatei.txt
die grafische Oberfläche ohne Optimierung die grafische Oberfläche mit Optimierung

Ein wenig unbequem! Und wenn der Scan/das Bild nicht saubere Ränder hat, also noch unerwünschter Text angeschnitten ist, dann wird das Ergebnis unbefriedigend sein.

Besser geht es mit der grafischen Oberfläche tesseract-gui. Nach der Installation existiert im Menü von Opensuse im Untermenü "Grafik" ein passender Eintrag auf die GUI, mit der man sie startet. Im Programmfenster wählt man oben die Bilddatei(en), klickt darunter diejenige an, die man jetzt lesen möchte und piekt mit der Maus in das Bildfenster. Der Mauszeiger wird im Bildfenster zu einem kleinen Rechteck, nach dem Klick verschwindet das Rechteck und man kann ein Rechteck um den Bereich ziehen, der bearbeitet werden soll. Weiter unten findet sich ein Dropdown-Menü "language", mit dem man nur beim ersten Start die Sprache einstellt. Zuletzt auf den Button "Ausführen" klicken und wenige Sekunden später steht das Ergebnis in einer Datei mit dem 'basename' von oben und der Extension ".txt" dahinter.

Mit diesem "Frontend" kann man einen "Leserahmen" ziehen (die rote gestrichelte Linie) und es enthält außerdem noch zwei Optimierungsmöglichkeiten für das Bild, damit es das eigentliche Programm dahinter (eben tesseract) leichter hat, gute Ergebnisse zu liefern: "Contrast" ist hier rechts auf einen guten Wert geregelt und "Denoise" ist eingeschaltet. Das macht es schon für den Menschen leichter, den Text zu lesen .... Und dann gibt es noch die Option, neue Texte an vorherige Textdateien anzuhängen. So kann man dann ganze Bücher einlesen. Dieses Bild ist übrigends als Farbscan mit 300dpi per Xsane mit der üblichen automatischen Farb-, Helligkeits- und Farbkorrektur eingescannt worden.

Ein Hinweis zum Scanergebnis:

der Text enthält alles untereinander, aber in der richtigen Reihenfolge spaltenweise gelesen. Heißt: zuerst die Überschrift der linken Meldung (über 2 Zeitungsspalten), dann die Unterüberschrift (ebenfalls 2 Spalten), danach die linke Spalte der Meldung, dann die rechte und dann weiter in gleichen Reihenfolge. Also so, wie ein Mensch das lesen würde. Unterschiedliche Fonts und Textgrößen störten nicht. Ein weiterer Test mit 2 Spalten und einem Bild mit Bildunterschrift ergab: das Bild ergab die Zeichen "s73", die Bildunterschrift stand mitten im Text.

Hinweis: das Programm verarbeitet am liebsten ".tiff"-Dateien, aber es nimmt auch ".jpg"s ...

Noch schöner als tesseract-gui ist natürlich die folgende Lösung: im eigentlich Scanprogramm kann man schon auswahlen, dass die Ausgabe eine Textdatei ist. Und das kommt jetzt:

Xsane ist das Scanprogramm für Linux. Dort findest Du in den Einstellungen (Konfiguration) schon einen Karteikartenreiter, der mit "Texterkennung" beschriftet ist. Rufe ihn auf und trage in die oberste Zeile den folgenden Befehl ein:

sane-ocr.sh

In den beiden Zeilen darunter müsste schon "-i" bzw. "-o" stehen, wenn nicht, dann trage das nach. Das war es mit Xsane.

Jetzt brauchst Du noch dieses Shellscript, das Du als root in den Ordner /usr/bin/ mit dem Namen sane-ocr.sh einfügen musst. Das Script muss ausführbar sein ! Der Inhalt:

#!/bin/bash
#
#  dieses Script soll tesseract v3 an xsane anbinden
#leider habe ich bei xsane keine Parameterübergabe gefunden,
#so dass dieses Hilfscript nötig ist
#
#
# Parameter holen
while getopts ":i:o:" OPTION
  do
  case $OPTION in 
    i)  # input filename (with path)
      infile="$OPTARG"
    ;;
    o )  # output filename
      tempname="$OPTARG"
    ;;
  esac
done
outfile="${tempname%.*}"
# Jetzt die eigentliche Arbeit:
#
tesseract -l deu $infile $outfile
#
# falls Du sofort den Text sehen willst:
#
kate $outfile.txt
# sonst auskommentieren

Das war es schon. Jetzt die üblichen Links:

Hier suchst Du Dir das passende Repository aus und bindest es als zusätzliche Quelle in Yast ein. Bitte nicht den "Ein-Klick-Install" ! Dann geht Du in Yast auf "Software installieren" und Klickst auf "Anzeigen/Installationsquellen/LazyKent". Rechts suchst Du Dir die folgenden Pakete und installiest sie mit den passenden Abhängigkeiten:

Vie Spaß damit, verlinke diese Seite, falls sie brauchbar ist und melde Verbesserungen.


Update gegen Trouble mit tesseract-gui

Nach einem Update wollte Tesseract in der grafischen Version nicht mehr. Von der Konsole gestartet, ergabe sich dieser Fehler:

unable to load trained-data

Abhilfe: installiere auch die trained-data-eng, starte tesseract-gui, schalte die Sprache um auf Englisch, scanne was, schalte wieder um auf Deutsch und gut ist ...