Projektbeſchreibung

Beginn

Dieses Projekt entwickelte sich aus meinen Beiträgen zu Wikimedia Commons vor einigen Jahren. Damals habe ich die Illustrationen des kleinen Brehm, 1. Band, Säugetiere, in hoher Auflösung (600 dpi) gescannt, nachbearbeitet und hochgeladen. Neben diesem Buch hatte ich auch noch zwei ältere Schulbücher mit schönen Illustrationen, die ich ebenfalls digitalisieren wollte. Aus Zeitmangel ist es dazu jedoch nicht gekommen.

Letztes Jahr fiel mir eines dieser Bücher wieder in die Hände. In der Zwischenzeit habe ich mich mehr mit Python und django beschäftigt, mit GIMP experimentiert und kleine Texterkennungsscripts mit tesseract realisiert und pandoc entdeckt. Mein Projekt ging daher über die bloße Erfassung der Illustrationen hinaus. Der Plan entstand, das gesamte Buch in einer Weise zu digitalisieren, die es sowohl als HTML als auch als eBook und in Textform zugänglich machen sollte, gleichzeitig sollten die Illustrationen in der bestmöglichen Qualität zur Verfügung stehen. Auf dem Weg dorthin sollte möglichst viel automatisiert ablaufen.

Digitaliſieren

Zuerst habe ich eine möglichst einfache und gleichzeitig qualitativ hochwertige Lösung gesucht. Das Erfasssen mit einem Einzugsscanner schied aus, da ich das alte Buch natürlich nicht zerschneiden wollte. Abfotografieren wäre zwar möglich gewesen und mit einer Canon 500D mit einem guten Fixbrenntweitenobjektiv durchaus auch in einer akzeptablen Auflösung für die Texterkennung, die feinen Linien der Illustrationen wären aber verloren gegangen. Ich habe mich daher dafür entschieden, das Buch ganz klassisch mit einem Flachbettscanner (Epson Perfection 2400) mit 600 dpi Doppelseite für Doppelseite zu scannen. Insgesamt waren das 144 Scanvorgänge was viel klingt aber letztlich schneller ging, als ich gedacht habe.

Datenvorbereitung

Die so entstandenen TIF-Dateien der Doppelseiten wurden mit Scantailor nachbearbeitet, das heißt in der Mitte geteilt, gerade ausgerichtet, Helligkeitswerte angepasst, die Seitenränder vereinheitlicht und die Text- und Grafikbereiche getrennt. Das funktionierte in Scantailor zwar alles automatisch, trotzdem waren eine händische Eingriffe, besonders bei der Erkennung, was Grafik und was Text ist, erforderlich.

Reſtaurierung

Da es sich um ein Schulbuch handelt und offenbar die Schüler auch schon vor hundert Jahren die ihnen wichtig scheinenden Textstellen markiert haben (mangels anderem Schreibgerätes zwar nur mit Bleistift, dafür aber umso eifriger), mussten diese Unter- (und leider oft auch Durch-)streichungen in GIMP wegretouschiert werden.

Buchſtabenſtempel

In manchen Zeilen war es offensichtlich einfacher, die betroffenen Worte ganz zu löschen und neu zu schreiben. Eine passende Schriftart gab es aber leider nicht. Daher kam nun zum ersten Mal tesseract zum Einsatz. Zuerst habe ich einige "schöne" Seiten mit viel Buchstaben, wenig Zeichnungen und keinen Scanfehlern durch Tesseract laufen lassen und als Ausgabe nicht den erkannten Text, sondern die erkannten Boxdaten gewählt. Mit einem Python-Script und der PIL-Bibliothek wurden diese Boxdaten dann in viele einzelne Buchstabenbilder umgewandelt und abgespeichert. Nach kurzer händischer Durchsicht und dem Löschen von Ausreißen kam dann (aus Tempogründen) Imagemagick zum Einsatz, mit dem alle Buchstabendateien eines jeden Buchstaben übereinandergelegt wurden und dann mit einem Schwellenwert ein "Durchschnittsbild" der Glyphe erstellt wurde. Daraus wurden dann Stempel-Dateien für GIMP gemacht und so konnte ich dann in GIMP die defekten Buchstaben einfach löschen und in der Folge überstempeln.

Insgesamt war das der bis zu diesem Stadium der zeitaufwändigste Teil des Projektes.

Illuſtrationsextraktion

In einem iPython-Notebook habe ich dann - wieder mit PIL - ein Script geschrieben, dass Seitenbilder nach Illustrationen durchsuchte und die Boxdaten dieser Illustrationen und der darunter befindlichen Bildbeschreibungen ausgab. Diese Daten wanderten in eine zwischenzeitlich erstellte SQLite3-Datenbank. Das funktionierte grundsätzlich sehr gut (nur etwa 1% nicht erkannte und rund 8% falsch erkannte Illustrationen), ganz ohne händische Überarbeitung ging es aber auch nicht, da vor allem bei mehrzeiligen Bildunterschriften und ineinander geschachtelten Illustrationen die Begrenzungen nicht pixelgenau gepasst haben. Es war also erforderlich, per Hand nach zu justieren. Auch mit einiger Vorstellungskraft geht das aber durch abstrakte Zahleneingabe nicht wirklich, weswegen ich es über ein Webinterface gelöst habe.

Diese Erfassung der Illustrationen hat sich in der Folge noch bei weiteren Schritten als sehr hilfreich erwiesen:

Webinterface

Auftritt django und jQuery! Da ich ohnehin vor hatte, das Projekt einmal ins Web zu stellen, lag es nahe, die grafische Oberfläche gleich im Browser zu implementieren. Mit django habe ich nun ein sauberes Datenbankmodell entwickelt und über Templates und jQuery zugänglich gemacht. Die Daten aus SQLite3 ließen sich relativ einfach importieren und so habe ich dann eine Seite nach der anderen geprüft, Rahmenfelder verschoben, gelöscht oder ergänzt.

Nachdem es die Datenmodelle schon in django gab, habe ich ab diesem Zeitpunkt die erforderlichen Methoden zur weiteren Bearbeitung auch gleich dort implementiert. Das waren zum Beispiel solche, die die Illustrationen und Bildunterschriften ausgeschnitten und für den Webserver gecached haben, tesseract über die Texte laufen ließen, Metadaten (Maße, vorkommende Artnamen usw.) extrahiert haben und die Aufbereitung für die Darstellung als Webseite übernommen haben.

Schrifterkennung

Der nächste Schritt war denn die Schrifterkennung. Da das Buch in Frakturschrift gedruckt ist, kam als einzige brauchbare Lösung tesseract (deu-frak) in Frage. Natürlich war aber auch hier eine Nachbearbeitung (um etwa das lange s zu berücksichtigen) erforderlich. Die Textauszeichnung erfolgte mit Markdown das über pandoc) eine hervorragende Ausgangsbasis für die Generierung aller möglichen Dokumenttypen, von HTML über LaTeX bis zu PDF, ermöglicht.

Weitere Funktionen

Ich spiele mit dem Gedanken, Binomial-Namen zu extrahieren und in einen Index einzubauen, ähnlich bei Autorennamen und Vulgärnamen. Aber dazu ist erst noch eine Vervollständigung der Datenbasis erforderlich.