Technische Universität München

Institut für Informatik

Forschungs- und Lehreinheit Informatik IX

Implementierung eines Systems zur

Schriftzeichenerkennung Diplomarbeit Stefan Kaintoch

Themensteller: Prof. Dr. Bernd Radig
Betreuer:  Dr. Wolfgang Eckstein
Abgabetermin: 15. November 1998

Hiermit erkläre ich, daß ich die Diplomarbeit selbständig verfaßt und keine anderen als die angegebenen Quellen und Hilfsmittel verwendet habe.

München, den 15.November 1998

Stefan Kaintoch

Inhaltsverzeichnis

1 Aufgabenstellung 8

2 Überblick über OCR 10

2.1 Allgemeine Vorgehensweise . . . . . . . . . . . . . . . . . . . . 10 2.1.1 Vorverarbeitung . . . . . . . . . . . . . . . . . . . . . . 11 2.1.2 Segmentierung . . . . . . . . . . . . . . . . . . . . . . 14 2.1.3 Klassifizieren . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.4 Nachbearbeitung . . . . . . . . . . . . . . . . . . . . . 19

2.2 Einordnung nach Schrift . . . . . . . . . . . . . . . . . . . . . 20 2.2.1 Maschinenschrift . . . . . . . . . . . . . . . . . . . . . 20 2.2.2 Blockschrift . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.3 Fließschrift . . . . . . . . . . . . . . . . . . . . . . . . 23

2.3 Anwendungsfälle . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.3.1 Frei formatierter Text . . . . . . . . . . . . . . . . . . 23 2.3.2 Formulare . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.3.3 Dokumentarchivierung . . . . . . . . . . . . . . . . . . 24

3 Analyse von HSFSYS2 26 3.1 Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2 Ablaufstruktur und Analyseverfahren . . . . . . . . . . . . . . 27

3.2.1 Segmentierung . . . . . . . . . . . . . . . . . . . . . . 27 3.2.2 Zeichenerkennung . . . . . . . . . . . . . . . . . . . . . 33

3.3 Implementierungsdetails von HSFSYS2 . . . . . . . . . . . . . 33 3.3.1 Internes Format von Bildern . . . . . . . . . . . . . . . 33 3.3.2 Segmentierung des Eingabefeldes . . . . . . . . . . . . 34 3.3.3 Datenbasis für Zeichenerkennung . . . . . . . . . . . . 34

3.4 Bewertung von HSFSYS2 . . . . . . . . . . . . . . . . . . . . 36

4 Nutzung in HALCON 38 4.1 Nutzbare Komponenten aus HSFSYS2 . . . . . . . . . . . . . 38 4.2 Vorhandene OCR in HALCON . . . . . . . . . . . . . . . . . 39 4.3 Randbedingungen der HALCON-Operatoren . . . . . . . . . . 39

4.3.1 Format der grafischen Eingabedaten . . . . . . . . . . 39 4.3.2 Trainingsdaten . . . . . . . . . . . . . . . . . . . . . . 40 4.3.3 Einzeilige vs. mehrzeilige OCR . . . . . . . . . . . . . 40

4.4 Definition der HALCON-Operatoren . . . . . . . . . . . . . . 40

4.4.1 hsfsys remove border . . . . . . . . . . . . . . . . . . 40

4.4.2 hsfsys segment multiline . . . . . . . . . . . . . . . 41
4.4.3 hsfsys segment singleline . . . . . . . . . . . . . . 41
4.4.4 hsfsys load training data . . . . . . . . . . . . . . . 42
4.4.5 hsfsys free training data . . . . . . . . . . . . . . . 43

4.4.6 hsfsys ocr single . . . . . . . . . . . . . . . . . . . . 43

5 Implementierung 45

5.1 Grundsätzliche Designentscheidungen . . . . . . . . . . . . . . 45 5.1.1 Anbindung an HALCON . . . . . . . . . . . . . . . . . 45 5.1.2 Lowlevel-Grafikroutinen . . . . . . . . . . . . . . . . . 46 5.1.3 HALCON-Grafikdaten vs. HSFSYS2-Grafikdaten … 47 5.1.4 Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . 47

5.2 Supply-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . 48 5.3 Globale Variablen . . . . . . . . . . . . . . . . . . . . . . . . . 48 5.4 Anpassung von Pfadnamen . . . . . . . . . . . . . . . . . . . . 49

6 Beispiele und Fazit 51 6.1 Komplette Beispiele . . . . . . . . . . . . . . . . . . . . . . . . 51 6.2 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

A Verwendete Abkürzungen und Begriffe 55

Abbildungsverzeichnis

2.1 Ablauf der OCR . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.1 Aufteilen in Zeilen . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2 “Zerbrochene” Zeichen . . . . . . . . . . . . . . . . . . . . . . 31 3.3 Zeichen, die aus mehreren Linien bestehen . . . . . . . . . . . 31 3.4 Zwei Zeichen, die sich berühren . . . . . . . . . . . . . . . . . 32 3.5 Mehr als zwei Zeichen, die sich berühren . . . . . . . . . . . . 32

6.1 Beispiel: Einzeiliger Text . . . . . . . . . . . . . . . . . . . . . 51 6.2 Beispiel: Ziffern . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6.3 Beispiel: Mehrzeiliger Text . . . . . . . . . . . . . . . . . . . . 52 6.4 Beispiel: Gedruckter Text . . . . . . . . . . . . . . . . . . . . 53

Tabellenverzeichnis

3.1 Trefferquoten . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.1 Zuordnung von HALCON-Operatoren zu Supply-Funktionen . 48

Verzeichnis der Source-Listings

1 Ablaufstruktur bei der Zeichenerkennung . . . . . . . . . . . . 28 2 Laden eines Bildes in HSFSYS2 . . . . . . . . . . . . . . . . . 34 3 Konvertieren eines Bildes in HSFSYS2 . . . . . . . . . . . . . 35 4 Verflechtung von Funktionalität in der Funktion

    iso handprint in box() (in src/lib/hsf/isoprint.c) . 47

5 Verwaltung der Klassifikator-Daten . . . . . . . . . . . . . . . 49

Kapitel 1

Aufgabenstellung

In der Forschungs- und Lehreinheit IX der Technischen Universität München wurde in den letzten Jahren das Bildverarbeitungssystem HALCON, vormals HORUS, entwickelt.

Es enthält eine Vielzahl von Operatoren zur Bildverarbeitung und Mustererkennung. Darunter sind auch solche zur Erkennung von Schriftzeichen (OCR). Sie klassifizieren Zeichen durch bestimmte Merkmale, wie das Verhältnis von Breite zu Höhe, Anisometrie, Kompaktheit, Anzahl der Zusammenhangskomponenten, Neigung der Zeichen, Anzahl der Löcher und einige mehr. Diese Eigenschaften sind bei Handschrift teilweise starken Schwankungen unterworfen. Das gilt innerhalb eines Schriftstückes und noch viel mehr bei unterschiedlichen Autoren. Ferner setzen die Prozeduren voraus, daß die zu erkennenden Zeichen bereits einzelnen (segmentiert) vorliegen, was bei Handschrift normalerweise nie gegeben ist. Insgesamt sind die OCR-Operatoren in HALCON nicht besonders gut für Handschriftenerkennung geeignet.

Am National Institute of Standards and Technology (NIST) der USA wurde seit Anfang der 90er Jahre das Handschriftenerkennungssystem HSFSYS2 entwickelt. Es hat die Aufgabe handschriftliche Eintragungen in vorgegebenen Feldern eines Formulars zu “lesen”.

HSFSYS2 hat mehrere Entwicklungsstufen durchlaufen, in denen Verbesserungen bei der grafischen Vorverarbeitung (Segmentierung) und bei der Klassifikation der Zeichen vorgenommen wurden, bis man die heutige recht zuverlässige Version erhielt. Deren Trefferquote liegt teilweise, in Abhängigkeit von der zu erkennenden Zeichenmenge, bei ca. 95%.

HSFSYS2 ist als “public domain”-Software beim NIST für jedermann erhältlich und darf für eigene Bedürfnisse eingesetzt und angepaßt werden.

So liegt es nahe, die OCR-Funktionalität von HALCON basierend auf HSFSYS2 zu erweitern. Zielsetzung ist es also, HALCON mit einer Handschriftenerkennung zu versehen, die allgemein verwendbar ist. Sie sollte nicht den Einschränkungen von HSFSYS2 unterliegen, z.B. der ausschließlichen Verwendbarkeit zur OCR in Formularen.

Für den Benutzer von HALCON ergeben sich dadurch erweiterte Anwendungsmöglichkeiten. Denkbar wäre ein EDV-basiertes Archivierungssystem für medizinische Akten, das sowohl Bildinformationen, z.B. Röntgenbilder, als auch handschriftliche Eintragungen in unterschiedlichen Formularen, sowie Notizen auf Bildern erkennt.

Für den HSFSYS2-Anwender ergeben sich aus der Synthese ebenfalls deutlich verbesserte Möglichkeiten. Insbesondere ist er nicht mehr auf fest definierte Orte innerhalb eines Formulars angewiesen, in denen Handschrift gefunden wird, sondern er könnte die vielfältigen Möglichkeiten von HALCON benutzen, um den Text zu finden und ihn erst dann mit der OCR analysieren.

Überblick über OCR

Dieses Kapitel gibt einen kurzen Überblick über Methoden und Verfahren der OCR. Die Aufgabe der OCR ist es aus Dokumenten den darin enthaltenen Text zu extrahieren und in maschinenlesbarer Form abzulegen. Im allgemeinen heißt das, daß am Anfang des Prozesses ein Bild eingescannt wird und an seinem Ende eine geordnete Menge von Zeichen mit ihren Trefferwahrscheinlichkeiten vorliegt. Zum Prozess gehört dabei auch eine Analyse des Bildmaterials auf Stellen, die überhaupt Text enthalten. Darauf wird hier nicht näher eingegangen. Häufig ist diese Analyse auch nicht notwendig, da durch das Einsatzgebiet bekannt ist, an welchen Stellen sich Text befinden kann. Dies gilt z.B. für Formulare mit fest umrissenen Eingabefeldern.

2.1 Allgemeine Vorgehensweise

Es wird davon ausgegangen, daß das Bildmaterial bereits in digitalisierter Form vorliegt. Es wird also nicht näher auf die Erfassung der Bilddaten eingegangen. Im allgemeinen hat die Schrifterkennung den Ablauf wie er in Abbildung 2.1 (Seite 11) dargestellt ist.

Die einzelnen Schritte bewirken im Detail:

Vorverarbeitung: Das Bild wird ohne Berücksichtigung des Inhalts aufbereitet. Dazu gehört Entfernen von Rauschen, Entfernen von Hintergrundbildern, Beseitigung geometrischer Verzerrungen, Umwandlung in ein binäres oder Grauwertformat, usw.

Segmentierung: In diesem Schritt werden die einzelnen Schriftzeichen aus dem Bild extrahiert.

Klassifizierung: Es werden den Bilddaten der extrahierten Schriftzeichen entsprechende Maschinencodes zugeordnet. Diese Aufgabe besteht aus

[figure: Klassifizierung; Nachbearbeitung; Vorverarbeitung; Segmentierung]

Abbildung 2.1: Ablauf der OCR

dem Extrahieren bestimmter Eigenschaften (Features) der Bilddaten und dem Bestimmen der Zeichenklasse mittels der Features.

Nachbearbeitung: Die gewonnenen Zeichen werden in Zusammenhang gebracht und die Korrektheit überprüft bzw. verbessert. Dazu können Lexika benutzt werden oder andere Kontextinformationen.

2.1.1 Vorverarbeitung

Ziel der Vorverarbeitung ist es das Bildmaterial so vorzubereiten, daß die später folgende Segmentierung vereinfacht wird. Da keinerlei Annahmen über den Inhalt des Bildes getroffen werden, dürfen Änderungen nur vorgenommen werden, wenn dabei keine Bildinformation verloren geht. Das beinhaltet in erster Linie Ausrichten des Bildes in eine vorgegebene Orientierung und Entfernen von Rauschen.

In manchen Fällen ist auch Wissen über das Eingangsbild notwendig, z.B. wenn man einen Texteingaberahmen in einem Formular oder eine Textur entfernen will.

Lineare Transformationen

Lineare Transformationen dienen dem Rotieren, Verschieben, Scheren und Skalieren des Bildmaterials. Sie werden durch die Formel

( \begin{matrix}x′ \\ y′ \end{matrix} ) = ( \begin{matrix}a_{11} & a_{12} \\ a_{21} & a_{22} \end{matrix} ) ( \begin{matrix}x \\ y \end{matrix} ) + ( \begin{matrix}b_{1} \\ b_{2} \end{matrix} )

beschrieben. Der Vektor ( \begin{matrix}b_{1} \\ b_{2} \end{matrix} ) bestimmt die Translation des Bildes und

die anderen Parameter haben folgende Bedeutung

Translation  a_{ij} = 0
Skalierung  a_{12} = a_{21} = 0
Rotation um den a_{11} = cos α a_{12} = − sin α
Winkel α  a_{21} = sin α a_{22} = cos α
Scheren um den a_{11} = 1  a_{12} = tan β
Winkel β  a_{21} = 0  a_{22} = 1

Abschätzung der Transformationsparameter

Um geometrische Verzerrungen ausgleichen zu können, ist es grundsätzlich notwendig Informationen über den Bildaufbau zu haben. Ein Beispiel: Ist das gescannte Bild gedreht, so muß man die Möglichkeit haben, die Koordinatenachsen finden zu können, da sonst nicht bestimmt werden kann um welchen Winkel das Bild gedreht ist.

Solche Informationen können mittels Wissen über die Struktur der Bilder gefunden werden. Texte sind normalerweise zeilenweise aufgebaut. Also liegen die Koordinatenachsen sinnvollerweise parallel und orthogonal zu den Zeilen. Durch Histogramme kann man die Lage der Zeilen bestimmen und somit eine Rotation des Bildes ausgleichen.

Es können außer solch allgemeinen Informationen wie Zeilenstruktur auch vom jeweiligen Anwendungsfall abhängige Informationen benutzt werden. Bei Formularen z.B. gibt es normalerweise grafische Elemente wie Rahmen, Hinweistexte, usw. , die in allen Bildern gleich sind. Sie können auch zur optischen Korrektur benutzt werden.

Lineare Filter

Lineare Filter werden benutzt um die Bildqualität zu verbessern. Man kann mit ihnen Rauschen unterdrücken, Kanten erkennen und einiges mehr. Hier werden nur einige Filter mit endlicher Impulsantwort betrachtet.

i_{0}(k, l) = i(k, l) ∗ f(k, l) = ∑_{k′=−∞}^{∞} ∑_{l′=−∞}^{∞} i(k − k′, l − l′) · f(k′, l′)

i_{0}(k, l) ist dabei die Impulsantwort im Punkt (k, l), i(k, l) sein Grauwert und f(k, l) die Filtermaske. f(k, l) ist von endlicher Ausdehnung. Außerhalb des Maskenbereiches werden die Werte auf 0 gesetzt. Da i(k, l) und die Werte der Filtermaske endlich sind, ist auch die Impulsantwort i_{0}(k, l) endlich.

Hier einige nützliche Filter:

Tiefpass:  \frac{1}{16} [ \begin{matrix}1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{matrix} ]

Laplace-Kanten-Detektor:  \frac{1}{8} [ \begin{matrix}−2 & 1 & −2 \\ 1 & 4 & 1 \\ −2 & 1 & −2 \end{matrix} ]

Die Ergebnisse der Filterung müssen im allgemeinen noch nachbearbeitet werden. Um z.B. mit dem Laplace-Filter Kanten zu finden, muß das Ergebnis der Filterung noch auf Nulldurchgänge untersucht werden, die dann die Kanten sind.

Rank-order Filter

Hierbei handelt es sich um nicht-lineare Filter. Man erhält sie, indem man eine 3 ∗ 3-Umgebung S_{kl} = {i(k′, l′) | |k′ − k| ≤ 1, |l′ − l| ≤ 1} um den Grauwert i(k, l) betrachtet. Wenn R_{kl} die geordnete Sequenz der Grauwerte um (i, k) ist mit R_{kl} = {r_{1} ≤ r_{2} ≤ ⋯ ≤ r_{9} | r_{j} ∈ S_{kl}}, dann sind die Filter wie folgt definiert

Erosion: i_{0}(k, l) = r_{1}
Dilatation: i_{0}(k, l) = r_{9}
Kontur-Erkennung: i_{0}(k, l) = r_{9} − r_{1}
Median: i_{0}(k, l) = r_{5}

Der Median-Filter ist besonders dazu geeignet Rauschen zu unterdrücken ohne dabei das Bild unschärfer zu machen.

Schwellwertbildung

Wenn das Eingangsbild von guter Qualität ist, kann man es auch direkt in ein Binärbild umwandeln. Dazu legt man einen Schwellwert fest. Ist der Grauwert eines Pixels größer als der Schwellwert, wird das Pixel gesetzt; ansonsten gelöscht. Das Verfahren kann noch verbessert werden, indem man den Schwellwert dynamisch bestimmt. Dazu legt man fest wieviele Prozent der Pixel innerhalb des Bildes gesetzt sein sollen und bestimmt den Schwellwert entsprechend. Analog läßt sich das auch auf eine Umgebung des gerade untersuchten Punktes anwenden. So erhält man einen adaptiven Schwellwert.

Durch Schwellwertbildung lässen sich subtile Änderungen im Grauwert des Hintergrundes sehr leicht entfernen ohne die Bildqualität zu beeinträchtigen. Diese Änderungen entstehen normalerweise immer beim Scannen eines Bildes.

2.1.2 Segmentierung

Um einzelne Zeichen aus einem Bild zu extrahieren muß das Bild segmentiert werden. Im Normalfall läßt sich keine generelle Methode angeben um das Bild in einzelne Zeichen zu zerlegen. Die Vorgehensweise ist stark abhängig von den erwarteten Bilddaten. So ist für eine Handschrift eine völlig andere Vorgehensweise notwendig als für gedruckte Schrift. Bei letzterer überschneiden sich normalerweise keine Zeilen. Und auch die einzelnen Zeichen sind bei ihr bis auf Ausnahmen klar getrennt.

Hier werden einige Methoden vorgestellt, die das Eingangsbild in Komponenten zerlegen aber normalerweise noch keine einzelnen Zeichen als Resultat liefern.

Zusammenhangskomponenten

Das Bild wird von links nach rechts und oben nach unten auf gesetzte Pixel untersucht. Das erste gefundene gesetzte Pixel erhält eine eindeutige Ordnungsnummer. Alle direkt in der Zeile mit dem ersten Pixel zusammenhängenden Pixel erhalten dieselbe Ordnungsnummer. Alle Pixel eines zusammengehörigen horizontalen Laufs erhalten dieselbe Ordnungsnummer. Für jede neue Zeile, die Pixel enthält, wird untersucht, ob in der unmittelbar darüber liegenden Zeile benachbarte Pixel mit einer Ordnungsnummer existieren. Ist das der Fall, erhalten die neuen Pixel deren Ordnungsnummer. Existieren keine solche Nachbarn, so wird eine neue eindeutige Ordnungsnummer vergeben.

Das Ergebnis sind Mengen von Pixeln. Solche mit gleicher Ordnungsnummer gehören zur selben Zusammenhangskomponente, sind also durch einen Pfad von Pixeln direkt verbunden.

X-Y-Zerlegung

Die meisten Dokumente haben eine horizontale Zeilen- und vertikale Spaltenstruktur. So liegt es nahe, die Anzahl der Pixel in einer Zeile an die X-Achse zu projezieren. Unterschreitet die Projektion einen bestimmten Wert, betrachtet man die Pixelzeile als ohne Inhalt. Auf diese Weise ergeben sich Bereiche, die Textzeilen enthalten und solche ohne Nutzinformation.

Innerhalb der gefundenen Zeilen geht man analog vertikal vor und erhält auf diese Weise Spalten mit und ohne Text.

Das Verfahren wendet man abwechselnd in horizontaler und vertikaler Richtung auf die im vorhergehenden Schritt gefundenen Segmente an, bis keine weitere Zerlegung mehr stattfindet. Die sich typischerweise daraus ergebende Datenstruktur ist ein Baum, an dessen Wurzel sich das gesamte Dokument befindet, und dessen Blätter die einzelnen Zeichen bilden.

Das Verfahren ist nicht anwendbar auf umschlossene Figuren, also solche die mit einem Rahmen versehen sind, kann aber trotzdem zur Vorsegmentierung benutzt werden. Im Idealfall erhält man am Ende eine Liste von Regionen wobei jede Region genau ein Zeichen repräsentiert.

Lauflängen-Verschmieren

Auch dieses Verfahren setzt voraus, daß eine klare horizontale und vertikale Anordnung der Zeichen vorliegt. Es muß also eine vorhandene Drehung des Bildes ausgeglichen werden.

Man überstreicht das Bild horizontal von links nach rechts und “verschmiert” dabei jedes Pixel in der Bewegungsrichtung. Dazu werden erst die Läufe ohne gesetzte Pixel bestimmt und diejenigen, die kürzer als eine Länge n sind, durch gesetzte Pixel ersetzt. Also wird mit n = 3 aus der Zeile

000110010100001110000

die Zeile

000111111100001110000

Man erhält so Bänder zusammenhängender Pixel, die eine gute Näherung für die Zeilenstruktur des Dokuments darstellen.

Wendet man dasselbe Verfahren vertikal an und bildet die Schnittmenge aus beiden Resultaten, so erhält man Segmente, die die Zeilen und Spalten wiedergeben.

2.1.3 Klassifizieren

Vor der eigentlichen Klassifikation der Zeichen empfielt es sich die Bilder der Zeichen auf eine feste Größe zu skalieren. Das hat den Effekt, daß bestimmte Merkmale, die größenabhängig sind, vergleichbar werden. Für die Normalisierung können wieder die linearen Transformationen aus Abschnitt 2.1.1 (Seite 11) verwendet werden.

Bestimmung der Eigenschaften

Um das segmentierte Abbild eines Zeichens eben diesem Zeichen zuordnen zu können, müssen Eigenschaften des Zeichens aus dem Bild gewonnen werden mittels derer bestimmt wird um welches Zeichen es sich handelt.

Geometrische Eigenschaften Die im folgenden aufgezählten Eigenschaften dienen der groben Einordnung eines Zeichens. Im allgemeinen können sie nicht direkt zur Klassifizierung benutzt werden, außer man verwendet mehrere Eigenschaften gleichzeitig.

Einige der Eigenschaften sind nicht invariant gegen Skalierungen. Will man sie benutzen, so darf man das entweder nur bei Zeichen mit immer identischer Größe, oder muß sie durch eine Operation invariant machen.

Die Aufzählung ist nicht vollständig.

• Breite und Höhe eines Zeichens und deren Verhältnis. Breite und Höhe sind nicht invariant gegen Skalierungen.

• Die relative Anzahl der Vordergrundpixel.

• Anisometrie, das ist das Verhältnis der beiden Halbachsen einer Ellipse mit derselben Massenträgheit des Zeichens.

• Die Kompaktheit = U^{2}/(4π·A) mit U als Umfang und A als Fläche des Objekts ist ein Maß dafür wie stark die Pixel über die gesamte Fläche verteilt sind.

• Die Konvexität ist definiert als C = F_{o}/F_{c} mit F_{o} ist die originale Fläche des graphischen Objekts und F_{c} die Fläche seiner konvexen Hülle. Also gilt C = 1, wenn das Objekt konvex ist (z.B. Kreise, Dreiecke) und C < 1 falls das Objekt nicht konvex ist, es also “Dellen” oder Löcher hat.

• Die Neigung eines Objekts.

• Anzahl der Zusammenhangskomponenten.

• Anzahl der Löcher.

• Die horizontale und vertikale Projektion der Grauwerte.

• Die binäre Coocurrence-Matrix des Zeichens.

Momente Die Momente eines graphischen Objekts sind allgemein definiert als

M_{pq} = ∫ ∫_{D} i(x, y) · x^{p}y^{q}dxdy

Dabei ist p + q der Grad des Moments, i(x, y) das Grauwertbild des Objekts und D seine räumliche Ausdehnung, also seine Region. Derartige Momente sind vom Ort des Objekts abhängig. Deswegen bezieht man die Momente auf das Zentrum des Objekts und erhält die vom Ort unabhängigen Zentralmomente

M_{pq}^{c} = ∫ ∫_{D} i(x, y) · (x − x̄)^{p}(y − ȳ)^{q}dxdy

mit

x̄ = \frac{M_{10}}{M_{00}} und ȳ = \frac{M_{01}}{M_{00}}

Für Binärbilder (mit Vordergrund = 1 und Hintergrund = 0), also Regionen, gilt M_{00} ist die Fläche des Objekts und M_{10} ist die x-Koordinate und M_{01} die y-Koordinate des Schwerpunkts des Objekts.

Weitere Momente sind

Φ_{1} = M_{20}^{c} + M_{02}^{c}

und

Φ_{2} = (M_{20}^{c} − M_{02}^{c})^{2} + 4 · (M_{11}^{c})^{2}

Sie sind invariant gegen die Orientierung eines Objekts.

Entsprechende Momente gibt es auch mit höherer Ordnung. Sie alle eignen sich als Eigenschaften zur Erkennung von Zeichen. Allerdings ist zu beachten, daß Momente höherer Ordnung sehr empfindlich auf Bildrauschen reagieren.

Zur Berechnung der Momente zweiten Grades einer Region verwendet man die Formel

M_{pq} = \frac{1}{F^{2}} ∑_{r,c}(r_{0} − r)^{p}(c_{0} − c)^{q}

mit r_{0}, c_{0} sind die Zeilen- und Spaltenkoordinaten des Zentrums der Region R mit der Fläche F. Dabei laufen die Koordinaten r und c über alle Pixel der Region.

Orthogonale Transformationen Das Eingangsbild kann als Vektor f betrachtet werden, dessen Komponenten das Grauwert- oder Binärbild darstellen. Als Merkmal werden nicht die Komponenten des Vektors f benutzt, sondern ein Vektor g, dessen Komponenten die Linearkombination der Komponenten von f sind.

g = T · f

Dabei ist T eine Matrix von konstanten Komponenten. Es gibt verschiedene Transformationen, die so benutzt werden können, z.B. Fourier, Cosinus oder Hadamard. Diese Transformationen sind allerdings nicht für alle Anwendungen geeignet. Es ist im Einzelfall zu entscheiden, ob und wenn welche verwendbar ist.

Eine andere Transformation ist die Karhunen Loève-Transformation. Sie wird im Gegensatz zu den vorherigen Transformationen aus experimentellen Daten der jeweiligen Applikation gewonnen. Sie ist definiert als

g = T^{t} · (f − f̄)

mit

f̄ = \frac{1}{N} ∑_{i=1}^{N} f_{i} .

f̄ ist also der Durchschnittsvektor der Beispiel-f_{i}. Der obere Index t (in T^{t}) bedeutet dabei das Transponieren der Matrix T. Jede Spalte von T ist ein Eigenvektor der Beispiel-Kovarianzmatrix

C = \frac{1}{N} ∑_{i=1}^{N}(f_{i} − f̄)^{t}(f_{i} − f̄) .

Jeder Eigenvektor korrespondiert mit einem Eigenwert. Es ist üblich nur die Eigenvektoren zu benutzen, die zu den M < N größten Eigenwerten gehören. Dadurch erreicht man eine Einschränkung der Bewertungskriterien.

Klassifikatoren

Die Aufgabe der Klassifikatoren ist es, die aus den segmentierten Zeichen gewonnenen Eigenschaften, bestimmten Klassen zuzuordnen. Dabei steht normalerweise eine Klasse für genau einen Zeichencode. Üblicherweise müssen die Klassifikatoren mittels Beispieldaten trainiert werden.

Polynomialer Klassifikator Der Polynomiale Klassifikator besteht aus zwei Schichten. Die erste Schicht x(v) besteht aus der polynomialen, also multiplikativen, Kombination der originalen Eigenschaften v_{m}. Dies sind die erweiterten Eigenschaften x_{s}(v) = Π_{s}v_{m}^{i}.

Für die originalen Features v_{1} und v_{2} beinhaltet die erste Schicht die erweiterten Eigenschaften 1, v_{1}, v_{2}, v_{1}v_{1}, v_{1}v_{2} und v_{2}v_{2} für einen vollständigen quadratischen Klassifikator.

Die zweite Schicht wird gebildet durch die Linearkombination der erweiterten Eigenschaften x_{s} mit der Koeffizientenmatrix W. Dabei wird ein bestimmter Wert d(v) einer bestimmten Klasse zugeordnet. Also ist der polynomiale Klassifikator definiert als

d_{P C}(v) = W · x(v)

Die erste Schicht x(v) des Klassifikators wird dabei vom Entwickler bestimmt. Die zweite hingegen ergibt sich automatisch aus den Trainingsdaten.

Multilayer Perceptron Die kleinste Einheit eines Multilayer-Perceptron-Klassifikators (MLP) ist das Neuron. Es bildet die Linearkombination seiner Eingangswerte und modifiziert das Ergebnis mit einer nichtlinearen Funktion. Es ergibt sich also:

out_{j} = σ(bias_{j} + ∑_{i} w_{ij} · in_{i})

Alle Neuronen, die auf denselben Eingaben basieren, werden in der nächst größeren Einheit, dem Layer, zusammengefaßt. Das MLP besteht aus mehreren Layers, wobei die Ausgabe eines Layers als Eingabe für das nächste dient. Betrachtet man den den Term bias_{j} als weitere Eingabe mit dem konstanten Wert 1 und dem Faktor bias_{j} so läßt sich das MLP beschreiben als

d_{MLP} (v) = σ(W_{H}^{T} ⋯ σ̃(W_{1}^{T} · ṽ))

Dabei sind die W_{i}^{T} die Matrizen mit den Gewichten der Eingangsparameter und die Notation mit der Tilde bedeutet, daß der konstante Eingangswert 1 einbezogen wurde.

Die Gewichtungen müssen durch Beispieldaten gefunden werden. Die Anzahl der “versteckten” Layers ist eine Designentscheidung des Entwicklers, ebenso wie die Anzahl der Neuronen in den “versteckten” Layers. Lediglich die Anzahl der Neuronen im Eingangslayer (= Anzahl der verwendeten Features) und die Anzahl der erkannten Klassen sind durch das Klassifizierungsproblem vorgegeben.

Radial Basis Function Das RDB besteht wie der Polynomiale Klassifikator aus zwei Schichten. Die erste Schicht berechnet die euklidischen (oder auch andere) Abstände z zwischen einem Eingangsvektor v und einer Menge von Referenzvektoren r_{i}, auch Prototypen genannt. Jeder Abstand wird dann mit einer exponentiell wachsenden Funktion gewichtet: ϱ_{i}(z) = e^{−z/c_{i}}.

Die zweite ist wieder eine Linearkombination der Basisfunktionen ϱ(z). So ergibt sich für die unterschiedlichen Klassen:

d_{RBF} _{k}(v) = ∑_{i} w_{ik} · ϱ_{i}(∥v − r_{i}∥^{2})

2.1.4 Nachbearbeitung

Die wenigsten OCR-Systeme liefern ohne weitere Nachbearbeitung der Resultate des Klassifikators ausreichende Ergebnisse. Also benötigt man Methoden um die Resultate zu verbessern.

Mehrerer Klassifikatoren: Durch die Verwendung mehrerer Klassifikatoren lassen sich die Stärken einzelner Klassifikatoren besser ausnutzen und so die Schwächen der anderen vermeiden. lexikalische Nachbearbeitung: Anhand eines Lexikons wird bestimmt

welches Wort am wahrscheinlichsten durch eine bestimmte erkannte Zeichenfolge dargestellt wird. Entsprechende Korrekturen können dann vorgenommen werden. Diese Methode eignet sich besonders, wenn man von einem kleinen Wortschatz ausgehen kann, z.B. bei Fachliteratur.

Wortkontext: Dieser Methode basiert darauf, daß der erkannte Text bereits in Worte aufgeschlüsselt ist. Da Worte normalerweise nicht für sich isoliert stehen, ist es möglich Aussagen über einen sinnvollen Kontext des Wortes zu machen. So kann man Wahrscheinlichkeiten für die Kombination eines Wortes mit anderen angeben oder die Häufigkeit von Worten in einem Text. Diese Aussagen kann man benutzen um Hypothesen über Texte anzunehmen oder abzulehnen.

2.2 Einordnung nach Schrift

Das bisher Gesagte macht keinerlei Annahmen über die Art von Schrift, die analysiert wird. Die einzigen Voraussetzungen, die erfüllt sein müssen, sind eine zeilen- oder spaltenweise Anordnung der Zeichen und daß jedes Zeichen einen gedachten umgebenden Rahmen besitzt, der sich mit den Rahmen der anderen Zeichen möglichst wenig überschneidet. Letztere Voraussetzung ist nur für die Segmentierung notwendig um einzelne Zeichen voneinander ohne Kenntnis ihres Inhalts, also der Zeichenklasse, unterscheiden zu können.

Normalerweise werden die Voraussetzungen erfüllt. Dies trifft auch auf orientalische Schriften, wie die Hanschriften aus China, Japan und Korea, zu. Allerdings werden die Bedingungen nicht bei allen Schriftarten gleich gut erfüllt und man muß die verwendeten Algorithmen entsprechend anpassen.

2.2.1 Maschinenschrift

Maschinenschriften haben den Vorteil, daß sie immer gleich reproduziert werden. Das erleichtert die OCR erheblich.

Segmentierung

Die Segmentierung der Zeichen ist normalerweise relativ einfach. Ein Zeichen ist üblicherweise eine Zusammenhangskomponente. Ausnahmen davon sind eher selten und meistens bekannt, z.B. die Zeichenfolgen “ff” und “ffi”, bei denen eine Zusammenhangskomponente aus mehreren Zeichen besteht, oder die Buchstaben “i” unf “j”, die aus mehreren Teilen bestehen. Solche Sonderfälle lassen sich leicht durch feste Regeln ohne Kontextwissen erkennen, z.B. durch Betrachtung des Verhältnisses von Breite zu Höhe der Zusammenhangskomponente bei “ffi”.

Auch die Zeilenerkennung ist durch die oben beschriebenen Methoden, insbesondere Lauflängen-Verschmieren und X-Y-Zerlegung, möglich.

Klassifizierung

Feste Zeichensätze Sind feste Zeichensätze gegeben, so kann man sich beim Klassifizieren auf wenige, aussagekräftige Merkmale eines Zeichens beschränken, die ausreichend sind um verschiedene Zeichen unterscheiden zu können. Da ferner zwei identische Zeichen keine signifikanten optischen Unterschiede aufweisen, genügt es den Klassifikator einmal je Zeichen zu trainieren.

Man könnte sogar einen Klassifikator benutzen, der sich nicht auf die Features der Zeichen stützt, sondern direkt deren Bilder mit Musterbildern vergleicht. Das würde natürlich die Rechenzeit ungünstig beeinflussen, da der Vergleich eines extrahierten Bildes mit n Prototypen normalerweise mehr Einzelvergleiche beinhaltet als das Gewinnen der Eigenschaften des Bildes und n Vergleiche mit Prototypen-Eigenschaften.

Wechselnde Zeichensätze Das Segmentieren eines Bildes in Zeichen ist bei wechselnden Maschinenzeichensätzen identisch zu dem mit festen Schriften, da dieselben Randbedingungen gelten: Kaum Überschneidungen und eindeutige Zeilenstrukturen.

Das Klassifizieren wird allerdings erschwert, da eine Zeichenklasse unterschiedlichste Ausprägungen haben kann. Dafür gibt es folgende Lösungsansätze:

• Durch Verwendung mehrerer Klassifikatoren läßt sich für jeden vorkommenden Schrifttyp ein spezialisierter Klassifikator verwenden, der Zeichen dieser Schrift zuverlässig erkennt. Das beschränkt natürlich die möglichen Zeichensätze auf eine endliche Anzahl. Analog dazu wäre das Trainieren von unterschiedlichen Erscheinungsformen desselben Zeichens. Diese Methode ist insgesamt nicht sehr vielseitig einsetzbar, da für jeden neuen Zeichensatz neu trainiert werden muß.

• Die Merkmale werden so geeignet gewählt, daß auch die Erkennung einer Zeichenklasse aus unterschiedlicher Schrifttypen möglich ist. Das erfordert eine sorgfältige Auswahl der Prototypen mittels derer der Klassifikator trainiert wird und außerdem auch eine ausreichende Anzahl an Musterzeichen, damit die Gewichtungen der Merkmale im Klassifikator geeignet gesetzt werden können. Diese Methode erlaubt es auch unbekannte Zeichensätze zu erkennen, wenn sie nur eine hinreichende Ähnlichkeit mit den Trainierten haben. Sie hängt aber sehr von der geeigneten Auswahl der Features ab.

2.2.2 Blockschrift

Handschriftliche Texte sind erheblich schwerer zu erkennen als maschinengeschriebene. Das liegt in der nicht trivialen Segmentierung und den vom Schreibstil unterschiedlicher Autoren geprägten, stark differierenden Zeichen. Außerdem kommt noch die Schwierigkeit hinzu, daß gleiche Zeichen desselben Autors verschieden aussehen.

Segmentierung

Bei Handschriften läßt sich grundsätzlich keine direkte Beziehung zwischen Zusammenhangskomponenten und Schriftzeichen bilden. Ein Zeichen kann in mehrere Teile zerfallen, z.B. wenn der waagrechte und der senkrechte Strich des “T” keine Verbindung haben. Oder ein oder mehrere Teile unterschiedlicher Zeichen können sich schneiden, so daß sie eine Zusammenhangskomponente bilden. Bei Blockschriften kann man allerdings davon ausgehen, daß die Anzahl verbundener Zeichen kleiner ist als die durchschnittliche Wortlänge. Auch besteht ein Wort meistens aus mehreren Zusammenhangskomponenten.

Die oben genannten Techniken zum Zerlegen in Schriftzeichen können auch hier angewandt werden. Allerdings muß nach der Vorsegmentierung ein weiterer Arbeitsschritt stattfinden, der die Segmente den Zeichen zuordnet. Dieser Schritt kann sich an statistischen Werten orientieren, wie durchschnittliches Breite-Höhe-Verhältnis eines Zeichens oder durchschnittlicher Breite von Zusammenhangskomponenten. Dabei muß natürlich der individuelle Schreibstil und die Größe der Schrift mit in die Analyse einfliesen.

Ein weiteres Problem ist die Zeilenanalyse. Bei Handschriften bilden die Zeilen keine Geraden, sondern Kurven, die sich zudem noch überschneiden können. Es ist also notwendig eine Zeilenanalyse durchzuführen, die dem Verlauf der gefundenen Segmente folgt. Sie kann sich z.B. am Schwerpunkt der Zusammenhangskomponenten orientieren und in einem Bereich, der von Schreibrichtung und Schreibstil abhängig ist, nach dem nächsten Segment suchen.

Klassifizierung

Für eine halbwegs treffsichere Klassifizierung kommt hier der Auswahl der Erkennungsmerkmale eine besondere Bedeutung zu. Wie am National Institute of Standards and Technology (NIST) der USA in [NISTIR 5469] festgestellt wurde, ist die Karhunen Loève-Transformation geeignet um die Eingangsparameter des Klassifikators zu berechnen. Sie unterdrückt Rauschen und liefert die Features in sehr kompakter Form. Um gute Resultate zu erzielen ist es allerdings notwendig, den Klassifikator mit einer sehr großen Anzahl von Zeichen zu trainieren. Man benötigt also eine sehr breite Datenbasis, die im Normalfall schwer zu beschaffen sein dürfte.

2.2.3 Fließschrift

Auch hier treten dieselben Probleme auf wie bei Blockschrift in Abschnitt 2.2.2 (Seite 22). Allerdings sind sie noch ausgeprägter. Es gibt keine Trennung zwischen einzelnen Zeichen mehr, da es sich eben um Fließschrift handelt. Trennstellen entstehen nur noch, wenn nach einem Zeichen neu angesetzt werden muß oder ein neues Wort beginnt. Das hat allerdings den Vorteil, daß die Zeilenfindung etwas erleichtert wird, da die Zusammenhangskomponenten eine deutliche horizontale Ausrichtung haben mit einer im Schnitt signifikant größeren Breite als Höhe.

Die Hauptprobleme entstehen, da es bislang keinen sicheren Algorithmus [HCRDIA 1997] gibt, der die Zusammenhangskomponenten in Zeichen zerlegt. Deshalb wird versucht ein grundsätzlich anderes Verfahren zu benutzen. Man faßt die Handschrift als wechselndes Signal auf und extrahiert mittels Hidden-Markov Modell die Schriftzeichen aus dem Signal. Diese Methode ist ausführlich in [HCRDIA 1997] beschrieben. Sie wird auch bei der Analyse von gesprochener Sprache benutzt. Allerdings erfordert sie eine genaue sequentielle Abfolge der Schrift — ist also besser zur Online-Erkennung geeignet als zur Schrifterkennung von einem bereits beschriebenen Blatt.

2.3 Anwendungsfälle

In diesem Abschnitt werden noch kurz einige Anwendungsfälle gestreift und wie sie die Rahmenbedingungen der OCR beeinflussen.

2.3.1 Frei formatierter Text

Ein Beispiel für frei formatierten Text ist ein Brief. Er beinhaltet den Text frei verteilt über das ganze Blatt. Außerdem kann er natürlich Bilder oder sonstige nicht textuelle Information enthalten. Also steht vor der eigentlichen OCR die Aufgabe den Text von den restlichen Informationen zu trennen. Dazu kann man eines der Verfahren zur Zeilenanalyse benutzen und alle Bereiche, die nicht als Zeile einzuordnen sind, ignorieren. Dieses Verfahren ist natürlich nur ein etwas naiver Ansatz, der nur auf einfache, frei formatierte Dokumente anwendbar ist.

Bei beliebig komplexen Eingaben muß eine Dokumentanalyse durchgeführt werden. Verfahren dazu sind in [HCRDIA 1997] beschrieben.

2.3.2 Formulare

Formulare sind charakterisiert durch Strukturen auf dem Blatt, die den Formularbenutzer anleiten bestimmte Texte an bestimmte Stellen zu plazieren. Dies bringt einen erheblichen Vorteil gegenüber frei formatiertem Text mit sich: Es ist bekannt an welchen Stellen sich der Text befindet und die Analyse kann sich auf diese Orte beschränken. Außerdem wird durch die Vorgaben normalerweise auch eine grundlegende Zeilenstruktur erzwungen.

Die Orientierungshilfen auf dem Formular können dazu benutzt werden um die exakte Ausrichtung des gescannten Bildes zu bestimmen. Das führt allerdings auch dazu, daß ebendiese Orientierungshilfen vor der OCR ohne Verluste aus dem Bild entfernt werden müssen. Das ist nicht immer ganz einfach, da sich die Zeichen im Normalfall mit Rahmenlinien oder ähnlichem schneiden.

Formulare bringen häufig noch eine weitere Schwierigkeit mit sich. Eingabefelder werden mit Mustern hinterlegt um sie als vom Benutzer auszufüllendes Feld zu kennzeichnen. Bei Scheckformularen ist das in der Regel der Fall. Diese Texturen müssen mittels geeigneter Filter entfernt werden.

Um eine möglichst hohe Zuverlässigkeit der gewonnenen Informationen zu erzielen, sollten Formulare nur mit Blockschrift ausgefüllt werden.

Die OCR auf Formularen hat hohen praktischen Nutzen. Man denke nur an das automatische Erkennen von Überweisungsformularen oder die Auswertung von Umfragen, die nicht nur Kästchen zum Ankreuzen, sondern auch frei formulierten Text enthalten.

2.3.3 Dokumentarchivierung

Ein typisches Beispiel für OCR tritt an Universitäten und Bibliotheken auf. Dort müssen Dokumente, die nicht in elektronischer Form vorliegen, der Allgemeinheit auf einfache Weise und mit geeigneten Suchmethoden zur Verfügung gestellt werden. Typischerweise handelt es sich bei solchen Dokumenten um Zeitschriften.

Um die Suche zu ermöglichen genügt es nicht die Dokumente einzuscannen und die Bilder abzulegen. So könnte man nicht nach Stichworten suchen.

Also müssen die Texte mittels OCR erkannt und in Textform gespeichert werden. Da es sich hierbei fast immer um Maschinenschriften handelt, liegt das Hauptproblem in der Dokumentanalyse und dem Erkennen der Bereiche, die Text enthalten. Das ist mittels der oben beschriebenen Segmentierungsverfahren möglich. Alternativ kann man auch eines der Dokumentanalyseverfahren aus [HCRDIA 1997] benutzen.

Bei diesem Anwendungsfall ist es nicht so wichtig, daß die Resultate 100prozentig korrekt sind, da die Texte ja von Menschen gelesen werden, die ohne weiteres dazu in der Lage sind Erkennungsfehler zu korrigieren, solange sie nicht zur totalen Verstümmelung des Textes führen.

Analyse von HSFSYS2

3.1 Überblick

Dieses Kapitel gibt einen kurzen Überblick über HSFSYS2. Tiefergehende Informationen findet man in [NISTIR 5310], [NISTIR 5687], [NISTIR 5959].

HSFSYS2 ist ein System zur Erkennung von Texten, die handschriftlich in die dafür vorgesehenen Felder eines Formulars eingetragen wurden. Die Formulare werden der Texterkennung in Form von gescannten Bildern bereitgestellt. Die Ergebnisse werden in zwei Dateien abgespeichert. Eine enthält die erkannten Texte (mit der Endung .hyp), die andere die Wahrscheinlichkeiten für die erkannten Zeichen (mit der Endung .con).

Die OCR erfolgt ausschließlich in den Formularfeldern. HSFSYS2 erwartet Text also nur an ganz bestimmten, wohldefinierten Stellen eines Formulars. Texte, die z.B. an den Rand eines Formulars geschrieben wurden, werden ignoriert. Es ist also keinerlei Funktionalität enthalten, die innerhalb eines gescannten Bildes Texte von allen anderen Informationen separiert.

Allerdings gibt es eine Ausnahme von dieser Regel: Die Textfelder sind von einem Rahmen umgeben, der als Begrenzung beim Ausfüllen der Felder dient. Während des “Ausschneidens” eines jeden Feldes aus dem gescannten Bild wird der Rahmen entfernt, wobei allerdings Zeichen, die den Rahmen schneiden, nicht abgeschnitten werden, sondern erhalten bleiben. Die dabei verwendete Technik ist leider nicht sehr universell, und nur speziell auf diesen Anwendungsfall zugeschnitten.

Die Rahmen um die Eingabefelder dienen noch einem anderen Zweck außer als Begrenzungsmarkierung. Um die Weiterverarbeitung zu vereinfachen, werden die eingescannten Formulare vor der OCR in ihrer Ausrichtung normiert. Dazu wird die Horizontale eines Bildes über eine Lauflängenbestimmung festgelegt.

Innerhalb der Formularfelder werden nur Zeichen erkannt, auf die HSFSYS2 trainiert wurde. Für das Training des Systems ist eine größere Anzahl bereits ausgefüllter Formulare notwendig. Daher ist es nicht ohne weiteres möglich, neue Feld- oder Zeichentypen einzuführen.

HSFSYS2 bietet grundsätzlich verschiedene Feldtypen zur Auswahl, die sich durch die unterschiedlichen Arten erkannter Zeichen unterscheiden.

Ziffernfelder: Einzeilige Felder, die nur die Ziffern 0–9 enthalten.

Kleinfelder: Einzeilige Felder, die nur die Kleinbuchstaben a–z enthalten.

Großfelder: Einzeilige Felder, die nur die Großbuchstaben A–Z enthalten.

Textfelder: Mehrzeilige Felder, die einen beliebigen Text enthalten.

HSFSYS2 unterstützt derzeit keine Umlaute oder Zeichen, die in den USA unüblich sind. Dies ist jedoch kein grundsätzlicher Mangel, sondern durch die Datenbasis bedingt. Durch Training des Systems können weitere Zeichen erkannt werden. Dazu ist allerdings eine größere Anzahl entsprechend ausgefüllter Formblätter erforderlich, die nicht zur Verfügung stand.

3.2 Ablaufstruktur und Analyseverfahren

HSFSYS2 arbeitet wie in Listing 1 (Seite 28) dargestellt.

Die OCR läßt sich also in zwei Teile untergliedern — Segmentierung und Zeichenerkennung.

In der Zeichenerkennung werden die Eigenschaften der isolierten Zeichen bestimmt und eine Hypothese aufgestellt, um welches Zeichen genau es sich handelt.

3.2.1 Segmentierung

Bei der Segmentierung werden aus den Zusammenhangskomponenten (in HSFSYS2-Chargon BLOBs) die einzelnen, isolierten Zeichen erzeugt.

Die dabei benutzten Grenzwerte, die der Unterscheidung von bestimmten Fällen oder der Einordnung der BLOBs in bestimmte Kategorien dienen, wurden empirisch aus einer Menge von Musterfällen bestimmt.

Zusammenhangskomponenten

Ausgehend vom ersten gefundenen schwarzen Punkt wird die durchgehende horizontale Linie bestimmt, in der der Punkt liegt. Von der gefundenen Linie

for (<alle zu bearbeitenden Formulare>)
{
    <Laden des Formulars>
    <Registrieren des Formulars>
    for (<alle Felder des Formulars>)
    {
        <Feld ausschneiden>
        <Rahmen um das Feld entfernen>
        <Zusammenhangskomponenten (BLOBs) bestimmen>
        <Zeilenverlauf bestimmen>
        <BLOBs in Zeichen umwandeln>
        <Zeichen normalisieren>
        <Eigenschaftsvektoren der Zeichen bestimmen>
        <Zeichen klassifizieren>
        <lexikalische Korrektur>
        <Ergebnis speichern>
    }
}

Listing 1: Ablaufstruktur bei der Zeichenerkennung

ausgehend werden alle direkt benachbarten (8-Nachbarschaft, also vertikal, horizontal und diagonal) Linien bestimmt. Die Menge der gefundenen Linien bildet dann die Zusammenhangskomponente. Dabei erhält man auch gleichzeitig die Längen der einzelnen Linien — die Lauflängen.

Bestimmung des Schreibstils

Um die einzelnen Zusammenhangskomponenten einzelnen Zeichen zuordnen zu können, ist es notwendig, ein Maß für die Ausdehnung der Zeichen zu bestimmen. Dafür wird der Median der Lauflängen und die maximale Höhe der BLOBs benutzt.

Bestimmung der Zeilenzugehörigkeit

Dieser Schritt ist nur bei mehrzeiligen Feldern notwendig. Das Ergebnis des Prozesses ist in Abbildung 3.1 (Seite 29) zu sehen.

Für die Aufteilung in Zeilen wird eine Suche beim am weitesten links oben

Abbildung 3.1: Aufteilen in Zeilen

liegenden BLOB begonnen. Von dessen Zentrum aus wird das Zentrum der rechts nächstgelegenen Zusammenhangskomponente gesucht. Es gilt als gefunden, wenn es innerhalb der Fläche einer horizontal liegenden tränenförmigen Figur liegt, die durch die Funktion S = a cos(bΘ) mit −\frac{π}{2b} < Θ < \frac{π}{2b} definiert ist. a wird zur Verbreiterung der Fläche vergrößert bis ein Schwellwert erreicht ist. Wird keine nachfolgende Zusammenhangskomponente gefunden, beginnt der Prozeß erneut mit dem am weitesten links oben liegenden BLOB. Er dauert an, bis alle Zusammenhangskomponenten des Bildes erfaßt sind.

Um durch statistische Ausbrecher oder Rauschen im Bild nicht in die Irre geführt zu werden, werden BLOBs, die bestimmte Kriterien nicht erfüllen, bei der Zeilenfindung nicht berücksichtigt. Das sind solche, die eine bestimmte Größe nicht überschreiten und BLOBs, die vertikal zu weit entfernt von der aktuellen Basis der Suche sind. Ferner solche, deren vertikale Ausdehnung zu groß ist. Sie entstehen, wenn sich zwei Zeichen aus verschiedenen Zeilen berühren.

a und b sind bestimmt durch den Schreibstil. Sie sind linear abhängig von der durchschnittlichen Höhe der BLOBs.

Details hierzu finden sich in [NISTIR 5894].

Zusammensetzen von Zeichen

In diesem Stadium des Segmentierungsprozesses existiert eine Liste von Zusammenhangskomponenten, die von links nach rechts aufeinanderfolgen. Von ihr werden zwei Listen abgespalten. Eine enthält BLOBs, die als Rauschen identifiziert werden. Sie überschreiten eine vom Schreibstil abhängige Größe nicht. Die andere enthält Punkte. Sie sind etwas größer als Rauschen und haben eine entsprechende Geometrie. Alle anderen Zusammenhangskomponenten werden als normal betrachtet.

Die normalen BLOBs können ein Zeichen darstellen, oder auch Teile eines Zeichens sein. In letzterem Fall müssen sie verbunden werden.

Das geschieht, wenn sie sich ausreichend weit horizontal überlappen, aber die Komponenten nicht so groß sind, daß sie schon wieder einzelne Zeichen darstellen.

Abschließend werden die BLOBs aus der Punktliste mit der Zusammenhangskomponente verbunden, die ihnen nach unten am nächsten benachbart ist. Die BLOBs aus der Rauschliste werden daraufhin überprüft, ob sie innerhalb einer anderen Zusammenhangskomponente liegen. Falls ja, werden sie ihr zugeordnet, ansonsten vernichtet.

Resultate des Zusammensetzens der Zusammenhangskomponenten zeigen Abbildung 3.2 (Seite 31) und Abbildung 3.2 (Seite 31). Eine exakte Beschreibung ist in [NISTIR 5843].

Zerlegen zusammenhängender Zeichen

Die BLOBs, die jetzt vorliegen, enthalten mindestens ein komplettes Zeichen, können aber auch aus mehreren bestehen, wie in Abbildung 3.4 (Seite 32) und Abbildung 3.5 (Seite 32).

Anhand des Verhältnisses von Breite zu Höhe und der Anzahl von schwarzen Pixeln im BLOB wird bestimmt, ob die Zusammenhangskomponente ein oder mehrere Zeichen enthält. Die Grenzwerte sind abhängig vom Schreibstil und passen sich somit den jeweiligen Verhältnissen an.

Anschließend wird ein von der durchschnittlichen Lauflänge der ursprünglichen Zusammenhangskomponenten abhängiger Punkt bestimmt, von dem

Abbildung 3.2: “Zerbrochene” Zeichen Abbildung 3.3: Zeichen, die aus mehreren Linien bestehen

die Trennung des BLOBs ausgeht. An diesem Punkt werden zwei Pfade ver-

Abbildung 3.4: Zwei Zeichen, die sich berühren

Abbildung 3.5: Mehr als zwei Zeichen, die sich berühren

tikal durch die Zusammenhangskomponente gezogen. Einer von oben nach unten, der andere umgekehrt. Beide laufen entlang der Kontur des Zeichens bis sie die gegenüberliegende Seite des BLOBs treffen oder ein lokales Minimum der Kontur erreichen.

Sollten die Pfade nicht identisch sein, werden sie an der Stelle des kürzesten Abstands verbunden. Der daraus resultierende Pfad ist die Trennlinie durch die Zusammenhangskomponente. Eine Analyse findet sich in [NISTIR 5843].

3.2.2 Zeichenerkennung

Die jetzt vorliegenden Zusammenhangskomponenten sollten jeweils genau ein Zeichen enthalten. Um die Weiterverarbeitung zu erleichtern, werden sie normalisiert. Das heißt sie werden auf eine einheitliche Größe gebracht und linear so geschert, daß die am weitesten links liegenden Punkte der obersten und untersten Linie des BLOBs vertikal übereinander liegen [NISTIR 5469].

Das erhaltene binäre 32 × 32 Raster wird Karhunen Loève-transformiert. Auf die Karhunen Loève-Transformation wird nicht näher eingegangen. Eine umfangreiche Beschreibung findet sich in [NISTIR 4824]. Die Transformation liefert eine kompakte Beschreibung der Merkmale des Zeichens und unterdrückt auch Rauschen.

Der Eigenschaftsvektor des Zeichens ist die Eingabe des Klassifikators. Dieser bestimmt den Typ und die Trefferwahrscheinlichkeit des Zeichens mittels vorher bestimmter typischer Eigenschaften einer Zeichenklasse (eines bestimmten Buchstabens) und deren Gewichtungen.

Die Mustereigenschaftsvektoren und die Gewichtungen sind vor der Klassifikation geladen worden. Sie werden nicht während der Mustererkennung berechnet, da dieser Prozeß sehr zeitaufwendig ist (> 1 Stunde).

Bei mehrzeiligem Text schließt sich hier noch eine Korrektur durch ein Wörterbuch an. Das Wörterbuch erkennt nur Ausdrücke, die es enthält. Es ist somit für eine allgemeine Schrifterkennung, bei der beliebige Worte vorkommen können, nicht geeignet.

3.3 Implementierungsdetails von HSFSYS2

3.3.1 Internes Format von Bildern

HSFSYS2 arbeitet intern ausschließlich auf Grauwertbildern, die 1 Byte je Pixel haben, also 256 mögliche Grauwerte. Dabei werden allerdings nicht alle Grauwerte genutzt, sondern lediglich zwei, nämlich 0 als Hintergrund und 1 als Vordergrund also Schrift.

Entsprechende Konvertierungen in das interne Format werden beim Laden des Bildes vorgenommen. Das geschieht in den Funktionen

load form image() (in src/lib/hsf/form2.c) (siehe Listing 2 (Sei-
te 34)) und bits2bytes() (in src/lib/image/bit2byte.c) (siehe Li-

sting 3 (Seite 35))

load form image() lädt ein eingescanntes Formular, reserviert Speicherplatz für das konvertierte Bild und nimmt die Konvertierung durch die Funk-

tion bits2bytes() vor.

load_form_image(...)
{
    ...
    ReadBinaryRaster(ifile, ihead, &inbdata, bpi, iw, ih);
    *incdata = mallocate_image(*iw, *ih, 8);
    bits2bytes(inbdata, *incdata, (*iw)*(*ih));
    ...
}

Listing 2: Laden eines Bildes in HSFSYS2

bits2bytes() erzeugt beim ersten Aufruf eine Tabelle, in der alle möglichen 256 Bitmuster eines Bytes als Bytemuster abgelegt werden, wobei ein 1-Bit genau ein 1-Byte erzeugt und ein 0-Bit genau ein 0-Byte. Diese Tabelle wird benutzt, um ein eingescanntes Bild in ein 8-Bit Grauwertbild umzuwandeln.

3.3.2 Segmentierung des Eingabefeldes

HSFSYS2 bietet grundsätzlich zwei Methoden zur Segmentierung eines Eingabefeldes in Zeichen.

Einzeilige Segmentierung: Es wird von der Voraussetzung ausgegangen, daß das Eingabefeld aus genau einer Zeile besteht.

Mehrzeilige Segmentierung: Das Eingabefeld enthält mehrere Zeilen Text, die erst in einzelne Zeilen und dann in Zeichen zerlegt werden.

Die mehrzeilige Segmentierung kann grundsätzlich auch bei einzeiliger Eingabe verwendet werden. Sie braucht allerdings mehr Resourcen und ist langsamer. Die einzeilige Segmentierung ist deutlich zuverlässiger als die mehrzeilige. Es sollte also jede Variante nur für ihren Spezialfall verwendet werden.

3.3.3 Datenbasis für Zeichenerkennung

Ein Klassifikator besteht in HSFSYS2 im wesentlichen aus drei Komponenten: eine Liste der bekannten Zeichen, Eigenvektoren für die

bits2bytes(...)
{
static int init = 0;
   ...
   if (!init)
   {
      ...
      static u_char table[(1 << BITSPERBYTE) * BITSPERBYTE];
      static u_char mask[BITSPERBYTE] =
         { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
      for ( r = table, i = 0 ; i < (1 << BITSPERBYTE) ; i++ )
         for ( j = 0, ptrs[i] = r ; j < BITSPERBYTE; j++ )
            *r++ = (i & mask[j]) ? 1 : 0;
      init = 1;
   }
   pixels = howmany(pixels,BITSPERBYTE);
   for ( dst = (double *)q, rptrs = (double **)ptrs ;
      pixels-- ; )
      *dst++ = *rptrs[*p++];
}

Listing 3: Konvertieren eines Bildes in HSFSYS2

Karhunen Loève-Transformation und Gewichtungen für das neuronale Netzwerk, das die Zuordnung der berechneten Eigenschaftsvektoren zur Zeichenklasse vornimmt. In HSFSYS2 sind die Daten für vier verschiedene Zeichengruppen enthalten.

Ziffern: Felder, die nur die Ziffern 0–9 enthalten.

Kleinbuchstaben: Felder, die nur die Kleinbuchstaben a–z enthalten.

Großbuchstaben: Felder, die nur die Großbuchstaben A–Z enthalten.

Text: Felder, die Kleinbuchstaben a–z und Großbuchstaben A–Z enthalten.

Für das Training der vier Klassifikatoren wurde eine Anzahl Felder aus bereits ausgefüllten Formularen verwendet. Aus ihnen extrahierte man automatisch Musterzeichen. Sie wurden per Hand nachbearbeitet und auf Korrektheit überprüft.

Da für das Training eine erhebliche Anzahl Einzelzeichen (> 50000) notwendig ist um zuverlässige Resultate bei der OCR zu erhalten, wurde bei diesem Projekt darauf verzichtet, eine dem deutschen Sprachraum angepaßte Version (mit Umlauten und scharfem s) zu erstellen.

3.4 Bewertung von HSFSYS2

HSFSYS2 ist für die Zwecke, für die es entwickelt wurde, ein recht leistungsfähiges System. Die Trefferquoten für die unterschiedlichen Feldtypen (Ziffern, Kleinbuchstaben, Großbuchstaben, Text) sind recht gut.

Feldtyp

Ziffer (0–9) Groß (A–Z) Klein (a–z) Text (A–Za–z)
korrekt  96.3%  89.9%  79.7%  63.9%
ersetzt  3.1%  9.1%  18.1%  14.4%
eingefügt  0.7%  2.6%  0.9%  1.3%
gelöscht  0.6%  1.0%  2.2%  21.7%

Tabelle 3.1: Trefferquoten

Diese Zuverlässigkeit wird mitunter durch folgende Punkte erzielt.

Beschränkung der bekannten Zeichenmenge: HSFSYS2 ist nur darauf trainiert in bestimmten Eingabefeldern eine beschränkte Menge an erwarteten Zeichen zu erkennen.

Das gestattet eine höhere Trefferquote, da verschiedene Verwechslungen und Zweideutigkeiten, z.B. zwischen der Ziffer 9 und dem Kleinbuchstaben g oder der Ziffer 0 und dem Großbuchstaben O, von Anfang an ausgeschlossen sind.

Ausnutzen von Eigenschaften des Formulars: Es wird vorausgesetzt, daß jedes Eingabefeld des Formulars einen Rahmen hat. Das erleichtert die grafische Vorverarbeitung, da sich anhand der Rahmen ein eingescanntes Formular in Deckung mit dem leeren Musterformular bringen läßt und die Textfelder ohne größere Probleme zu extrahieren sind. Auch wird auf diese Weise die Ausrichtung der einzelnen Zeilen innerhalb eines relativ kleinen Winkelbereichs festgelegt.

Trennung zwischen ein- und mehrzeiligen Feldern: Die Erkennungsleistung ist bei einem Textfeld, das mehrzeilig ist, deutlich geringer als bei den anderen, einzeiligen Feldern (siehe Tabelle 3.1 (Seite 36)). Ursache hierfür ist ein Zwischenschritt bei der Segmentierung der Eingabefelder. Die einzelnen BLOBs müssen ihren Zeilen zugeordnet werden. Dieser Vorgang ist relativ fehlerträchtig.

• Die Basislinien einzelner Zeilen haben im allgemeinen sich ändernde Steigungen, da es in mehrzeiligen Feldern keine Hilfslinien gibt. Es existiert also keine exakte Hauptlinie, entlang derer BLOBs gesucht werden könnten.

• BLOBs, also Zusammenhangskomponenten, können relativ weit von der Hauptlinie einer Zeile entfernt sein (z.B. i-Punkte, Querstrich bei einem großen T). Bei einzeiligen Texten spielt das keine wesentliche Rolle. Bei mehrzeiligen Texten hingegen ist ohne Kontextinformation, also nur aus der Lage der einzelnen BLOBs, nur schwer zu entscheiden, welcher Zeile ein BLOB zuzuordnen ist.

Verzicht auf Universalität: Es werden Informationen zur OCR benutzt, die nicht durch die zu erkennende Schrift getragen werden. Dies führt dazu, daß HSFSYS2 nicht universell benutzbar ist. Es kann nur zur OCR benutzt werden, wenn die Handschrift im Formular in wohldefinierten, mit einem Rahmen versehenen Feldern zu finden ist.

All diese Punkte bewirken, daß HSFSYS2 nicht ohne weiteres zur Handschriftenerkennung in HALCON benutzt werden kann. Es müssen einige Anpassungen vorgenommen werden.

Auch bleibt ein grundsätzliches Manko bestehen. Um das neuronale Netzwerk, das die eigentliche OCR vornimmt, benutzen zu können, muß es vorher trainiert werden. Dazu wird eine große Anzahl an bereits ausgefüllten Formularen benötigt. Der Zeichenvorrat für das Training, das zu den Erkennungsraten in Tabelle 3.1 (Seite 36) führte, bestand aus 61094 Ziffern, 24420 Groß- und 24205 Kleinbuchstaben. Im allgemeinen wird kein Benutzer die Möglichkeit haben, eine entsprechende Basis für das Training von neuen Zeichen zu schaffen.

Desweiteren erkennt HSFSYS2 keine Satz- und Leerzeichen. Auf Satzzeichenerkennung wurde von den Entwicklern bewußt verzichtet, da sie den Algorithmus zur Zeilenzerlegung stört. Das bewirken Punkte und Kommata, die erstens nicht als Rauschen erkannt werden, und zweitens, bedingt durch ihre Lage am unteren Zeilenrand, den Verlauf der Zeile deutlich nach unten absenken. Leerzeichen werden in HSFSYS2 erst im Laufe der Rechtschreibkorrektur erkannt.

Nutzung in HALCON

4.1 Nutzbare Komponenten aus HSFSYS2

HSFSYS2 läßt sich grob in 3 funktionale Teile gliedern.

1. Zerlegung des Formulars in Felder.

2. Handschriftenerkennung innerhalb der Formularfelder

3. Verbesserung der Erkennungsleistung mittels eines Wörterbuches.

Punkt 1 ist als Dreingabe für HALCON brauchbar, aber nicht zwingend notwendig. Auch ist der Sinn des ganzen Projektes, in HALCON eine Handschriftenerkennung einzubauen, und nicht eine Formularanalyse. HALCON selbst hat reichlich Möglichkeiten, Felder mit Handschrift als Quelle für die OCR zu liefern.

Punkt 2 ist der Teil in HSFSYS2, der die eigentliche Arbeit erledigt. Er besteht aus mehreren funktionalen Teilen, die aber so stark ineinandergreifen und miteinander verflochten sind, daß es nicht sinnvoll erscheint, diese Funktionen einzeln in HALCON bereitzustellen bzw. durch analoge HALCON-Funktionen zu ersetzen.

Punkt 3 wird nicht in HALCON übernommen. Zum einen existiert kein geeignetes deutsches Wörterbuch, zum anderen ist die Implementation relativ simpel und nicht vergleichbar mit kommerziellen Rechtschreibkorrekturen, die eine gute Erkennungsleistung haben.

Auch ist ein Wörterbuch grundsätzlich eher eine interaktive Angelegenheit, da die verbesserten Worte natürlich durch den Bediener kontrolliert werden müssen.

4.2 Vorhandene OCR in HALCON

In HALCON ist bereits Funktionalität zur OCR vorhanden. Grundsätzlich würde es naheliegen, die Handschriftenerkennung in die vorhandenen Funktionen zu integrieren. Allerdings gibt es etliche Unterschiede, die letztlich eine Integration nicht ratsam erscheinen lassen.

• Sowohl HALCON als auch HSFSYS2 benutzen dasselbe Ablaufschema: Erst Segmentierung in einzelne Zeichen, dann Klassifikation der Zeichen. Es wäre also möglich Funktionsaufrufe mit gleicher Signatur zu erzeugen. Jedoch sind die Unterschiede in den verwendeten Algorithmen so groß, daß es sinnvoll ist, diese Differenzen durch verschiedene Funktionsnamen zu verdeutlichen.

• HALCON benutzt andere Eigenschaften der Eingaberegionen zur Klassifizierung der Zeichen.

• Die Formate der Dateien, in denen die Trainingsresultate der Klassifikatoren gespeichert werden, unterscheiden sich so stark, daß kaum ein gemeinsamer Nenner gefunden werden kann.

Des weiteren ist HSFSYS2 ein System, das ständig weiterentwickelt wird. Sollte man tatsächlich eine vollständige Integration in HALCON vornehmen, wäre es jedesmal wieder mit demselben hohen Aufwand verbunden, eine neue Version von HSFSYS2 einzubinden, da nahzu alle Sourcedateien überarbeitet werden müßten.

Es ist allerdings sinnvoll, die Schnittstelle zu HALCON so zu gestalten, daß sie sich an die Definition der bereits vorhandenen OCR-Funktionen anlehnt.

4.3 Randbedingungen  der  HALCON-

Operatoren

4.3.1 Format der grafischen Eingabedaten

HSFSYS2 arbeitet nur auf binären (d.h. schwarz-weiß) Bildern. Also sind grundsätzlich sinnvolle Eingabeparameter einkanalige Bilder und Regionen. Die einkanaligen Bilder müßten dann zusätzlich noch innerhalb der Funktionen zur Handschriftenerkennung in schwarz-weiß Bilder segmentiert werden.

Es ist sinnvoll, diese Aufgabe an den Benutzer von HALCON zu delegieren. Nur er hat die Möglichkeit, anhand des Bildmaterials, das ihm vorliegt, zu entscheiden, welche Methode der Segmentierung am geeignetsten ist.

Da die Funktionen zur Segmentierung in HALCON ohnehin Regionen als Ergebnis liefern, wurden selbige als Eingangsformat für die grafischen Daten gewählt.

4.3.2 Trainingsdaten

Die Trainingsdaten (Eigenvektoren für die Karhunen Loève-Transformation und Gewichtungen für den Klassifikator) werden von HSFSYS2 nach HALCON übernommen. Sie müssen vor der Klassifizierung geladen werden. Es ist also Funktionalität bereitzustellen, die die Verwaltung der Daten übernimmt.

4.3.3 Einzeilige vs. mehrzeilige OCR

Die Segmentierung in HSFSYS2 unterscheidet klar zwischen ein- und mehrzeiliger Eingabe. Das wirkt sich deutlich auf die Qualität der Erkennungsergebnisse aus. Es ist also sinnvoll, diese Unterscheidung beizubehalten, auch wenn die Segmentierung einer Zeile nur ein Spezialfall der Segmentierung mehrerer Zeilen ist. Der Benutzer kann, falls genügend Informationen vorliegen, die geeignete Variante wählen.

4.4 Definition der HALCON-Operatoren

Aus dem bisher Gesagten ergeben sich die im folgenden näher besprochenen HALCON-Operatoren.

4.4.1 hsfsys remove border

 hsfsys remove border( RegionWithBorder :  RegionWithoutBorder :
 Density :  )

Entfernen eines rechteckigen Rahmens um eine Region

Der Operator hsfsys remove border entfernt einen rechteckigen Rahmen, der die Region RegionWithBorder einschließt.

   RegionWithoutBorder ist eine Kopie von RegionWithBorder aus der der

umgebende Rahmen entfernt ist. Dabei werden Linien, die den Rahmen durchdringen, nicht unterbrochen, sondern sie bleiben erhalten.

Density gibt die Auflösung in dots per inch des ursprünglich eingescannten Bildes an.

Parameter RegionWithBorder (input object) . . . . . . . . . . . . . . . . . . . . . . . . region → object Region, die von einem rechteckigen Rahmen umgeben ist

RegionWithoutBorder (output object) . . . . . . . . . . . . . . . . . . . region → object Region nach dem Entfernen des Rahmens

Density (input control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . integer → integer Auflösung des gescannten Bildes in dpi (dots per inch)

Resultat

Bei erfolgreicher Ausführung des Operators, erhält man den Wert H MSG TRUE. Im Fehlerfall wird ein entsprechender Fehlercode geliefert.

4.4.2 hsfsys segment multiline

 hsfsys segment multiline( Multiline :  Characters :  :  )

Segmentieren von mehrzeiligem Text

Der Operator hsfsys segment multiline zerlegt den Text, der in der Region Multiline enthalten ist, in einzelne Zeichen. Multiline darf mehrere Zeilen Text enthalten.

Als Ergebnis erhält man Characters, ein Array von Regionen, wobei jede Region genau einem Zeichen entspricht.

Multiline (input object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . region → object Zu segmentierende Region

Characters (output object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . region → object Array von Zeichen

Resultat

Bei erfolgreicher Ausführung des Operators, erhält man den Wert H MSG TRUE. Im Fehlerfall wird ein entsprechender Fehlercode geliefert.

4.4.3 hsfsys segment singleline

 hsfsys segment singleline( Singleline :  Characters :  :  )

Segmentieren von einzeiligem Text

Der Operator hsfsys segment singleline zerlegt den Text, der in der Region Singleline enthalten ist, in einzelne Zeichen. Singleline darf genau eine Zeile Text enthalten.

Als Ergebnis erhält man Characters, ein Array von Regionen, wobei jede Region genau einem Zeichen entspricht.

Singleline (input object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . region → object Zu segmentierende Region

Characters (output object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . region → object Array von Zeichen

Resultat

Bei erfolgreicher Ausführung des Operators, erhält man den Wert H MSG TRUE. Im Fehlerfall wird ein entsprechender Fehlercode geliefert.

4.4.4 hsfsys load training data

 hsfsys load training data( :  :  NameClassifier, FileNameMap,
 FileNameEvt, FileNameWt :  )

Laden eines Klassifikators

Der Operator hsfsys load training data lädt alle Parameter, die einen Klassifikator ausmachen. Sie sind in den zusammengehörigen Dateien

FileNameMap, FileNameEvt und FileNameWt enthalten.

FileNameMap enthält eine Liste der Zeichen, die der Klassifikator erkennt. FileNameEvt enthält alle Eigenvektoren des Klassifikators. FileNameWt enthält die Gewichtungen des Klassifikators. Die Dateinamen müssen den Konventionen des Betriebssystems entsprechen. Es können vollständige und relative Pfadnamen benutzt werden. Es gibt für die Suche nach den Dateien keinen Suchpfad.

Dem Klassifikator wird der Name NameClassifier zugeordnet, unter dem er vom Operator hsfsys ocr single benutzt werden kann.

Der Operator kann für unterschiedliche Klassifikatoren mehrmals hintereinander aufgerufen werden. Geladene Klassifikatoren werden, außer bei Namensgleichheit, nicht durch nachfolgend geladene verdrängt. Es sollten allerdings nicht zuviele Klassifikatoren gleichzeitig geladen werden, da sie sehr viel Speicherplatz belegen.

Die Liste der Klassifikatoren kann durch hsfsys free training data geleert werden.

Achtung

Der Operator überprüft nicht, ob der Name eines Klassifikators bereits benutzt wird. Sollte ein Name mehrfach verwendet werden, wird der zuletzt geladene Klassifikator benutzt. Dabei wird allerdings nicht der Speicherplatz des ersetzten Klassifikators freigegeben.

Parameter

NameClassifier (input control) . . . . . . . . . . . . . . . . . . . . . . . . . . string → string Name des Klassifikators

FileNameMap (input control) . . . . . . . . . . . . . . . . . . . . filename.named → string Liste der dem Klassifikator bekannten Zeichen

FileNameEvt (input control) . . . . . . . . . . . . . . . . . . . . filename.named → string Datei mit Eigenvektoren des Klassifikators

FileNameWt (input control) . . . . . . . . . . . . . . . . . . . . . filename.named → string Datei mit Gewichtungen des Klassifikators

Resultat

Wenn der Klassifikator erfolgreich geladen wurde, liefert der Operator den Wert H MSG TRUE zurück. Im Fehlerfall wird ein entsprechender Fehlercode geliefert.

4.4.5 hsfsys free training data

 hsfsys free training data( :  :  :  )

Löschen aller Klassifikatoren im Speicher

Der Operator hsfsys free training data löscht alle Klassifikatoren, die zuvor mit hsfsys load training data geladen worden sind. Er gibt dabei den kompletten Speicher frei. Die Klassifikatoren werden bei diesem Vorgang nicht auf der Festplatte gelöscht.

Der Operator sollte nach Beendigung der Zeichenerkennung aufgerufen werden, aber nicht bevor sicher ist, daß die Klassifikatoren nicht mehr benötigt werden, da das Laden selbiger ein zeitaufwendiger Prozeß ist.

Resultat

Bei erfolgreicher Ausführung des Operators, erhält man den Wert H MSG TRUE. Im Fehlerfall wird ein entsprechender Fehlercode geliefert.

4.4.6 hsfsys ocr single

 hsfsys ocr single( Character :  :  NameClassifier :  Text,
 Confidence )

Klassifizieren eines Zeichens

Der Operator hsfsys ocr single bestimmt das Zeichen, das durch die Region Character repräsentiert wird.

NameClassifier ist der Name eines Klassifikators, der zuvor mit hsfsys load training data geladen worden sein muß. Der Klassifikator bestimmt die Zeichenmenge, die erkannt wird.

Als Ergebnis erhält man Text und Confidence. Das ist das Zeichen, das aus Character gewonnen wurde und seine Wahrscheinlichkeit.

Character (input object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . region → object Zu klassifizierendes Zeichen

NameClassifier (input control) . . . . . . . . . . . . . . . . . . . . . . . . . . string → string Name des Klassifikators

Text (output control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . string → string Zeichen, das die Region darstellt

Confidence (output control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . real → real Trefferwahrscheinlichkeit für Zeichen

Resultat

Bei erfolgreicher Ausführung des Operators, erhält man den Wert H MSG TRUE. Im Fehlerfall wird ein entsprechender Fehlercode geliefert.

Implementierung

Dieser Abschnitt beschreibt einige Details der Implementierung. Es wird bewußt nicht die komplette Source beschrieben, da dies in erster Linie zu Langeweile beim Leser führt. Interessierte Leser seien auf den dokumentierten Quellcode verwiesen.

Die Implementierung wurde unter Linux mit Kernelversion 2.0.30 auf einem Rechner mit Intel 486 Prozessor vorgenommen. Da HSFSYS2 nicht für diese Plattform entwickelt wurde, mußten einige Anpassungen bei der Installation und den Makefiles vorgenommen werden.

5.1 Grundsätzliche Designentscheidungen

5.1.1 Anbindung an HALCON

Die OCR-Funktionen werden via C-Interface in HALCON eingebunden. Das C-Interface ist eine wohldefinierte Schnittstelle, durch die HALCON externe Funktionen, die in der Programmiersprache “C” geschrieben sind, verwenden kann. Es ist ausführlich beschrieben in [HALCIF 1998].

HSFSYS2 hätte auch in den HALCON-Kern eingebunden werden können. Die folgenden Gründe sprachen aber für das C-Interface.

• HALCON ist ein System, das auf vielen unterschiedlichen Plattformen läuft. HSFSYS2 ebenso. Da sich die unterstützten Plattformen nicht decken, müssen die entwickelten Funktionen auch ohne weiteres bei der Installation weggelassen werden können. Das ist nur möglich, wenn die Funktionen nicht in den HALCON-Kern eingebunden sind.

• Durch die Trennung von HALCON-Kern und HSFSYS2 wird eine sehr strenge Kapselung der Handschriftenerkennung erzielt.

• Die strenge Kapselung bewirkt, daß neue Versionen von HSFSYS2 relativ einfach zu integrieren sind.

5.1.2 Lowlevel-Grafikroutinen

HSFSYS2 benutzt etliche Grafikroutinen, die in ähnlicher oder identischer Funktionalität ebenfalls in HALCON vorliegen, z.B. iso handprint in box(), das die Zusammenhangskomponenten eines Bildes findet, oder sämtliche Funktionen, die Teile eines Bildes “ausschneiden” oder kopieren.

Diese Funktionen hätten durch die analogen Operatoren in HALCON ersetzt werden können. Dagegen sprachen aber die folgenden Gründe.

Optimierung

Die Routinen sind speziell auf den Anwendungszweck optimiert. Dadurch, und weil sie einen geringeren Overhead mit sich führen (die Strukturen sind wegen des klar umrissenen, nicht so allgemeinen Verwendungszweck deutlich einfacher gehalten), ist die Ausführungsgeschwindigkeit höher als die der analogen HALCON-Operatoren.

Modularisierung

Der Austausch der Funktionen widerspricht dem Designziel Kapselung.

Verflechtung

Da die HSFSYS2-Grafikroutinen auf ihren Verwendungszweck hin optimiert sind, liefern sie neben ihrer eigentlichen Aufgabe soviel Informationen als möglich zurück. Es findet daher keine strikte Trennung zwischen Lowlevel-Grafikroutinen und darauf aufsetzenden weiterverarbeitenden Funktionen statt.

Das hätte beim Ersetzen der HSFSYS2-Grafikfunktionen durch analoge Funktionen aus HALCON einen erheblichen Aufwand zur Folge, der nicht gerechtfertigt erscheint.

Als Beispiel für diese Verflechtung dient die Funktion

iso handprint in box() (in src/lib/hsf/isoprint.c) (Siehe 4 auf

Seite 47).

In ihr werden nicht nur die Rahmen um die Eingabefelder des Formulars entfernt, sondern gleichzeitig damit wird auch der Bereich bestimmt, in dem die Segmentierung stattfindet.

iso_handprint_in_box(...)
{
    ...
    /* find and remove top edge of box */
    sh1 = min(3*pad, (*fh)>>1);
    if(rm_long_hori_line(&pts1x, &pts1y, &msws1, &npts1,
        *fcdata, (*fw), sh1, bpi, limit) == NOT_FOUND)
        return(FALSE);
    /* compute top of zone to lift characters */
    mi = npts1>>1;
    zy1 = pts1y[mi];
    ...
}

Listing 4: Verflechtung von Funktionalität in der Funktion

iso handprint in box() (in src/lib/hsf/isoprint.c)

5.1.3 HALCON-Grafikdaten  vs.  HSFSYS2-

Grafikdaten

Da, wie oben dargelegt, die HSFSYS2-Grafikfunktionen erhalten bleiben, müssen sie mit Daten in einem ihnen bekannten Format versorgt werden. Diese Aufgabe erledigt die Funktion HsfsysRegion2Hsfsysimage8(). Sie wandelt HALCON-Regionen (Hrlregion) in das interne HSFSYS2-Grafikformat um. Das ist ohne weiteres möglich, da HSFSYS2 nur auf binären (schwarz-weiß) Bildern arbeitet.

5.1.4 Fehlerbehandlung

Die Fehlerbehandlung wird analog zu HALCON aufgebaut. Das bedeutet: Bei einem noch so gravierenden Fehler darf die Programmausführung nicht beendet werden, sondern ein entsprechender Fehlercode wird zurückgeliefert. Ebenso müssen natürlich alle Funktionen, die aufgerufen werden, auf korrekte Ausführung überprüft werden. Aber dies ist ohnehin guter Programmierstil.

Die beschriebene Vorgehensweise hat zur Folge, daß die komplette Fehlerbehandlung von HSFSYS2 abgeändert werden mußte, da sie keine spezifischen Fehlercodes liefert, sondern nur erfolgreiche oder fehlerhafte Ausführung meldet und die detaillierte Fehlerbeschreibung direkt als Text ausgibt.

5.2 Supply-Funktionen

Es werden sechs Supply-Funktionen (siehe [HALCIF 1998]) bereitgestellt. Sie korrespondieren mit den HALCON-Operatoren, die in Abschnitt 4.4 (Seite 40) beschrieben sind. Die Zuordnung geht aus Tabelle 5.1 (Seite 48) hervor.

HALCON-Operator  Supply-Funktion

    hsfsys remove border       CIPHsfsysRemoveBorder()
    hsfsys segment multiline   CIPHsfsysSegmentMultiline()
    hsfsys segment singleline  CIPHsfsysSegmentSingleline()
    hsfsys load training data  CIPHsfsysLoadTrainingData()
    hsfsys free training data  CIPHsfsysFreeTrainingData()
    hsfsys ocr single          CIPHsfsysOcrSingle()

Tabelle 5.1: Zuordnung von HALCON-Operatoren zu Supply-Funktionen

Ihre Aufgabe ist es, die Argumente auf Vollständigkeit und Richtigkeit zu überprüfen. Anschließend werden sie in eine Form umgewandelt, mit der die C-Funktionen des angepaßten HSFSYS2 weiterarbeiten können. Nach der Ausführung der Funktionen werden deren Resultate in eine HALCONkonforme Form gebracht und zurückgegeben. Mit anderen Worten: die Supply-Funktionen bilden das eigentliche Softwareinterface.

5.3 Globale Variablen

Auf globale Variablen wurde, wie in [HALCIF 1998] empfohlen, gänzlich verzichtet. Das unterstützt den modularisierten Aufbau des ganzen Systems. Das sieht man deutlich an der Funktion HsfsysKLMLPManager() (Listing 5 (Seite 49)).

Sie ist die einzige Schnittstelle für die Verwaltung der Trainingsdaten eines Klassifikators. Sie wird mit den Methoden KLMLP ACT LOAD, KLMLP ACT SEARCH und KLMLP ACT FREE zum Laden, Finden und Freigeben der Trainingsdaten im Parameter action aufgerufen. Die Daten selbst werden in der lokalen, nichtflüchtigen (static) Variablen first gehalten, die nur innerhalb der Funktion sichtbar ist. Auf diese Weise wird in “C” objektorientierter Stil simuliert. Die Funktion entspricht einem Objekt und der Parameter action den Methoden, mittels derer das Objekt ausschließlich

Herror
HsfsysKLMLPManager( ... , int action)
{
    static HSFSYS_KLMLP_LIST * first = NULL; /* root */
        /* of list of all already loaded KL/MLP params */
    ...
    if (action == KLMLP_ACT_LOAD)
    {
        ... /* Laden der Trainingsdaten */
    }
    else if (action == KLMLP_ACT_SEARCH)
    {
        ... /* Finden der Trainingsdaten */
    }
    else if (action == KLMLP_ACT_FREE)
    {
        ... /* Freigeben der Trainingsdaten */
    }
    ...
    return H_MSG_OK;
}

Listing 5: Verwaltung der Klassifikator-Daten

manipuliert wird. Die interne Struktur des Objekts bleibt dabei gänzlich verborgen.

5.4 Anpassung von Pfadnamen

HSFSYS2 ist für UNIX-Plattformen entwickelt. Auf diesen existiert immer der Pfad /usr/local. Das gesamte Programmpaket muß beim Installieren in das Unterverzeichnis hsfsys2 dieses Pfades kopiert werden, da es etliche Dateien unterhalb von /usr/local/hsfsys2 erwartet.

Diese Einschränkung betrifft aber nur das Kompilieren und Erstellen der HSFSYS2-Bibliotheken. Die Pfade für die verschiedenen Dateien, die die Daten für die Klassifizierung der Zeichen enthalten, sind grundsätzlich frei wählbar und nicht hart kodiert.

Da die Bibliotheken ohne weiteres von jeder beliebigen Stelle aus mit den Objektdateien gelinkt werden können, war es nicht notwendig, die feste Bindung von HSFSYS2 an das Installationsverzeichnis /usr/local/hsfsys2 zu ändern.

Lediglich die Dateien für die Zeichenerkennung müssen an eine Stelle kopiert werden, die von allen Benutzern lesbar ist. Dafür eignet sich am besten ein Unterverzeichnis im Installationspfad von HALCON, also unterhalb des Pfades, der durch die Umgebungsvariable $HALCONROOT bestimmt wird.

Beispiele und Fazit

6.1 Komplette Beispiele

PEV ANHALTER DURCH DIE GALAXIS

Abbildung 6.1: Beispiel: Einzeiliger Text

Mit dem entstanden System zur Handschriftenerkennung wurden einige Probeläufe durchgeführt. Die Eingaben wurden dazu mit 300 dpi eingescannt. Diese und die erkannten Texte sind dargestellt in Abbildung 6.1 (Seite 51) mit Abbildung 6.4 (Seite 53).

Die Daten für den Klassifikator, der in den Beispielen verwendet wurde, sind in den Dateien h46 ul.evt (Eigenvektoren), ul.set (Liste der Zeichen) und trn 6.wts (Gewichtungen) enthalten. Sie befinden sich in den Verzeich-

nissen /usr/local/hsfsys2/weights/mlp/const für die Texteingaben und
in /usr/local/hsfsys2/weights/mlp/digit für die Zifferneingabe.

Die Beispiele wurden per Hand in Worte aufgeteilt und in ein der Eingabe entsprechendes Zeilenraster gebracht. Diese Aufgabe übernimmt in HSFSYS2 das Wörterbuch, das aber nicht in HALCON integriert wurde.

Die Ergebnisse der Texteingaben sind vollständig in Großbuchstaben. Der Klassifikator kennt zwar Groß- und Kleinbuchstaben als Eingabe, liefert aber als Ergebnis immer den erkannten Großbuchstaben.

3807701710

Abbildung 6.2: Beispiel: Ziffern

EIT DVAUSSEN IU DEN MERFORSCHTEN EINODEN EINES TOTAL AUS DIR MODE GEKOMMENEN AUSLAEUFORS DCS WESTUCHEN SPIRALARMS DER GALAXIS LEUCHTET UNLEACHTET EIUE KLEIUE GELBC SONE

Abbildung 6.3: Beispiel: Mehrzeiliger Text

6.2 Fazit

Dieses Projekt ermöglicht es dem Bildverarbeitungssystem HALCON handschriftlichen Text zu erkennen. Die hinzugefüge Funktionalität beinhaltet allerdings nicht das Finden von Text innerhalb eines Bildes. Auch muß der Text vor der OCR horizontal ausgerichtet werden. Diese Aufgaben müssen mit den in HALCON vorhandenen Mitteln durchgeführt werden.

LN ODER TO READ A PARAGRAPH OF HANDPRINTED TEXT ILS CHARACTERS MUST BE SEGMENTED AND ORGANIZED INTO II-NES THE APPROACH TAKEN IN THIS WORK IS BOTTOMUP BCGINNING WITH THE CONNECTED COMPONENTS IN THE IMAGE A CONNEC-TED COMPONENT IS DEHNED AS A SET OF BIACK PIXELS WHERE EACH PIXEI IS A DIRECT NCIGHBOR OF AT IEAST ONE OTHER BLACK PIXEL IN THE COMPONENT EIGHTWAY EONNECTIVITY IS USED IN THIS APPLICATION WHERE A NEIGHBOR IS DEHNED TO BE EITHER DIRECTIY ADJAEENT OR DIRECTLY DIAGONAL TO A PIXEI THESE COM-PONENTS ARE SORTED INTO IINES OF TEXT AND THEN SEGMEN-TED INTO CHAR ACTER IMAGES CONECTED COMPONENTS GIVE REASONABLY GOOD ESTIMATES OF WHERE THE INDIVIDUAL CHARACTERS ARE IN THE PARA GRAPH SOME CHARACTERS MAY BE COMPRISOD OF MULTIPLE COMPONENTS WHIIE SOME COMPONENTS MAY CONTAIN MUITI-PLE TOUCHING CHARACTERS REARDIESS THC CONNECTED COM-PONENTS CAN BE USED TO DETENNINE THE POSITIONS OF THE LINES OF TEXT WITHIN THE PARAGRAPH AND THEY PROVIDE GOOD INITIAL CHARACTER SEGMENLATIONS

Abbildung 6.4: Beispiel: Gedruckter Text

Die entstandenen Operatoren haben dieselben Schwächen wie HSFSYS2, auf dem sie basieren. Mangels anderer Klassifikatoren erkennen sie nur die Zeichengruppen Kleinbuchstaben a–z, Großbuchstaben A–Z, Ziffern 0–9 und Buchstaben a–zA–Z. Es werden keine Satz- und Leerzeichen erkannt. Dafür muß der Anwender der Operatoren andere Methoden finden. Eine Möglichkeit wäre, ein Wörterbuch zu benutzen, wie das auch in HSFSYS2 getan wird. Eine andere wäre eine Vorsegmentierung in Wörter mit Operatoren, die HALCON bereitstellt. Die OCR-Operatoren könnten dann auf einzelne Wörter angewandt werden.

Gegenüber HSFSYS2 haben die neu erzeugten HALCON-Operatoren den Vorteil, daß sie nicht an die starren Beschränkungen der Verwendung in einem Formular gebunden sind.

Naturgemäß ist die Fehlerquote bei Handschriftenerkennung, außer in Sonderfällen wie der ausschließlichen Erkennung von Ziffern, relativ hoch. Die aktuelle Forschung ist bestrebt das zu ändern. Daher wurde darauf hingearbeitet, HSFSYS2 so in HALCON zu integrieren, daß neue verbesserte Versionen mit akzeptablem Aufwand integriert werden können. Diesem Designziel wurde durch modularen Aufbau und Kapselung genügt.

Anhang A

Verwendete Abkürzungen und Begriffe

HSFSYS Handwriting Sample Forms System KL-Transformation Karhunen Loève-Transformation MLP Multi-Layer Perceptron NIST National Institute of Standards and Technology OCR Optical Character Recognition, engl. optische Zeichenerkennung

Literaturverzeichnis

[HALC 1998] MVTec Software GmbH. HALCON/C User’s Manual. MVTec Software GmbH, Orleansstr.34, D-81667 Munich, Germany.

[HALCIF 1998] MVTec Software GmbH. HALCON C-Interface Programmer’s Manual. MVTec Software GmbH, Orleansstr.34, D-81667 Munich, Germany.

[HALCPP 1998] MVTec Software GmbH. HALCON/CPP User’s Manual. MVTec Software GmbH, Orleansstr.34, D-81667 Munich, Germany.

[HALDEV 1998] MVTec Software GmbH. HALCON HDevelop User’s Manual. MVTec Software GmbH, Orleansstr.34, D-81667 Munich, Germany.

[HALHD 1998] MVTec Software GmbH. HALCON/hdevelop. MVTec Software GmbH, Orleansstr.34, D-81667 Munich, Germany.

[HCRDIA 1997] Editors: H.Bunke, P.S.P.Wang. Handbook of Character Recognition and Document Image Analysis.

World Scientific, Singapore, New Jersey, London, Hong Kong.

[NISTIR 4824] P. J. Grother.

Karhunen Loeve Feature Extraction for Neural Handwritten Character Recognition. National Institute of Standards and Technology, Building 225, Room A216, Gaithersburg, Maryland 20899.

[NISTIR 5310] Michael D. Garris.

Unconstrained Handprint Recognition Using a Limited Lexicon. National Institute of Standards and Technology, Building 225, Room A216, Gaithersburg, Maryland 20899.

[NISTIR 5469] Michael D. Garris, James L. Blue, Gerald T. Candela, Darrin L. Dimmick, Jon Geist, Patrick J. Grother, Stanlay A. Janet, and Charles L. Wilson. NIST Form-Based Handprint Recognition System. National Institute of Standards and Technology, Building 225, Room A216, Gaithersburg, Maryland 20899.

[NISTIR 5687] Michael D. Garris.

Method and Evaluation of Character Stroke Preservation on Handprint Recognition. National Institute of Standards and Technology, Building 225, Room A216, Gaithersburg, Maryland 20899.

[NISTIR 5843] Michael D. Garris.

Component-Based Handprint Segmentation Using Adaptive Writing Style Model. National Institute of Standards and Technology, Building 225, Room A216, Gaithersburg, Maryland 20899.

[NISTIR 5894] Michael D. Garris.

Teaching Computers To Read Handprinted Paragraphs.

National Institute of Standards and Technology, Building 225, Room A216, Gaithersburg, Maryland 20899.

[NISTIR 5959] Michael D. Garris, James L. Blue, Gerald T. Candela, Patrick J. Grother, Stanlay A. Janet, and Charles L. Wilson. NIST Form-Based Handprint Recognition System (Release 2.0). National Institute of Standards and Technology, Building 225, Room A216, Gaithersburg, Maryland 20899.

Index

Anisometrie, 16

Coocurrence-Matrix, 16

Funktion

CIPHsfsysFreeTrainingData,

48 CIPHsfsysLoadTrainingData,

48 CIPHsfsysOcrSingle, 48 CIPHsfsysRemoveBorder, 48 CIPHsfsysSegmentMultiline,

48 CIPHsfsysSegmentSingleline,

48

HALCON, 8, 9, 37–40, 45–48, 50–

52, 54 Hidden-Markov Modell, 23 HORUS, 8 HSFSYS2, 8, 9, 26, 27, 33–40, 45–

51, 53, 54

Karhunen Loève Transformation,

18, 23, 33, 35, 40, 55 Klassifikator

Multilayer Perceptron, 19 Polynomial, 18 Radial Basis Function, 19

Kompaktheit, 16 Konvexität, 16

Lowlevel-Grafikroutinen, 46

Moment, 16

zweiten Grades, 17

Operator

hsfsys free training data, 43,

48 hsfsys load training data, 42,

48 hsfsys ocr single, 43, 48 hsfsys remove border, 40, 48 hsfsys segment multiline, 41,

48 hsfsys segment singleline, 41,

48

Supply-Funktion, 48

Trefferquote, 36

Verwaltung der Trainingsdaten, 48

Technische Universität München

Institut für Informatik

Forschungs- und Lehreinheit Informatik IX

Implementierung eines Systems zur Schriftzeichenerkennung Diplomarbeit Stefan Kaintoch

Stefan Kaintoch  1998  Implementierung eines Systems zur Schriftzeichenerkennung