Pixelhäufchen wandle dich: Recog - Schrifterkennung

Kein Geheimnis - der Bildschirm des ST arbeitet völlig grafikorientiert. Buchstaben dürfen deshalb allenfalls als ein Häufchen Pixel gelten. Aus diesem Grunde ist die Aufgabe, den Bildschirmpunkten wieder verwertbare Informationen zu entlocken, nicht ganz trivial.

RECOG« erkennt Text in der Pixelwüste des Bildschirms und speichert diesen gemäß ASCII-Format in einer Textdatei. Die des Englischen Mächtigen kennen diesen Vorgang auch als OCR. RECOG erkennt alle Systemzeichensätze sowie GDOS-Fonts mit einer Größe von 6x6, 8x8 und 16x8 Punkten, darunter auch deren Varianten wie fett oder hohl. Wer die Systemzeichensätze durch eigene Kreationen ersetzt hat, darf sich auch freuen. Einzige Einschränkung: Die Zeichenmatrix darf nicht größer als 16 Bildpunkte sein.

Pixelmüll auf dem Bildschirm stört die Texterkennung nicht wesentlich, nur die Geschwindigkeit leidet darunter. Bei jedem gesetzten Pixel testet das Programm, ob dieser vielleicht zu einem Buchstaben gehört. Auf Wunsch erkennt RECOG auch Zeichen, die sich berühren (etwa bei Fettschrift). In dieser Einstellung sind auch »festgewachsene« Zeichen kein Problem. RECOG verrichtet seinen Dienst auf allen Rechnern der ST/E/TT-Serie, in jeder Bildschirmauflösung und unter jeder Grafikkarte mit VDI-Treiber. Bei Auflösungen ohne LINEA-Unterstützung wechseln Sie einfach in den reinen VDl-Betrieb. Für Farbmonitor-Besitzer: Im Moment wird nur Text erkannt, der in der VDI-FARBE Nr. 2 - in der Regel schwarz - geschrieben ist. RECOG läuft als Accessory oder Programm (einfach die Endung von »PRG« nach »ACC« ändern). Wird RECOG als Programm gestartet, können Sie Bilder im Screen- oder Degas-Format (».PI?« bzw. ».DOO« ) laden und bearbeiten. Das Laden der Bilder funktioniert allerdings nur in den entsprechenden Auflösungen. Als Accessory ist es in der Menüleiste unter »Recog« zu erreichen. Ansonsten ist die Bedienung von RECOG als Accessory oder Programm gleich. Beim Start muß RECOG zuerst einen Zeichensatz lernen: Voreingestellt ist der aktuelle Standardzeichensatz ohne Attribute. Sie verändern diese Einstellungen durch Anklicken von »Fett«, »Hell«, »Kursiv« und »Hohl« in der Style-Box. Zudem geben Sie die gewünschte Größe in Pixeln an. Ist der gewünschte Zeichensatz eingestellt, schickt der Button »Font Lernen« RECOG in die Schule. Nach dem Klick auf »Start« erscheint der Mauszeiger als Hand. Damit markieren Sie nun ein Rechteck. Dazu halten Sie die linke Maustaste gedrückt. Nach dem Loslassen der linken Maustaste löscht RECOG im Zuge seiner Arbeit den Bildschirm. Der Vorgang der Texterkennung kann jederzeit durch Drücken einer (Maus)-Taste unterbrochen werden. Nach getaner Arbeit zeigt RECOG die erkannten Zeichen. Ist die Arbeit genügend bewundert, erscheint nach Tastendruck ein kleines Menü mit den Punkten »Sichern«, »Löschen« und »Aufheben«. »Sichern« speichert den Text auf Disk, »Löschen« wirft ihn weg und »Aufheben« behält ihn im Speicher, um ihn eventuell noch mit anderen Texten zu mischen. Das Mischen ist nötig, da RECOG immer nur einen gelernten Font im Speicher halten kann. Doch kein Problem! Einfach einen anderen Font lernen lassen und das ganze nochmal, aber vorher unter »Optionen...« »Text mischen« anklicken.

Optionales

Was hat es mit den Optionen auf sich? Der Spielfreudige wird es schon entdeckt haben: Nach einem Klick auf »Optionen...« klappt ein Menü herunter (Bild 2). Hier warten verschiedene Einstellungen auf Sie: VDI: RECOG verwendet nur VDI-Funktionen - langsam aber kompatibel. Unbedingt nötig, wenn Auflösungen ohne L1NEA verwendet werden (einfach ausprobieren). In diesem Modus können Sie allerdings keine Bilder laden.

LINEA: Schnell und unsauber, läuft aber auf allen Standard ST-Auflösungen (320x200, 640x200, 640x400).

Müll löschen: Ist diese Option gewählt, versucht RECOG großflächige Müll-Objekte zu löschen. Manko: Angeklebte Buchstaben - etwa bei Fettdruck -werden gelöscht, bringt aber Geschwindigkeit.

Kontakt OK: Es werden auch Buchstaben erkannt, die sich berühren oder angeklebt sind. Vor allem bei Fettschrift sollte diese Option bemüht werden. Manko: Es wird auch mehr Müll »erkannt«. Text mischen: Der alte Text wird bei einem erneuten Start nicht gelöscht.

Linksbündig: Gewöhnlich versucht RECOG den Text so auszugeben, wie es ihn auf dem Bildschirm findet: Aus einem »A« in der Mitte des Bildschirmes macht RECOG eine Zeile mit 40 Leerzeichen und einem »A«. Diese Aufblähung umgehen Sie mit dieser Option.

Text sehen: Wenn bereits ein Text erkannt wurde, können Sie diesen jetzt nochmal ansehen, löschen oder speichern.

Bild laden: Diese Option steht nur dann zur Verfügung, wenn RECOG als Programm gestartet wurde und der LINEA-Modus eingestellt ist. Es erscheint eine Dialogbox mit der Frage nach dem Bildformat. Zur Auswahl stehen DEGAS (PI1, PI2 und PI3) oder das Screenformat (32 kB Endung DOO). Die Farbpalette wird zwar nicht gesetzt, dies ist aber für die Erkennung auch nicht notwendig.

Der Quelltext

Das Programm ist in zwei Module aufgeteilt. Das Modul »DO—GEM.C« enthält die Benutzerschnittstelle und diverse GEM-Routinen. Der eigentlich interessante Teil der Schrifterkennung befindet sich in »RECOG.C«.

Über die Funktion »lerne__satz« eignet sich RECOG den gewählten Zeichensatz an. Dazu zeichnet das Modul Zeichen für Zeichen auf den Bildschirm und tastet diese Pixel für Pixel ab. Der eigentliche Trick von RECOG liegt im Format, unter dem er die gelernten Pixelhäufchen speichert. Üblicherweise legt ein OCR-Programm einen Rahmen um einen Buchstaben und speichert alle im Rahmen befindlichen Werte. RECOG geht folgendermaßen vor: Da die ungefähre Lage des Buchstabens bekannt ist, tastet RECOG diesen Bereich von links oben nach rechts unten ab. Das erste gesetzte Pixel gilt als Start des Zeichens (Funktion »lerne__char«). Es gibt allerdings etliche Zeichen, bei denen dieses Pixel nicht den äußersten linken Rand repräsentiert (etwa »j«). Aus diesem Grund holt RECOG nun zwei Blöcke zu je 16 Pixel vom Bildschirm. Der erste Block enthält 16 Pixel links vom Start, der zweite 16 Pixel rechts davon (siehe Bild 3).

Damit ist auch die maximale Größe eines Zeichens vorgegeben. Diese Blöcke werden in die Struktur BMAP (»GLOBALH«) eingetragen. Dabei stellt RECOG auch gleich die Höhe des Zeichens und dessen Ausdehnungen nach links und rechts fest und trägt diese ebenfalls ein. Dieser Vorgang wiederholt sich nun für jedes Zeichen, bis der komplette Font gelernt ist. Normalerweise geht das Programm davon aus, daß jedes Zeichen von einem 1 Pixel breiten Rand umgeben ist. Aus diesem Grund wird in den Blöcken ein NulUBit angehängt. Soll RECOG auch zusammenhängende Buchstaben erkennen, entfallen diese Bits.

Schrifterkennung

Im Prinzip arbeitet »scan__screen« ähnlich wie »lerne__satz«. Die Suche im durch den Anwender vorgegebenen Rahmen startet ebenfalls links oben. Trifft scan__screen auf ein gesetztes Pixel, beginnt die große Rechnerei. Die Funktion »is__char« holt erneut zwei 16 Punkt große Blöcke vom Bildschirm, um diese mit den gelernten zu vergleichen. Um Doppeldeutigkeiten vorzubeugen, erhält jedes Zeichen eine Prüfsumme. Diese Prüfsumme ist umso höher, je mehr Pixel in einem Buchstaben enthalten sind. Wurden mehrere Zeichen erkannt, ist das Zeichen mit der höchsten Prüfsumme der Gewinner. Erkannte Flächen löscht RECOG vom Bildschirm.

Ist der gesamte Block nach dieser Methode abgearbeitet, könnte man auf den Gedanken kommen, die ganze Arbeit wäre erledigt. Weit gefehlt. Man betrachte eine Zeichenkette wie »Hallo«: Hier sind die Zeichen unterschiedlich hoch, das »H« und die »l« sind höher als »a« und »o«. Da die Suche nach Pixeln von links oben nach rechts unten erfolgt, findet RECOG zunächst »H« und »l« vor »a« und »o«, und es kommt »Hllao« heraus.

Eine Möglichkeit dieses Problem zu umgehen wäre es, von unten nach oben zu scannen. Leider stolpern wir dabei über die Unterlängen: Aus »gegangen« würde »gggeanen«. Außerdem fallen bei beiden Methoden alle Leerzeichen unter den Tisch. Man könnte den Bildschirm auch in ein Raster von 80x25 Zeichen aufteilen und die erkannten Zeichen anhand ihrer Koordinaten den Kästchen eines solchen Rasters zuordnen. Solange nur Ausgaben von TOS-Programmen ausgewertet werden, klappt diese Methode auch prima, doch GEM läßt (un)-glücklicher-weise die pixelgenaue Positionierung von Zeichen zu. Das Zauberwort lautet SORTIEREN. Dazu speichern wir für jedes erkannte Zeichen die zugehörigen Koordinaten seiner untersten Pixelzeile. Die Sortierung nach Y-Werten hat folgende Wirkung:

Text auf dem Bildschirm:

Hallo
ihr
da
unten

Ist der X-Abstand zwischen zwei Zeichen größer als die maximale Breite der Zeichen im Font, sind ein oder mehrere Leerzeichen zwischen ihnen enthalten. Bei der Ausgabe des erkannten Textes fügen wir diese Leerzeilen wieder ein. Damit haben wir das ursprüngliche Aussehen des Textes auf dem Bildschirm wieder hergestellt. Diese letzte Veränderung entfällt jedoch, falls Sie unter Optionen »linksbündig« gewählt haben. Für Programmierer eröffnet sich sicher noch ein weites Feld der Optimierung. So wäre es der Geschwindigkeit sicher zuträglicher, die Pixel nicht einzeln vom Bildschirm zu schaben, sondern via VDI einen ganzen Block einzulesen und diesen dann zu bearbeiten. Viel Spaß beim Probieren. (ah)


Richard Kurz
Aus: TOS 04 / 1992, Seite 105

Links

Copyright-Bestimmungen: siehe Über diese Seite