Liniensegmentierung

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

(aus einer Arbeit von Oliver Scholz im SS 2004)


Inhalt

Im nachfolgenden Artikel werden die Schritte/Verfahren erläutert, die typischerweise auf ein Bild angewendet werden können um eine auf Linen basierende Segmentierung durchzuführen, also eine linienhafte Darstellung zu gewinnen. Es werden Funktionsweisen und Randbedingungen der eingesetzten Verfahren sowie gebräuchliche Darstellungsweisen für Linien erläutert.

Einführung Segmentierung

Bevor ich auf zwei grundlegende Verfahren zur Segmentierung eines Bildes mit Hilfe von Linien näher eingehen werde, möchte ich eine kurze Definition des Begriffes "Segmentierung" einführen. Auch soll auf den Begriff der Linie eingegangen werden. Unter Segmentierung versteht man die Aufteilung eines Bildes in einheitliche Bereiche nach Maßgabe der berechneten Merkmale. Ausgansgpunkt ist ein Bild, welches durch Reduktion von irrelevanter Information in ein ein segmentiertes Bild übergeführt wird. Das Ziel der Segmentierung ist somit als Suche nach charakteristischen und einfachen Bestandteilen eines Bildes zu formulieren. "Bei der Segmentierung kommen Verfahren zum Einsatz wie die Binärbilderzeugung, multivariate statistische Klassifikatoren, geometrische Klassifikatoren, neuronale Netze oder Operatoren auf der Basis der fuzzy logic. Natürlich ist die Wahl des Verfahrens abhängig von der Komplexität des Bildes. Ist bei einem Bild beispielsweise der Bildhintergrund und das Objekt durch eine einfache Binarisierung und einem geeignetem Schwellenwert voneinander zu trennen, sind kompliziertere Verfahren unangemessen aufwändig. In einem segmentierten Bild unterscheidet man grundsätzlich zwischen Punkten, Linien und Regionen. Eine Linie kann definiert werden, als "Region mit einer ausgeprägten Längsrichtung, bei der die Breite für die Bedeutung nicht relevant ist." Eine weitere Definition, die eine wichtige Rolle im Zusammenhang mit Darstellungsweisen für Linien spielen wird, besagt: "Bildpunkte, welche eine geeignete Nachbarschaftrelation erfüllen, bilden eine Linie. Als Spezialfall der Linie ist die Konturlinie definiert als "Begrenzung, die eine Region von ihrer unmittelbaren Umgebung trennt."

Die Segmentierung eines Bildes dient der Vorbereitung zur Gewinnung einer symbolischen Beschreibung des Bildes. Direkt nach der Segmentierung findet deshalb typischerweise eine Merkmalsextraktion statt, die nun Merkmale, wie zum Beispiel Linien, symbolhaft beschreiben kann. Zum Abschluss der Einführung noch eine kleine Veranschaulichung: das Originalbild wurde mit Hilfe des Canny-Operators in eine segmentierte Darstellung überführt.

Liniensegmentierung 1.jpg Liniensegmentierung 2.jpg

Konturliniendetektion

Das erste Segmentierungsverfahren, das ich vorstellen möchte, befasst sich mit der Detektion der Konturlinie. Grundvorraussetzung für dieses Verfahren ist allerdings die Binarisierung des Originalbildes. Diese Umwandlung des Originalbildes in ein Binärbild möchte ich im folgenden kurz erläutern.

Nehmen wir an, das Originalbild sei eine farbige Fotografie. Als erstes muss dieses Bild in ein Graustufenbild umgewandelt werden. Typischerweise liegen nun 256 Grauabstufungen vor. Die Bezeichnung binär deutet aber schon an, dass nur zwei Werte erlaubt sind, nämlich völliges schwarz (entpricht dem Zahlenwert 0) und völliges weiß (entpricht dem Zahlenwert 255). Dieses Problem wird relativ einfach durch die Einführung eines Schwellenwertes gelöst. Alle Grauwerte des Originalbildes, die kleiner gleich als der Schwellenwert sind, werden im Binärbild auf den Grauwert 0 gesetzt, alle Grauwerte, die höher als der Schwellenwert sind, werden auf den Grauwert 255 gesetzt. Das resultierende Bild ist somit binär, es enthält nur schwarze und weiße Anteile. Problematisch ist die Festlegung des Schwellenwertes, welche natürlich vom jeweiligen Bild abhänging ist. Idealerweise heben sich beim Originalbild Vordergrund und Hintergrund stark voneinander ab. Dies drückt sich sich im Grauwertdiagramm als zweigipflige Form aus. In diesem Fall wählt man den Schwellenwert in der Mitte des Tales dieser zwei Gipfel. Im Hinblick auf die Konturliniendetektion liefert dieses Binärbild ein ausgezeichnete Vorlage.

Liniensegmentierung 3.jpg Liniensegmentierung 4.jpg Liniensegmentierung 5.jpg

Natürlich gibt es aber auch Bilder, die diesem Ideal nicht entsprechen. Hier ist es ratsam mit dem Schwellenwert zu experimentieren bis der gewünschte Bildbereich am besten "erwischt" ist. Manchmal schafft auch eine leichte Glättung des Originalbildes eine Besserung. Für schwierigere Fälle gibt es natürlich auch noch schwierigere Verfahren. So ist es möglich für verschiedene Bildbereiche verschiedene Schwellenwerte zu definieren oder aber den Schwellenwert so zu wählen, dass er den prozentualen Anteil der Objekt-Bildpunkte und der Hintergrund-Bildpunkte berücksichtigt.1 Dies würde nun aber zu weit führen, da uns die Binarisierung nur als Vorraussetzung für die Konturdeteketion dienen soll.

Durch die Detektion der Konturlinie einer Region, kann eine binarisierte, flächenhafte Darstellung in eine linienbasierte Repräsentation umgewandelt werden. Dies ermöglicht eine Datenreduktion bei gleichbleibender Datenqualität und öffnet der Merkmalsextraktion die Tore. Ziel bei der Konturdetektion ist das Auffinden aller Bildpunkte, die die Kontur bilden. Zu unterscheiden ist dabei zwischen Konturpunkten und Hintergrundpunkten. Ein Punkt ist genau dann ein Konturpunkt, wenn mindestens einer seiner Nachbarn ein Hintergrundpunkt ist. Die Nachbarschaft kann zwischen einer 4er Nachbarschaft und einer 8er Nachbarschaft unterschieden werden. Bei der 4er Nachbarschaft gelten alle Punkte als Nachbarn, die vertikal und horizontal an den zu betrachtenden Punkt angrenzen, bei der 8er Nachbarschaft dagegen auch alle diagonal Angrenzenden. Der Begriff der Nachbarschaft wird im Kapitel Darstellungsweisen noch ausführlicher behandelt.

Um einen beliebigen ersten Konturpunkt zu finden, durchkämt man entlang einer gedachten Linie das Bild, zum Beispiel von der linken Seite aus mit einer vertikalen Linie. Ist ein schwarzer Punkt bei einem weißen Hintergrund (oder eben entsprechend vertauscht) gefunden, dient dieser als Ausgangspunkt für die Konturliniendetektion.

Man untersucht nun, ob der obere Nachbar dieses Punktes ebenfalls ein Konturpunkt ist, d.h ob er den Grauwert 0 hat. Ist dies der Fall, gehen die Betrachtungen von diesem Punkt weiter. Hat der Ausgangspunkt keinen oberen Nachbarn, wird im Uhrzeigersinn nach dem nächsten Konturpunkt gesucht. Dabei bewegt man sich in Schritten der Länge 1 von Punkt zu Punkt in einer der 4 bzw. 8 Richtungen, abhängig von der verwendeten Nachbarschaft. Bei der 4er Nachbarschaft sind also Richtungen aus der Menge M4 {oben, rechts, unten, links} möglich, bei der 8er Nachbarschaft Richtungen aus der Menge M8 {oben, oben rechts, rechts, unten rechts, unten, unten links, links, oben links}. Vom resultierenden zweiten Konturpunkt beginnt das Verfahren erneut und liefert einen dritten Konturpunkt. Hat ein Konturpunkt keinen anderen Nachbarn, als denjenigen, durch den er erkannt wurde, geht das Verfahren von diesem letzten Konturpunkt weiter. Hier werden dann bereits erkannte Konturpunkte nicht mehr in der Richtungsmengenauswahl berücksichtigt. Auch werden Betrachtungen von Hintergrundpunkten zwischengespeichert, so dass sie nicht mehrfach untersucht werden müssen.

Liniensegmentierung 6.png Liniensegmentierung 7.png

"Das Verfahren der Konturliniendetektion wird umso zeiteffektiver, je weniger Tests Konturpunkt/Hintergrundpunkt man durchführen muss und je weniger Konturpunkte man zur Festlegung der Konturlinie benötigt." Trifft man wieder auf den Ausgangspunkt, wird die Konturlinie geschlossen und es wird die Konturliniendetektion gegebenenfalls in der nächsten Region durchgeführt.

Die resultierende Konturlinie muss nun noch nachbearbeitet werden, die Konturverdünnung und die Konturschließung sind hier zwei relevante Verfahren. "Der Zweck der Konturverdünnung ist es, auf Grund einer vorzugebenden Heuristik Konturpunkte so zu eliminieren, dass eine Breite der Kontur von einem Bildpunkt resultiert."

Liniensegmentierung 8.png

Das Verfahren der Konturschließung beruht auf der Annahme, dass durch lokale Störungen die Konturlinie in einzelne Konturliniensegmente zerfällt. Hier können nun bestimmte Kriterien, wie noch akzeptable Entfernung in Pixeln, definiert werden, um etwa zwei Konturliniensegmente zusammen zu führen. Auf Grund der größeren Wichtigkeit im nächsten Kapitel, werden diese beiden Verfahren der Nachbearbeitung dort noch einmal näher erläutert.

Linienextraktion

Ausgangspunkt für die Linienextraktion ist hier eine kantenbasierte Segmentierung eines Graustufenbildes. Die Vorgehensweise und die Randbedingungen der Kantendetektion möchte ich im folgenden kurz erläutern.

Grundidee bei der Kantendetektion ist das Auffinden von Diskontinuitäten im Bild, welche sich durch Grauwertänderungen in der Umgebung eines jeden Bildpunktes ausdrücken. Problematisch ist dabei, dass fast in jedem Bildpunkt eine Grauwertänderung vorliegt und der Grauwertanstieg verschmiert ist, d.h. sich nicht idealerweise von einem Bildpunkt zum Nächsten sondern meist über mehrere Bildpunkte erstreckt. Entscheidungshilfen über wirkliche bzw. durch Störungen verursachte Kanten bieten die drei grundlegenden Verfahren Differentation, Masken und parametrische Modelle. Exemplarisch soll hier das Masken-Verfahren am Beispiel des Robinson-Operators näher vorgestellt werden.

Eine Matrix mit den für jeden Bildpunkt entsprechendem Grauwert dient als Ausgangslage. Ferner stehen vier verschiedene Masken zur Verfügung. Die Nulllinie repräsentiert dabei die vier möglichen Richtungen einer Kante.

Liniensegmentierung 9.png

Die 1 und die 2 in den Operatormasken geben einen Gewichtungsfaktor an, mit dem der entsprechende Grauwert multipliziert wird. Jede der vier Masken wird nun in jedem Bildpunkt angewendet und ausgewertet. Dies geschieht folgendermaßen: jeder Bildpunkt wird mit seinem Faktor gewichtet und anschließend aufsummiert. Dies ist ein Maß für die Kanstenstärke. "Gewonnen" hat der Operator, der den größten Betrag des Wertes aufweisen kann, da dieser logischerweise am besten dem Kantenverlauf im Bild entpricht.

Liniensegmentierung 10.png

Die untere Maske hat den höheren Betragswert und weist somit die beste Übereinstimmung mit dem Kantenverlauf auf. Dadurch sind Kantenstärke und Kantenrichtung bestimmt. Dieses Verfahren ist sehr schnell, da keine Wurzel- oder Winkelberechnungen wie beispielsweise bei Verfahren der Differentiation durchgeführt werden müssen, allerdings lassen sich so nur diskrete Kantenrichtungen bestimmen. Beim vorgestellten Robinson-Operator ergeben sich unter Berücksichtung des Vorzeichens 8 unterscheidbare Kantenrichtungen.

Der nächste Schritt zur Linienextraktion besteht aus dem Definieren von Zusammengehörigkeitsrelationen, da die ermittelten Kantenpunkte noch isoliert vorliegen. Aus diesen zusammengehörigen Kantenpunkten lässt sich dann eine Linie bilden. Wie schon erwähnt sind die Kanten in der Regel jedoch verschmiert. Dieses Problem muss zuerst durch eine Linienverdünnung behoben werden, welche die zu unrecht markierten Kantenpunkten analysiert und eleminiert. In der Fachliteratur wird desöfteren auch für Linienverdünnung der Begriff der Skelettierung verwendet.

Auf den ersten Blick scheint diese Linienverdünnung mit einem festen Schwellenwert lösbar. Alle Punkte, die niedriger als der Schwellenwert sind, werden gelöscht und die Linie wird nur aus den deutlich ausgeprägten Kantenpunkten gebildet. In der Praxis zeigt sich jedoch, dass die Wahl des richtigen Schwellenwertes nahezu unmöglich ist. Bei einem kleinen Schwellenwert bleiben zu viele durch Rauschen bedingte Kantenpunkte bestehen, bei einem großen Schwellenwert werden die enstehenden Linien zu oft unterbrochen und schwach ausgeprägte Kanten gehen ganz verloren. Die Lösung liefern Verfahren, die die Bildpunkte nicht isoliert, sondern in Abhängigkeit von ihren Nachbarn betrachten.

"Der einfachste Skelettierungsalgorithmus lautet: lösche alle Punkte, für die in Achter- Nachbarschaft der Objektzusammenhang nicht unterbrochen wird, außer wenn es sich um Linienendpunkte handelt."1 Dieser Algorithmus ist aber eher für den Feinschliff gedacht, ist eine starke Verdünnung nötig, liefert dieses Verfahren nicht befriedigende Ergebnisse. Hier ist das Verfahren der Unterdrückung nicht-maximaler Kantenpunkte besser geeignet. Ein beispielhaftes Vorgehen soll nun beschrieben werden. Man betrachtet einen Kantenpunkt KP und definiert senkrecht zu der in KP ermittelten Kantenrichtung zwei Nachbarpunkte N1 und N2. N1 kann dabei links, N2 rechts von KP liegen.

Für N1 und N2 wird nun zum Beispiel mit Hilfe des vorgestellten Robinson-Operators die Kantenrichtung ermittelt. Ist diese weitgehend identisch mit der Kantenrichtung von KP, kann davon ausgegangen werden, dass die Kantenrichtung der drei Punkte von der gleichen Kante verursacht wurde. Der nächste Schritt sieht die Bestimmung der Kantenstärke der gewählten Nachbarpunkte vor. Ist die Kantenstärke beispielsweise von N1 größer als die von KP, wird KP gelöscht und das Verfahren beginnt mit N1 als neuem Kantenpunkt von vorne. Durch das Auffinden und Eleminieren von nichtmaximalen Kantenpunkten kann somit die Verschmierung von Kanten verringert und die Bildung von Linien vorbereitet werden.

Ein weiterer Algorithmus zur Verdünnung arbeitet zeilenweise mit einer 3x3 Maske. Dabei werden die Bildpunkte durch ein bestimmtes Codierungsverfahren in Hintergrundpunkte (b), Skelettpunkte (s), Randpunkte (r), Innenpunkte (i) und Kernpunkte (c) aufgeteilt. (Auf dieses relativ einfache aber langwierige Codierungsverfahren wird hier nicht näher eingegangen, ist aber nachzulesen bei Ernst auf Seite 213.) Nun wird zeilenweise von oben nach unten vorgegangen. Hintergrundpunkte und Skelettpunkte bleiben erhalten, Randpunkte, Innenpunkte und Kernpunkte werden Schritt für Schritt mit vorgebenen Masken verglichen und in Skelettpunkte oder Hintergrundpunkte umgewandelt. Die Verdünnung erfolgt symetrisch von allen Seiten des Objekts, daher können Skelette mit Linienstärke 2 auftreten. Um dies zu bereinigen kann der erwähnte "einfachste Skelettierungsalgorithmus" angewendet werden. Zwar erfordert die Codierung einen beträchtlichen Mehraufwand, dennoch wird dieser durch die gesteigerte Effizienz der anschließenden Verdünnung mehr als aufgewogen.

Liniensegmentierung 11.png

Der nächste Schritt der Linienextraktion beschäftigt sich mit der Verknüpfung von Punkten zu Linien, denn auch nach der Verdünnung liegen die Kantenpunkte noch isoliert vor.

Diese Verknüpfung erledigt das Hysterese-Schwellenwertverfahren. Hierbei wird ein oberer und ein unterer Schwellenwert definiert. Startpunkte für eine Linienverfolgung können nur Punkte werden, die eine Kantenstärke aufweisen, welche größer gleich dem oberen Schwellenwert ist. Dieser obere Schwellenwert bestimmt also maßgeblich die Anzahl der detektierten Linien, er sollte auf jeden Fall so hoch gewählt werden, dass das Rauschen im Bild keine Aussichten auf Startpunkte hat. Entlang und gegen die Kantenrichtung des Startpunktes wird nun nach weiteren Punkten gesucht. Jeder neu in die Linie aufgenomme Punkt dient wiederum als Ausgangspunkt für die Bestimmung der relevanten Kantenrichtung für den nächsten Punkt. Die Linie wird fortgesetzt, solange die Kantenstärke eines neu gefundenen Punktes größer als der untere Schwellenwert ist und die Kantenrichtung dem aktuell letzten Punkt ähnlich ist. Ferner darf der "Neuankömmling" nicht Bestandteil einer anderen Linie sein. Stehen mehrere Kandidaten zur Auswahl, d.h. ist die Kantenrichtung aller Kandidaten gleich dem aktuellen Punkt, wird der Punkt mit der größeren Kantenstärke bevorzugt. Ist auch diese gleich, wird der nächstliegende Punkt gewählt.

Liniensegmentierung 12.png

Die Stärke eines nicht ausgewählten Kandidaten wird anschließend auf einen Wert kleiner als der obere Schwellenwert gesetzt, um zu verhindern, dass aus ihm neue Linien hervorgehen. Das Hysterese-Verfahren ist sehr störungsunanfällig, da die Kantenstärke im Verlauf der Linie schwanken kann, ohne dass ein Abbruch der Linie erfolgt.

Dennoch gibt es zwei sich anschließende Verfahren, die eventuelle Störungen beseitigen. Sind minimale Lücken, d.h. zum Beispiel ein Abstand von nur einem oder zwei Punkten zwischen zwei Liniensegmenten vorhanden, ist die Wahrscheinlichkeit hoch, dass diese Lücke durch einer Störung verursacht wurde. Durch Verwendung von beispielsweise 3x3 Masken unter 8er Nachbarschaft wird am Linienende eines Liniensegments nach anderen Linienendpukten gesucht. Wird eine Übereinstimmung mit der angewandten Maske erzielt, wird der mittlere Punkt auch zum Linienpunkt.


Liniensegmentierung 13.png

Ein weiteres Verfahren zur Lückenschließung ist das Aussenden von Suchstrahlen, welches sich im Falle größerer Linienunterbrechungen eignet. Vom detektierten Linienendpunkt wird ein Suchstrahl in die von den letzten Linienpunkten ermittelte Richtung ausgesandt, der genaue Kegel und die Distanz ist dabei wählbar. Trifft ein Suchstrahl auf einen anderen Linienendpunkt, so werden alle Punkte längs dieses Suchstrahls auch zu Linienpunkten umgewandelt. Bei der Verwendung von langen Suchstrahlen und bei dichten Liniennetzen kann es passieren, dass mehrere Verbindungen zu anderen Linienendpunkten gefunden werden. Je nach Aufgabenstellung wird man nur eine Verbindung realisieren, zum Beispiel die kürzeste oder die in der Richtung am besten passende.

Liniensegmentierung 14.png

Zuletzt möchte ich noch kurz zwei weitere Regulierungsverfahren zur Linienextraktion nennen. Zum einen die Eleminierung von kleinen Liniensegmenten. Hier wird von der Annahme ausgegangen, dass Liniensegmente mit nur wenigen Punkten Länge von Störungen herrühren. Zum anderen die Möglichkeit der Bewertung von Linien. Hier sind Bewertungen der Länge der Linie, der Variation der Kantenrichtung oder der mittleren Kantenstärke möglich. Letztere Bewertung stellt sich in der Praxis als geeignetste heraus.

Linien-Repräsentaion

Durch die Verfahren der vorherigen Kapitel liegt nun eine Linie vor. Diese muss nun noch entsprechend im Speicher des Rechners repräsentiert bzw. abgespeichert werden. Hierbei lassen sich bildnahe und approximierte Herangehensweisen unterscheiden.

Die am effektivsten, bildnahe Repräsentation einer Linie ist das Verfahren des Kettencodes. Dazu werden in einer Datenstruktur zunächst die Anzahl der Linienpunkte sowie die X- und Y-Koordinate des Anfangspunktes der Linie gespeichert. Für alle folgenden Punkte wird dann nur die Richtung bezüglich des unmittelbar vorhergehenden Punktes angegeben. Bei der 8er Nachbarschaft genügen somit pro Punkt 3 Bit, bei der 4er Nachbarschaft sogar nur 2 Bit. "Wollte man für jeden Punkt dessen X- und Y-Koordinate speichern, so müsste man wesentlich mehr Speicherplatz bereitstellen, nämlich 4 Byte pro Punkt, wenn man für die interne Zahldarstellung einer kurzen Integer-Zahl 2 Byte zugrunde legt."1 Die Richtung wird in sogenannten Richtungselementen in einem bestimmten Umlaufsinn gespeichert.

Liniensegmentierung 15.png

Im Gegensatz zum Kettencode liefert eine Approximation einer Linie eine abstraktere Repräsentation. Dies ist sinnvoll, wenn eine Weiterverarbeitung wie beispielsweise eine Erkennung von bestimmtem Merkmalen durchgeführt werden soll.

Diese Approximation kann durch verschiedene Linienformen realisiert werden. Je genauer die Approximation sein soll, desto schwieriger ist die Approximationsbildung. Eine zu genaue Approximation ist aber nicht immer wünschenswert, denn mit der Genauigkeit steigt die Schwierigkeit der eindeutigen Erkennung bzw. der eindeutigen Zuordnung bei der Weiterverarbeitung. Je ungenauer dagegen die Approximation, desto einfacher ist die Approximationsbildung und desto einfacher gelingt die Zuordnung von bestimmten Merkmalen. Zwei relativ einfache Linienformen zur Approximation sind Geraden und Kreisbogensegmente. Um die Linie zu approximieren, muss sie vorher in geeignete Segmente zerteilt werden. Wichtige Stützstellen für diese Segmentierung liefert die Eckendetektion und das Auffinden von Vertices. Ein Vertex ist definiert als "Punkt der Bildebene, in welchem mindestens eine Linie beginnt oder endet."1 Er gibt also Auskunft darüber, wie viele Linien in einem Punkt zusammentreffen, man spricht dabei von einem Vertex n-ter Ordnung. Diese Liniensegmente, beschränkt durch die gefundenen Stützstellen, werden nun einzeln approximiert. So wird aus einer "langen, krakeligen" Linie beispielweise eine Gerade und ein Kreisbogensegment. Diese approximierte Linie ist jetzt natürlich viel besser für die Weiterverarbeitung zu interpretieren.

Kompliziertere Verfahren haben dennoch ihre Berechtigung, wenn es zum Beispiel auf die Genauigkeit ankommt oder die Ausgangslinie eine sehr komplizierte Form hat. Hier liefert das Verfahren der B-Splines gute Ergebnisse.

Das Verfahren der B-Splines meint eine analytische Beschreibung von gekrümmten Linien. Sie sind Funktionen höherer Ordnung und nähern sich mit Hilfe von Polynomen stückweise einer Kurve durch die Stützpunkte an.


Liniensegmentierung 16.png

Ich bin nun am Ende meines Berichts angelangt. Ich hoffe, ich konnte einen richtigen und anschaulichen Überblick über die Thematiken aus der Bildsegmentierung basierend auf Linien vermitteln. Ich selbst habe bei der Anfertigung dieser Arbeit jedenfalls noch mal viel lernen können. Abschließend befindet sich noch ein Verzeichnis der verwendeten Literatur.

Literatur-Verzeichnis

Ernst, Hartmut - Einführung in die digitale Bildverarbeitung 1991, Franzis-Verlag GmbH, München

Voss, Klaus / Süße, Herbert - Praktische Bildverarbeitung 1991, Carl Hanser Verlag, München/Wien

Haberäcker, Peter - Praxis der digitalen Bildverarbeitung und Mustererkennung 1995, Carl Hanser Verlag, München/Wien

Liedtke, Claus / Ender, Manfred / Marko, Hans - Wissensbasierte Bildverarbeitung 1989, Springer-Verlag, Berlin/Heidelberg

Janser, Achim / Luther, Wolfram / Otten, Werner - Computergrafik und Bildverarbeitung 1996, Friedrich Vieweg & Sohn Verlagsgesellschaft mbH, Braunschweig/Wiesbaden

Brünig, Heinz - Segmentierung und Merkmalsextraktion Skript zur Vorlesung im Studiengang Medientechnik an der Hochschule Nürnberg