28.12.2012 Aufrufe

3D-Rekonstruktion extraokulärer Augenmuskeln aus MR ... - SEE-KID

3D-Rekonstruktion extraokulärer Augenmuskeln aus MR ... - SEE-KID

3D-Rekonstruktion extraokulärer Augenmuskeln aus MR ... - SEE-KID

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Fachhochschul-Studiengang<br />

SOFTWARE ENGINEERING<br />

A-4232 Hagenberg, Austria<br />

<strong>3D</strong>-<strong>Rekonstruktion</strong> <strong>extraokulärer</strong><br />

<strong>Augenmuskeln</strong> <strong>aus</strong> <strong>MR</strong>-Bilddaten<br />

Diplomarbeit<br />

zur Erlangung des akademischen Grades<br />

Diplom-Ingenieur (Fachhochschule)<br />

Eingereicht von<br />

Franz Anton Pirklbauer<br />

September 2001<br />

Betreuer: Dipl.-Ing. (FH) Michael Buchberger<br />

Begutachter: FH-Prof. Dipl-Ing. Dr. Herwig Mayr


Eidesstattliche Erklärung<br />

Ich erkläre, dass ich die Diplomarbeit selbstständig verfasst, andere als die angegebenen<br />

Quellen und Hilfsmittel nicht verwendet und mich auch sonst keiner unerlaubten Hilfe bedient<br />

habe.<br />

Hagenberg, im September 2001 Franz Pirklbauer


KURZFASSUNG v<br />

Kurzfassung<br />

In der Medizin produzieren tomographische Messverfahren immer genauere Abbildungen von<br />

menschlichen Körperteilen. Verschiedenste Bilderzeugungsverfahren, wie Magnetresonanztomographie<br />

oder Computertomographie, liefern dabei Bilder, die bereits einen hohen Detaillierungsgrad<br />

aufweisen. Derartige Bilder werden nicht nur zur Unterstützung von Diagnose<br />

und Therapie eingesetzt, sie können auch Grundlage für Modelle sein, die Abläufe im menschlichen<br />

Körpers simulieren.<br />

Das Forschungsprojekt <strong>SEE</strong>-<strong>KID</strong> am Fachhochschulstudiengang Software-Engineering für<br />

Medizin in Hagenberg hat sich zum Ziel gesetzt, eine Simulation des menschlichen Auges am<br />

Computer zu verwirklichen. Im Rahmen dieses Projektes ist unter anderem eine möglichst<br />

realistische Darstellung der extraokulären <strong>Augenmuskeln</strong> gefordert und in der vorliegenden<br />

Arbeit beschrieben.<br />

Für die Umsetzung dieser Anforderungen kommen Verfahren der medizinischen Bildverarbeitung<br />

zum Einsatz, die größtenteils ihren Ursprung in der digitalen Bildverarbeitung haben.<br />

Spezielle Magnetresonanzbilder, die wenige Millimenter hinter dem Augapfel aufgenommen<br />

werden, bilden dabei die Grundlage. Darauf aufbauend werden mit verschiedenen Segmentationsverfahren,<br />

wie der Schwellwertanalyse oder dem Scan-Line Verfahren, die Bilder vorbereitet<br />

und schließlich mit dem sogenannten Marching-Cube-Algorithmus analysiert. Das<br />

Ergebnis dieser Verarbeitungsschritte ist ein dreidimensionales Polyedermodell, welches einen<br />

Augenmuskel repräsentiert. Durch die Abspeicherung in einer DXF-Datei kann das so erstellte<br />

Modell von einem beliebigen, <strong>3D</strong>-fähigen Grafikprogramm dargestellt werden.


ABSTRACT vii<br />

Abstract<br />

Tomographical measuring systems are producing increasingly exact images from the human<br />

body. Different techniques, like magnetic resonance tomography or computer tomography,<br />

provide high level of details in the images. Primarily such images are used to support the<br />

medicians in diagnoses and therapeutics. Furthermore these images can supply the basics<br />

for models which simulate processes in the human body.<br />

The reasearch project <strong>SEE</strong>-<strong>KID</strong> at the Upper Austrian Polytechnic University in Hagenberg,<br />

Department of Software Engineering for Medicine, wants to build a simulation of the human<br />

eye. To simulate the extraocular eye muscles as realisticly as possible, a visualization of these<br />

muscles is necessary.<br />

To visualize the eyemuscles we need methods from medical image processing which are mainly<br />

derived from digital image processing. The basis for our work are special magnetic resonance<br />

images, which were taken with an offset of only a few millimeters behind the eyeball of<br />

a human eye. To prepare these images several methods of segmentation, like threshold<br />

analysis and the scan-line-method, are used. Finally the marching-cube-algorithm analyses<br />

the images, builds a model of polyhedrons from the muscle surface and stores it in a DXF<br />

file. This file can be visualized by any standard <strong>3D</strong> graphic program.


viii


Vorwort<br />

Das Gebiet der medizinischen Bildverarbeitung findet in dieser Arbeit eine sehr spezialisierte<br />

Anwendung. Die Verarbeitung von medizinischen Bildern nimmt einen immer höheren<br />

Stellenwert ein. Die Menge von Bildern, die zur Unterstützung von Medizinern im Bereich<br />

der Diagnostik und Therapie wesentliche Erleichterung bringen, wird immer größer. Der<br />

Grund ist wohl darin zu suchen, dass das menschliche Auge visuelle Informationen leichter<br />

verarbeiten kann als Informationen in Textform.<br />

Eine der wichtigsten Anforderungen an bildverarbeitende Systeme ist die dreidimensionale<br />

Darstellung von menschlichen Organen. Das Ergebnis dieser Arbeit ist ein System, das extraokuläre<br />

<strong>Augenmuskeln</strong> <strong>aus</strong> Magnetresonanzbildern segmentiert, die Oberfläche analysiert<br />

und schließlich dreidimensional darstellt. Dabei kommen Algorithmen <strong>aus</strong> der digitalen Bildverarbeitung<br />

zum Einsatz, die in Kap. 2 genauer beschrieben werden. Weiters wird in diesem<br />

Kapitel eine Einführung in das medizinische Umfeld gegeben.<br />

Entstanden ist diese Arbeit <strong>aus</strong> einer Initiative des Forschungsprojektes <strong>SEE</strong>-<strong>KID</strong> am Fachhochschulstudiengang<br />

Software-Engineering für Medizin, das sich schon seit einiger Zeit mit<br />

der Erstellung eines Augenmodells beschäftigt. Kap. 3 beschreibt nicht nur den Zusammenhang<br />

dieser Arbeit mit dem Projekt <strong>SEE</strong>-<strong>KID</strong>, sondern definiert auch die genauen Anforderungen<br />

an das System.<br />

Die eigentliche Verarbeitung der Bilder, die von der Beschaffung der Bilder über die Bildaufbereitung<br />

bis hin zum Analysieren und Generieren einer Objektoberfläche reicht, ist in<br />

Kap. 4 beschrieben. Dabei wird besonders auf die verwendeten Verfahren und Algorithmen<br />

eingegangen, die zentraler Bestandteil der Arbeit sind. In Kap. 5 ist die detailierte Umsetzung<br />

der Algorithmen erklärt, wobei kurze Quellcode<strong>aus</strong>schnitte im Anhang und zahlreiche<br />

Bilder ein leichteres Verständnis bringen sollen.<br />

Die theoretische Beschreibung des entstandenen Systems, wird in Kap. 6 anhand eines einfachen<br />

Beispiels in die Praxis umgesetzt. Dabei wurde vor allem Anwendung und die Praxisrelevanz<br />

dargestellt. Darüber hin<strong>aus</strong> wurde ein Vergleich mit einem kommerziellen Softwaresystem<br />

angestellt.<br />

In Kap. 7 und Kap. 8 werden persönliche Erfahrungen und Verbesserungsmöglichkeiten angegeben.<br />

Diese Arbeit dient als Grundlage bzw. als Vorarbeit für weitere Projekte. Daher steht<br />

am Abschluss ein kurzer Ausblick auf noch geplante Arbeitsschritte, die schließlich wieder in<br />

das Projekt <strong>SEE</strong>-<strong>KID</strong> einfließen sollen.<br />

ix


x DANK<br />

Dank<br />

Diese Arbeit entstand als Diplomarbeit am Fachhochschulstudiengang Software Engineering<br />

in Hagenberg. Mein Dank gilt allen Mitarbeitern dieses Instituts, denn die fundierte<br />

Ausbildung, die ich durch deren Engagement genießen konnte, war ein wesentlicher Motivationsfaktor<br />

für mich. Mein spezieller Dank gilt Herrn FH-Prof. Dipl.-Ing. Dr. Herwig Mayr<br />

und Herrn Dipl.-Ing. (FH) Michael Buchberger für die Betreuung dieser Arbeit und allen<br />

Mitarbeitern der Forschungsabteilung der FH-Hagenberg für die gute Zusammenarbeit und<br />

die Hinweise zu meiner Arbeit.<br />

Franz Pirklbauer


Inhaltsverzeichnis<br />

Vorwort ix<br />

1 Einführung 1<br />

1.1 Modellierung in der virtuellen Chirurgie . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2 Generierung von <strong>3D</strong>-Augenmuskelmodellen <strong>aus</strong> <strong>MR</strong>-Bildern . . . . . . . . . . 2<br />

2 Grundlagen 5<br />

2.1 Medizintechnische Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.1.1 Anatomie des menschlichen Auges . . . . . . . . . . . . . . . . . . . . 5<br />

2.1.2 Magnetresonanztomographie . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.2 Softwaretechnische Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.2.1 Scan-Line-Verfahren für Polygone . . . . . . . . . . . . . . . . . . . . . 10<br />

2.2.2 Marching-Cube-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . 12<br />

3 Problemstellung 17<br />

3.1 Das Forschungsprojekt <strong>SEE</strong>-<strong>KID</strong> . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

3.1.1 Projektziel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

3.1.2 Projektgeschichte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />

3.1.3 Bisherige Projektergebnisse . . . . . . . . . . . . . . . . . . . . . . . . 18<br />

3.1.4 Projektpartner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

3.2 Notwendigkeit einer Muskelvisualisierung . . . . . . . . . . . . . . . . . . . . 21<br />

3.3 Segmentierung und Visualisierung von <strong>Augenmuskeln</strong> . . . . . . . . . . . . . 22<br />

4 Systemmodell und Ablauf 25<br />

4.1 Beschaffung von Bildern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

4.2 Bildaufbereitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

4.2.1 Sortieren der Farbpalette . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

4.2.2 Definition von Polygonbereichen . . . . . . . . . . . . . . . . . . . . . 27<br />

4.2.3 Definition von Schwellwerten . . . . . . . . . . . . . . . . . . . . . . . 28<br />

4.3 Generieren eines Polyedermodells . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />

4.3.1 Erstellen des Datenvolumens . . . . . . . . . . . . . . . . . . . . . . . 30<br />

4.3.2 Schwellwertanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

4.3.3 Zurückführen auf Grundkonfigurationen . . . . . . . . . . . . . . . . . 32<br />

4.3.4 Definition der Polyeder . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />

4.4 Plattformunabhängige Abspeicherung . . . . . . . . . . . . . . . . . . . . . . 38<br />

xi


xii INHALTSVERZEICHNIS<br />

5 Implementierung 41<br />

5.1 Beschreibung des statischen Klassenmodells . . . . . . . . . . . . . . . . . . . 41<br />

5.2 Bildbearbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />

5.2.1 Ausgangspunkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />

5.2.2 Veränderungen an den Bildern . . . . . . . . . . . . . . . . . . . . . . 44<br />

5.2.2.1 Farbpalette . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />

5.2.2.2 Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />

5.2.2.3 Schwellwertbereich . . . . . . . . . . . . . . . . . . . . . . . . 46<br />

5.2.3 Abspeichern der Zwischenergebnisse . . . . . . . . . . . . . . . . . . . 47<br />

5.3 Generierung eines Polyedermodells . . . . . . . . . . . . . . . . . . . . . . . . 48<br />

5.3.1 Erstellung eines Volumensmodells . . . . . . . . . . . . . . . . . . . . 48<br />

5.3.2 Polygongenerierung mithilfe des Marching-Cube-Algorithmus . . . . . 49<br />

5.3.3 Abspeicherung der Resultate . . . . . . . . . . . . . . . . . . . . . . . 53<br />

6 Anwendung und Ergebnisse 55<br />

6.1 Beispiel: <strong>Rekonstruktion</strong> des m. rect. med. <strong>aus</strong> Coronalschnitten . . . . . . . . 55<br />

6.2 Vergleich der Ergebnisse mit anderen Anwendungen . . . . . . . . . . . . . . 59<br />

7 Vorgehen <strong>aus</strong> der Sicht des Software-Ingenieurs 63<br />

8 Schlussbemerkungen 65<br />

8.1 Ergebnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />

8.2 Verbesserungsmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />

8.3 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />

A Quellcodebeispiele 69<br />

A.1 Farbpalette setzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

A.2 Polygonaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

A.3 Datenvolumen generieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />

A.4 Kantenschwellwert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />

B Screenshots 75<br />

C Glossar 79<br />

Literatur 83


Abbildungsverzeichnis<br />

1.1 Bildanalyse, Mustererkennung und Visualisierung . . . . . . . . . . . . . . . . 1<br />

2.1 Blick von oben auf das rechte Auge . . . . . . . . . . . . . . . . . . . . . . . . 6<br />

2.2 Schematische Darstellung eines geraden Augenmuskels mit Ursprung, Tangentialund<br />

Insertionspunkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />

2.3 Blicklinie, Vertikal- und Horizontalachse; Rotationen zu anderen Blickpositionen 7<br />

2.4 <strong>MR</strong>-Bilder des menschlichen Auges mit axialer (A), sagittaler (B) und coronaler<br />

(C) Schichtführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.5 a) Polygon um den m. rect. sup. b) Polygon mit Scan-Linie c) gefülltes Polygon 11<br />

2.6 Sonderfälle des Scan-Line-Verfahrens beim Auftreffen der Scan-Linie auf einen<br />

Eckpunkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

2.7 Definition eines Würfels im Marching-Cube-Algorithmus . . . . . . . . . . . . 13<br />

2.8 Standardkonfigurationen beim Marching-Cube-Algorithmus . . . . . . . . . . 14<br />

3.1 Screenshot vom Programm <strong>SEE</strong>++ . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

3.2 Augenvisualisierung nach Miller . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

4.1 Vereinfachtes Beispiel zum Sortieren der Farbpalette . . . . . . . . . . . . . . 27<br />

4.2 Polygonbeispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />

4.3 Definition eines Schwellwertbereiches . . . . . . . . . . . . . . . . . . . . . . . 29<br />

4.4 Segmentierung der Bilddaten . . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />

4.5 Invertierung der Würfelkonfiguration . . . . . . . . . . . . . . . . . . . . . . . 32<br />

4.6 Zurückführung auf eine Standardkonfiguration . . . . . . . . . . . . . . . . . 34<br />

4.7 Beschriftung der Würfeleckpunkte und Kanten . . . . . . . . . . . . . . . . . 35<br />

4.8 Zurückrotieren der Dreiecke . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

5.1 Statisches Klassenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />

5.2 Feld zur Verwaltung der Paletteneinträge . . . . . . . . . . . . . . . . . . . . 44<br />

5.3 Screenshot vom Programm zur Bildbearbeitung . . . . . . . . . . . . . . . . . 45<br />

5.4 Aufbau eines Würfels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />

6.1 Sortieren der Farbpalette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />

6.2 Öffnen der Bilddateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />

6.3 Mögliche Schwellwert- und Polygondefinition . . . . . . . . . . . . . . . . . . 57<br />

6.4 Ausschnitte der manipulierten Bilder . . . . . . . . . . . . . . . . . . . . . . . 58<br />

6.5 <strong>3D</strong>-<strong>Rekonstruktion</strong> des m. rect. med. . . . . . . . . . . . . . . . . . . . . . . . 59<br />

6.6 Blick durch den m. rect. med. . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />

6.7 Ausschnitt <strong>aus</strong> dem Voxel-Man <strong>3D</strong>-Navigator . . . . . . . . . . . . . . . . . . 61<br />

xiii


xiv ABBILDUNGSVERZEICHNIS<br />

6.8 <strong>3D</strong>-<strong>Rekonstruktion</strong> von Sehnerv und Bulbus . . . . . . . . . . . . . . . . . . . 62<br />

B.1 Unterer Schwellwert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />

B.2 Unterer und oberer Schwellwert . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

B.3 Oberer Schwellwert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77


Tabellenverzeichnis<br />

4.1 Übersicht über die verwendeten <strong>MR</strong>-Bildfolgen . . . . . . . . . . . . . . . . . 25<br />

4.2 Vorkommen der Grundkonfigurationen . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.3 Zuweisung der Dreieckseckpunkte auf die Würfelkanten . . . . . . . . . . . . 37<br />

5.1 Beispiel für die Dateibenennung . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

5.2 Definition der Würfel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />

6.1 Schwellwertbereiche der Bildserie . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />

xv


xvi TABELLENVERZEICHNIS


Kapitel 1<br />

Einführung<br />

1.1 Modellierung in der virtuellen Chirurgie<br />

In der modernen Medizin nehmen Bildverarbeitungssysteme einen immer höheren Stellenwert<br />

ein. Dies liegt vor allem daran, dass das menschliche Auge wesentlich mehr Informationen<br />

in Bildform verarbeiten kann als in Tabellen- oder Textform. Verschiedenste Techniken<br />

und Verfahren der Bildgewinnung, wie etwa die Röntgentechnik, die Computertomographie<br />

(CT) oder die Magnetresonanztomographie (<strong>MR</strong>T), bieten dem Arzt Unterstützung bei Diagnostik<br />

und Therapie. Zahlreiche Krankheiten können nur mit derartigen Visualisierungen<br />

festgestellt werden. Sämtliche Verfahren liefern ein oder mehrere zweidimensionale Bilder<br />

von spezifischen Körperregion. Die Aufgabe der medizinischen Bildverarbeitung ist es, diese<br />

Bildfolgen so aufzubereiten, dass sie dreidimensional am Bildschirm sichtbar werden.<br />

Eine der wichtigsten Anforderungen an diagnoseunterstützende Bildanalysesysteme ist die<br />

Darstellung von medizinischen Bildobjekten wie Gewebe, Tumore, Knochen, Muskeln oder<br />

ganzer Organe. Die technische Umsetzung basiert auf Verfahren und Techniken <strong>aus</strong> den<br />

Bereichen der Bildanalyse, Mustererkennung und Visualisierung (Abb. 1.1), wobei diese Bereiche<br />

eng miteinander verbunden und voneinander abhängig sind.<br />

Mustererkennung<br />

Bildanalyse Visualisierung<br />

Abbildung 1.1: Bildanalyse, Mustererkennung und Visualisierung<br />

1


2 KAPITEL 1. EINFÜHRUNG<br />

Dieser Zusammenhang wird in [Handels, 2000] wie folgt beschrieben:<br />

• Die Bildanalyse hat die Extraktion von Objekten und ihre quantitative Beschreibung<br />

zum Ziel. Einen wichtigen Teilschritt bildet hier die Segmentierung, d.h. die algorithmische<br />

Abgrenzung medizinischer Bildobjekte in Bildern und Bildfolgen. Sie ist<br />

grundlegend für die weitergehende Analyse von Bildobjekten sowie ihre dreidimensionale<br />

Visualisierung.<br />

• Die Mustererkennung beschäftigt sich mit der automatischen Verarbeitung, Analyse<br />

und Erkennung von Mustern. Eine Vielzahl von Fragestellungen der medizinischen<br />

Diagnostik kann als Mustererkennungsproblem modelliert werden. Medizinische Bilder<br />

werden in diesem Kontext als komplexe Untersuchungsergebnisse aufgefasst, wobei die<br />

Mustererkennung speziell auf die Erkennung von Bildstrukturen (Gewebe, Gefäße, etc.)<br />

gerichtet ist.<br />

• Bei der Visualisierung werden Techniken <strong>aus</strong> dem Beriech der Computergraphik zur<br />

Darstellung medizinischer bilder und Bildfolgen sowie der durch Bildanalyse- und Mustererkennungsverfahren<br />

erhaltenen Ergebnisse eingesetzt. Sie erleichtern das Verständnis<br />

und die Interpretation der vielfältigen Informationen, die <strong>aus</strong> medizinischen Bilddaten<br />

extrahiert werden können.<br />

Auf Basis dieser Dreiecksbeziehung soll ein System erstellt werden, dass <strong>aus</strong>gehend von medizinischen<br />

Bildfolgen die Bereiche der <strong>Augenmuskeln</strong> segmentiert, die Oberfläche selbständig<br />

abtastet und eine Visualisierung des gesuchten Augenmuskels liefert.<br />

1.2 Generierung von <strong>3D</strong>-Augenmuskelmodellen <strong>aus</strong> <strong>MR</strong>-Bildern<br />

Die derzeit vorhandenen Systeme <strong>aus</strong> dem Bereich der medizinischen Bildverarbeitung bieten<br />

zum Teil eine gute Verwaltung von Schnittbildern bis hin zu einer guten Visualisierung von<br />

Körperteilen. Allerdings ist es bei keinem System möglich, die gewünschten Visualisierungsbereiche<br />

selbst <strong>aus</strong>zuwählen bzw. die Ergebnisse vernünftig abzuspeichern. Diese Tatsache<br />

war der Grund dafür, eine eigene Realisierung eines medizinischen Bildverarbeitungssystems<br />

anzugehen.<br />

Die Anforderungen an eine spezielle <strong>Rekonstruktion</strong> der extraokulären <strong>Augenmuskeln</strong> lassen<br />

sich wie folgt auflisten:<br />

• Der Ausgangspunkt für die Arbeiten sind Magnetresonanzbilder des menschlichen Auges.<br />

• Mithilfe von entsprechenden Verfahren und Algorithmen <strong>aus</strong> der digitalen Bildverarbeitung<br />

ist die gesuchte Objektoberfläche zu segmentieren und zu analysieren.<br />

• Die dreidimensionale Visualisierung muss die Oberfläche möglichst originalgetreu nachstellen<br />

und von allen Seiten betrachten lassen können.


1.2. GENERIERUNG VON <strong>3D</strong>-AUGENMUSKELMODELLEN AUS <strong>MR</strong>-BILDERN 3<br />

• Die Ergebnisse müssen in einem verbreitet verwendeten Format abgespeichert und so<br />

anderen Programmen zur Verfügung gestellt werden.<br />

• Die Interaktion des Benutzers ist auf einige wenige Eingriffe zu reduzieren.<br />

Die Arbeitsschritte, die zur Erreichung dieses Ziels notwendig sind, lassen sich zunächst grob<br />

in drei Bereiche aufteilen:<br />

1. Beschaffung der Bilder,<br />

2. Bearbeiten der Bilder,<br />

3. Analyse und Generierung der Objektoberfläche.<br />

Zur Beschaffung der Bilder wurde eng mit spezialisten <strong>aus</strong> dem Bereich der Erstellung von<br />

Magnetresonanzbildern zusammengearbeitet. Diese Bilder werden in das Bitmap-Format<br />

umgewandelt und dann weiter bearbeitet.<br />

Die Manipulation der Bilder umfasst<br />

• das Sortieren der Farbpalette,<br />

• die Definition von Polygonbereichen und<br />

• die Definition von Schwellwertbereichen.<br />

Durch das Sortieren der Farbpalette wird der Vergleich der Farben vereinfacht, womit die<br />

späteren Arbeiten wesentlich erleichtert werden. Um die Auswahl von speziellen Körperregionen<br />

zu ermöglichen, werden Polygone definiert, die z. B. einen Augenmuskel umschließen<br />

und somit für die Verarbeitung markieren. Ein spezieller Farbbereich kann durch die<br />

Definition von einem Schwellwertbereich definiert werden. Die Farbpunkte, die nicht den<br />

Augenmuskel darstellen, werden so eliminiert.<br />

Um eine Oberfläche des Muskels zu rekonstruieren, ist<br />

• ein spezielles Datenvolumen zu erstellen,<br />

• eine Schwellwertanalyse durchzuführen,<br />

• die Folge der Bilder mit einem geeigneten Algorithmus zu analysieren,<br />

• eine Oberfläche zu generieren und<br />

• diese Oberfläche abzuspeichern.<br />

Bei all diesen Arbeiten wird unter anderem auf bereits bekannte Algorithmen und Vorgehensweisen<br />

zurückgegriffen. Neben der Vorstellung dieser wird im nächsten Kapitel eine kurze<br />

Einführung in das medizinische Umfeld gegeben.


4 KAPITEL 1. EINFÜHRUNG


Kapitel 2<br />

Grundlagen<br />

2.1 Medizintechnische Grundlagen<br />

2.1.1 Anatomie des menschlichen Auges<br />

Die Augen zählen zu den wichtigsten Sinnesorganen des menschlichen Organismus. Sie liefern<br />

uns ein ständig aktualisiertes Bild der Welt um uns. Eine Beschreibung von Aufbau und<br />

Funktionsweise der Augen ist für das Verständnis des Umfeldes dieser Arbeit von grundlegender<br />

Bedeutung. Die folgenden Erläuterungen beziehen sich auf das rechte Auge.<br />

Der Augapfel (lat. bulbus oculi, kurz bulbus, ø ca. 2.4 cm, annähernd kugelförmig lt. [Pschyrembel,<br />

1994]) liegt geschützt in der Augenhöhle (Orbita), welche eine Vertiefung in den<br />

Schädelknochen ist. Der Bulbus ist zwiebelschalenartig <strong>aus</strong> drei Schichten aufgebaut [Schäffler<br />

und Schmidt, 1998]:<br />

• sklera (Lederhaut): äußere Augenhaut,<br />

• choroidea (Aderhaut): mittlere Augenhaut,<br />

• retina (Netzhaut): innere Augenhaut.<br />

Für die Bewegung des Bulbus sind die sechs extraokulären <strong>Augenmuskeln</strong> verantwortlich. Die<br />

vier geraden <strong>Augenmuskeln</strong> (musculi recti) und die beiden schrägen <strong>Augenmuskeln</strong> (musculi<br />

obliqui) entspringen in der Augenhöhle und setzen an der Lederhaut des Augapfels an.<br />

Abb. 2.1 zeigt den Ursprung der Muskeln in der Orbita und den Ansatz (Insertion) auf dem<br />

Bulbus. Die hauptsächliche Wirkungsrichtung jedes Muskels lässt sich <strong>aus</strong> der Bezeichnung<br />

ableiten [Brugger, 2000]:<br />

• musculus rectus superior (oberer gerader Augenmuskel): nach oben,<br />

• musculus rectus inferior (unterer gerader Augenmuskel): nach unten,<br />

• musculus rectus lateralis (äußerer gerader Augenmuskel): seitwärts nach außen,<br />

5


6 KAPITEL 2. GRUNDLAGEN<br />

• musculus rectus medialis (innerer gerader Augenmuskel): seitwärts nach innen,<br />

• musculus obliquus superior (oberer schräger Augenmuskel): nach unten und außen,<br />

• musculus obliquus inferior (unterer schräger Augenmuskel): nach oben und innen.<br />

Abbildung 2.1: Blick von oben auf das rechte Auge<br />

Die rechtwinkelig zueinander angeordneten musculi recti entspringen in der Spitze der Orbita.<br />

Ihre Endsehnen vereinigen sich zu einer ringformigen Sehnenplatte (Zinn’scher Ring)<br />

und ihre Insertionen liegen vor der Äquatorialebene des Bulbus (vgl. [Günther, 1986]). Im<br />

Gegensatz dazu setzen die musculi obliqui hinter dem Bulbusäquator an und ziehen schräg<br />

nach vorne. Dadurch ist auch zu erklären, dass sich die Wirkungsrichtung umkehrt. Der<br />

m. obl. sup. ist der längste aller <strong>Augenmuskeln</strong>. Ausgehend von der Insertion läuft er oberhalb<br />

des Bulbus in Richtung des nasalen Stirnbeins, durchzieht eine knorpelige Rolle (die<br />

Trochlea) und verläuft von hier <strong>aus</strong> direkt zu seinem Ursprung nahe am Zinn’schen Ring.<br />

Der m. obl. inf. entspringt am nasalen Rand des knöchernen Orbitabodens, läuft unterhalb<br />

des Bulbus um den m. rect. inf. herum und setzt im hinteren Bereich des Augapfels an. Im<br />

Bereich der Überkreuzung von m. obl. inf. und m. rect. inf. existiert eine sehnige Verbindung<br />

zwischen den beiden Muskeln, die ligamentum lockwood genannt wird [Günther, 1986].<br />

Jeder Augenmuskel besteht neben dem rein muskulären Anteil auch <strong>aus</strong> einem sehnigen<br />

Anteil. Die Sehnen stellen die Verbindung des Muskels zum Ursprung auf der einen Seite,<br />

bzw. zum Insertionspunkt auf der anderen Seite her. Die Gesamtlänge (Muskel und Sehne)<br />

der <strong>Augenmuskeln</strong> ist sehr unterschiedlich. Die größten Unterschiede weisen dabei die Längen<br />

der Sehnen auf (vgl. [Kaufmann, 1995]). Der m. obl. inf. weist mit 0 bis 2 mm die kürzeste<br />

und der m.obl.sup. mit 25 bis 30 mm die längste Sehne auf. Die eigentliche Muskellänge<br />

liegt zwischen 30 mm (bei den mm. obliqui) bis 39 mm (beim m. rect. inf.).<br />

Durch die Lage des Insertionspunktes vor bzw. hinter dem Bulbusäquator verläuft jeder<br />

Muskel zum Teil auf der Bulbusoberfläche. Erst beim Tangentialpunkt endet der Kontakt<br />

zum Bulbus und der Muskel zieht in Richtung seines Ursprungs (vgl. Abb. 2.2). Bei jeder<br />

Bewegung des Bulbus ändert sich auch die Lage der Insertionspunkte relativ zur Orbita.


2.1. MEDIZINTECHNISCHE GRUNDLAGEN 7<br />

Könnten sich die einzelnen Muskeln zwischen Insertionspunkt und Ursprung bei einer Augenbewegung<br />

frei bewegen, hätte dies eine Verschiebung der Muskeln auf der Bulbusoberfläche<br />

zur Folge. Dadurch würde sich der Muskelpfad und somit die Wirkungsrichtung verändern.<br />

Um dies zu verhindern, umgibt eine bindegewebsartige Hülle den Bulbus und stabilisiert die<br />

Muskeln im Bereich des Tangentialpunktes. Diese Stabilisatoren werden Pulleys genannt<br />

(vgl. [Buchberger und Mayr, 2000], [Miller und Demer, 1996]).<br />

Ursprung<br />

Tangentialpunkt<br />

Bulbusmittelpunkt =<br />

Rotationspunkt<br />

Insertionspunkt<br />

Abbildung 2.2: Schematische Darstellung eines geraden Augenmuskels mit Ursprung,<br />

Tangential- und Insertionspunkt<br />

Abbildung 2.3: Blicklinie, Vertikal- und Horizontalachse; Rotationen zu anderen Blickpositionen<br />

Die Bewegung des Bulbus entspricht annähernd einer Rotation eines Objektes im dreidimensionalen<br />

Raum um eine bestimmte Achse. Der Bulbusmittelpunkt kann dabei als Rotationszentrum<br />

gesehen werden. Die Blicklinie ist ein Vektor vom Bulbusmittelpunkt durch<br />

die Mitte der Pupille. Normal dazu liegen die Vertikal- und die Horizontalachse, wobei der<br />

Schnittpunkt dieser drei Achsen im Bulbusmittelpunkt liegt (vgl. Abb. 2.3a). Die Medizin<br />

unterscheidet grundsätzlich drei Augenpositionen (vgl. [Kaufmann, 1995]):<br />

• Primärposition: Das Auge blickt bei fixiertem Kopf gerade<strong>aus</strong> ins “Unendliche“. Es<br />

wird angenommen, dass in dieser Position alle Muskeln am wenigsten gespannt sind.<br />

Aus dieser Lage sind alle anderen Blickpositionen mit möglichst geringem Energieaufwand<br />

erreichbar.<br />

• Sekundärposition: Ausgehend von der Primärposition erfolgt eine Rotation um die<br />

horizontale oder vertikale Achse (Abb. 2.3b). Das Auge blickt nach links oder rechts<br />

bzw. nach oben oder unten.


8 KAPITEL 2. GRUNDLAGEN<br />

• Tertiärposition: Ausgehend von der Primärposition erfolgt eine Rotation um die horizontale<br />

und vertikale Achse (Abb. 2.3c). Das Auge blickt z. B. nach links oben oder<br />

nach rechts unten. Die Kombination um zwei Achsen kann auch durch eine Rotationsachse<br />

dargestellt werden, die in der durch horizontale und vertikale Achse aufgespannten<br />

Ebene liegt (Abb. 2.3d).<br />

Beide Augen können nur in binokularer Gemeinschaft miteinander bewegt werden, d.h. die<br />

Bewegung nur eines Auges ist in der Regel nicht möglich (vgl. [Günther, 1986]). Die <strong>Augenmuskeln</strong><br />

sind in der Lage, das Auge sehr schnell und punktgenau zu positionieren. Darüber<br />

hin<strong>aus</strong> kann das Auge ohne Ermüdung in einer bestimmten Stellung gehalten werden.<br />

2.1.2 Magnetresonanztomographie<br />

Die medizinische Bildverarbeitung ist geprägt durch eine große Vielfalt verschiedener Bildarten,<br />

die zur Unterstützung der medizinischen Diagnostik und Therapie generiert werden.<br />

Die bekanntesten Techniken sind lt. [Handels, 2000]:<br />

• die Ultraschalltechnik (Sonographie),<br />

• die Röntgentechnik,<br />

• die Computertomographie (CT) als Weiterentwicklung der Röntgentechnik und<br />

• die Magnetresonanztomographie (<strong>MR</strong>T, oder <strong>MR</strong>), auch als Kernspintomographie<br />

bekannt.<br />

Die Grundlage dieser Arbeit stellen <strong>MR</strong>-Schnittbildfolgen des menschlichen Auges dar, weshalb<br />

hier nur diese Technik genauer beschrieben wird.<br />

Die physikalische Grundlage der Magnetresonanztomographie bildet das Phänomen der kernmagnetischen<br />

Resonanz, das 1946 von Felix Bloch und Edward M. Purcell entdeckt wurde<br />

(vgl. [Brockh<strong>aus</strong>, 1989]). Die kernmagnetische Resonanz beruht auf der Wechselwirkung<br />

zwischen Atomkernen mit bestimmten Eigenschaften und einem äußeren Magnetfeld. In<br />

der medizinischen <strong>MR</strong>-Bildgebung spielt das Wasserstoffatom eine wesentliche Rolle, da der<br />

menschliche Körper zu 70 % <strong>aus</strong> Wasser besteht.<br />

Wasserstoff ist ein schwach positiver Magnet. Das Zufallsprinzip bewirkt, dass diese “Magnete“<br />

im menschlichen Körper keine geordnete Richtung haben (Prinzip: Chaos). Ein von außen<br />

einwirkendes Magnetfeld großer Stärke ordnet diese Felder in eine Richtung (vgl. [Kauffmann<br />

et al., 1996]). Nach dieser Anregung bewegen sich die angeregten Wasserstoffatome auf ihren<br />

Gleichgewichtszustand zurück und strahlen dabei Energie in Form elektromagnetischer<br />

Wellen ab. Je nach dem, wieviele Wasserstoffatome in einem bestimmten Bereich vorhanden<br />

sind, verändert sich die abgestrahlte Energie. Diese Veränderungen sind messbar und im<br />

<strong>MR</strong>-Tomographen kann ein Bild des gesuchten Organs rekonstruiert werden. Eine genauere<br />

Beschreibung dieses Vorgangs ist in [Dössel, 2000] und [Morneburg, 1995] zu finden.


2.1. MEDIZINTECHNISCHE GRUNDLAGEN 9<br />

<strong>MR</strong>-Bilder weisen einen sehr hohen Weichteilkontrast auf. Muskeln und Nerven heben sich<br />

beispielsweise klar vom umgebenden Fettgewebe ab. Gewebsveränderungen, wie z.B. Tumore,<br />

lassen sich deutlich erkennen und millimetergenau lokalisieren. Demgegenüber ist eine<br />

Darstellung von Knochenstrukturen in <strong>MR</strong>-Bildern nur eingeschränkt möglich, da hier<br />

lediglich vom fetthaltigen Knochenmark <strong>MR</strong>-Signale empfangen werden. In diesem Fall<br />

kommt vorrangig die Computertomographie zum Einsatz, die auf der Abschwächung von<br />

Röntgenstrahlen, die durch den Körper geleitet werden, basiert.<br />

Im Gegensatz zu CT-Aufnahmen können <strong>MR</strong>-Bilder für verschiedene Körperschichten in beliebiger<br />

Orientierung erzeugt werden, ohne dass eine Umlagerung des Patienten durchgeführt<br />

werden muss. Grundsätzlich wird zwischen drei Schichtführungen unterschieden. Die Beschreibungen<br />

stammen <strong>aus</strong> [Roche, 1999] und Abb. 2.4 zeigt Beispiele von <strong>MR</strong>-Aufnahmen<br />

eines menschlichen Auges:<br />

• axial: in Richtung einer Achse; In diesem speziellen Fall handelt es sich um Aufnahmen<br />

entlang der Augenachse, welche die Verbindungslinie zwischen vorderem und hinterem<br />

Augapfelpol darstellt. Axiale Bilder entsprechen dem Blick von oben oder unten auf<br />

das Auge (Abb. 2.4A).<br />

• sagittal: parallel zur Sagittalebene; Die Sagittalebene ist eine Ebene in der Körperlängsachse<br />

streng von hinten nach vorn bzw. umgekehrt. Sagittale Bilder entsprechen<br />

dem Blick von links bzw. rechts auf das Auge (Abb. 2.4B).<br />

• coronal: parallel zur Frontalebene; Die Frontalebene ist die in Richtung der Körperlängsachse<br />

auf der Sagittalebene senkrecht stehende Körperebene. Sie verläuft in etwa<br />

parallel zur Stirn. Coronale Bilder entsprechen dem Blick von vorne auf das Auge<br />

(Abb. 2.4C).<br />

Digitale, medizinische Bilder werden zumeist in einer zweidimensionalen Matrix repräsentiert.<br />

Die Bildpunkte werden hierbei kurz als Pixel (engl.: picture element) bezeichnet. Die Anzahl<br />

der Bildpunkte ist eine Maßzahl für die Auflösung des Bildes. Eine weitere, wichtige Kenngröße<br />

digitaler medizinischer Bilder ist die Grauwerttiefe, die angibt, wie fein diskretisiert<br />

die gemessenen Signale in der Bildmatrix repräsentiert werden können (vgl. [Handels, 2000]).<br />

Ein 2D-Bild, bei dem jedes Pixel mit einem Byte (= 8 Bit) abgespeichert wird, ergibt ein<br />

Grauwertbild mit 256 verschiedenen Gr<strong>aus</strong>tufen.<br />

Aus den Schichtbildern kann ein Volumendatensatz erzeugt werden, indem alle Einzelbilder in<br />

der topologischen Reihenfolge in einem Datensatz zusammengefügt werden. Eine derartige<br />

<strong>3D</strong>-Bildfolge ist eine Sequenz von 2D-Bildern gleicher Schnittführung, die hintereinander<br />

gelegt eine bestimmte Körperregion repräsentieren. Ein Pixel eines Schichtbildes wird auf<br />

diese Weise als Volumenelement (Voxel) interpretiert (vgl. [Kaiser, 1999]).


10 KAPITEL 2. GRUNDLAGEN<br />

Abbildung 2.4: <strong>MR</strong>-Bilder des menschlichen Auges mit axialer (A), sagittaler (B) und coronaler<br />

(C) Schichtführung<br />

2.2 Softwaretechnische Grundlagen<br />

2.2.1 Scan-Line-Verfahren für Polygone<br />

Die <strong>MR</strong>-Bilder, die als Grundlage dieser Arbeit dienen, enthalten naturgemäß mehr Informationen<br />

als nur eine einfache Abbildung der <strong>Augenmuskeln</strong>. Um bei einem Segmentierungsvorgang<br />

nicht das gesamte Bild durchlaufen zu müssen, wird der Betrachtungsbereich durch ein<br />

Polygon eingegrenzt, das <strong>aus</strong> genau einer Fläche besteht und das zu untersuchende Objekt<br />

einschließt (vgl. Abb. 2.5a). Beim späteren Generieren einer Objektoberfläche ist es notwendig,<br />

die gewünschten Bereiche aller Bilder zeilenweise bzw. Pixel für Pixel durchzulaufen, um<br />

jeden Bildpunkt analysieren zu können. Das Scan-Line-Verfahren für Polygone stellt genau<br />

diese Funktionalität zur Verfügung.<br />

Ein Polygon (Vieleck), ist eine Figur, die entsteht, wenn eine feste Anzahl von Punkten<br />

P1, P2, ..., Pn der Reihe nach durch ein Geradenstück verbunden wird: P1 mit P2, P2 mit<br />

P3 ... Pn mit P1 (vgl. [Brockh<strong>aus</strong>, 1989]). Die Koordinaten dieser Eckpunkte dienen als<br />

Eingabewerte für den Scan-Line-Algorithmus. [Vornberger et al., 1997] beschreibt die Idee<br />

dieses Verfahrens so:<br />

Bewege eine wagrechte Scan-Linie schrittweise von oben nach unten über das Objekt (Polygon),<br />

und berechne die Schnittpunkte der Scan-Linie mit dem Objekt.<br />

1. Sortiere alle Kanten nach ihrem größten y-Wert.<br />

2. Bewege die Scan-Linie vom größten y-Wert bis zum kleinsten y-Wert.


2.2. SOFTWARETECHNISCHE GRUNDLAGEN 11<br />

3. Für jede Position der Scan-Linie<br />

• wird die Liste der aktiven Polygonkanten ermittelt,<br />

• werden Schnittpunkte berechnet und nach x-Werten sortiert,<br />

• werden jene Segmente der Scan-Linie angezeigt, die im Inneren des Polygons liegen.<br />

Für jede Seite (Kante) des Polygons sind die Koordinaten xi, yi der Ecke mit dem Maximum<br />

y, sowie die Differenzen ∆x, ∆y bekannt, <strong>aus</strong> denen sich die Koordinaten der anderen Ecke<br />

berechnen lassen. Zunächst werden alle Kanten nach den größten y-Werten sortiert. Bei<br />

Übereinstimmung werden die x-Werte bzw. ∆x und ∆y als Sortierkriterium herangezogen.<br />

Die Sortierung der Kanten nach ihrem größten y-Werten ermöglicht den einfachen Aufbau<br />

und die effiziente Aktualisierung einer Liste von aktiven Kanten. Eine Kante wird in diese<br />

Liste aufgenommen, wenn der Endpunkt mit dem größerem y-Wert von der Scan-Linie<br />

überstrichen wird, und wird wieder entfernt, wenn die Scan-Linie den anderen Endpunkt<br />

überstreicht. Beim Beispiel in Abb. 2.5b stehen am Beginn die Kanten BA und BC in der<br />

aktiven Liste. Erreicht die Scan-Linie den Punkt D werden auch die Kanten DC und DE in<br />

die aktive Kantenliste aufgenommen.<br />

Abbildung 2.5: a) Polygon um den m. rect. sup. b) Polygon mit Scan-Linie c) gefülltes Polygon<br />

Jede Position der Scan-Linie teilt das Polygon in Schnitte mit den Eigenschaften, dass jeder<br />

Schnitt eine geradzahlige Anzahl von Kanten enthält und dass das Innere eines Gebietes<br />

zwischen den Kanten mit ungerader und mit gerader Kantennummer liegt (vgl. [Pavladis,<br />

1990]). Im oben erwähnten Beispiel liegt demnach das Gebiet zwischen den Punkten A ′ und<br />

B ′ . Das Ausfüllen vollzieht sich dadurch, dass für jede Position der Scan-Linie zwischen den<br />

entsprechenden Schnittpunkten mit den Kanten eine Linie gezeichnet wird. Abb. 2.5c zeigt<br />

ein Polygon, dass mit dem Scan-Line-Verfahren gefüllt wurde.<br />

Damit der Algorithmus für ein beliebiges Polygon funktioniert, sind einige Sonderfälle zu<br />

berücksichtigen (lt. [Vornberger et al., 1997]):<br />

• Horizontale Kanten werden nicht in die Kantenliste aufgenommen. Für sie wird eine<br />

Linie gezeichnet.


12 KAPITEL 2. GRUNDLAGEN<br />

• Trifft die Scan-Linie auf einen Polygoneckpunkt, dessen Kanten beide oberhalb oder<br />

beide unterhalb liegen, so zählt der Schnittpunkt doppelt (vgl. Abb. 2.6a und b).<br />

• Trifft die Scan-Linie auf einen Polygoneckpunkt, dessen Kanten oberhalb und unterhalb<br />

liegen, so zählt der Schnittpunkt nur einfach (vgl. Abb. 2.6c).<br />

doppelt<br />

doppelt<br />

einfach<br />

a) b) c)<br />

Scan-Linie<br />

Abbildung 2.6: Sonderfälle des Scan-Line-Verfahrens beim Auftreffen der Scan-Linie auf<br />

einen Eckpunkt<br />

2.2.2 Marching-Cube-Algorithmus<br />

Um bestimmte Köprerregionen <strong>aus</strong>gehend von zweidimensionalen <strong>MR</strong>-Schnittbildfolgen dreidimensional<br />

visualisieren zu können, ist es notwendig, die Oberflächen der anatomischen Objekte<br />

<strong>aus</strong> dem Grauwert-Volumendatensatz zu extrahieren. Ein Algorithmus, der speziell für<br />

diese Anforderung entwickelt wurde, ist der Marching-Cube-Algorithmus, der 1987 erstmals<br />

von William E. Lorensen und Harvey E. Cline vorgestellt wurde (vgl. [Lorensen und Cline,<br />

1987]). Es wird dabei ein Dreiecksmodell erstellt, das die Oberfläche des gesuchten Objektes<br />

darstellt.<br />

Für die Repräsentation von rekonstruierten Oberflächen <strong>aus</strong> Volumendaten hat sich mit<br />

dem Dreieck die einfachste Polygonstruktur durchgesetzt. Die Vorteile gegenüber anderen<br />

Polygonstrukturen sind (lt. [Kaiser, 1999]):<br />

• Alle Punkte innerhalb eines Dreiecks liegen auf einer Ebene.<br />

• Jedes ebene Objekt mit mehr als drei Ecken lässt sich in mehrere Dreiecke zerlegen.<br />

• Die <strong>3D</strong>-Visualisierung von Dreiecken kann leicht in Hardware durchgeführt werden.<br />

Beim Marching-Cube-Algorithmus wird ein Voxel durch einen Punkt repräsentiert, dem ein<br />

Signal-, Parameter- oder Grauwert f(x, y, z) zugeordnet wird. Der gesamte <strong>3D</strong>-Bilddatensatz<br />

wird somit als Punktgitter aufgefasst. Weiters wird ein Schwellwert t ∈ R definiert. Dieser<br />

Schwellwert gibt jenen Farbwert an, der die gesuchte Oberfläche beschreibt. Jedes Voxel im<br />

<strong>3D</strong>-Bilddatensatz kann so in eine binäre Form gebracht werden (vgl. [Handels, 2000]):<br />

B(x, y, z) =<br />

� 0, falls f(x, y, z) > t<br />

1, falls f(x, y, z) ≤ t<br />

(2.1)


2.2. SOFTWARETECHNISCHE GRUNDLAGEN 13<br />

In dieser Arbeit wird der Algorithmus dahingehend erweitert, dass ein unterer (t1) und ein<br />

oberer (t2) Schwellwert definiert werden. Die Formel 2.1 wird dementsprechend abgeändert:<br />

B ′ �<br />

0, falls f(x, y, z) < t1 ∨ f(x, y, z) > t2<br />

(x, y, z) =<br />

1, falls t1 ≤ f(x, y, z) ≤ t2<br />

(2.2)<br />

Diese Schwellwertanalyse ergibt ein Binärmuster des <strong>3D</strong>-Bilddatensatzes, wobei ein Wert 1<br />

bedeutet, dass das Voxel innerhalb des gesuchten Objektes liegt und ein Wert 0, dass sich<br />

der Bildpunkt außerhalb des gesuchten Bereichs befindet.<br />

Bei der Oberflächenrekonstruktion werden <strong>aus</strong> zwei benachbarten Schichten die lokalen Voxelkonfigurationen<br />

bestehend <strong>aus</strong> 8 benachbarten Voxeln betrachtet, wobei jeweils 4 der Voxel<br />

<strong>aus</strong> einer der beiden Schichten stammen. Die einzelnen Voxel werden somit als Eckpunkte<br />

eines Würfels (bzw. eines Quaders) gesehen (vgl. Abb. 2.7). Wenn die Binärkonfigurationen<br />

zweier benachbarter Eckpunkte des Würfels unterschiedlich sind, so heißt das, dass die gesuchte<br />

Objektoberfläche zwischen diesen beiden Punkten liegen muss. Ein Punkt der gesuchten<br />

Dreiecksoberfläche liegt also auf der Kante des Würfels, die durch die beiden Punkte<br />

definiert ist.<br />

Abbildung 2.7: Definition eines Würfels im Marching-Cube-Algorithmus<br />

In jedem Würfel sind 2 8 = 256 binäre Konfigurationen möglich. Die Komplexität wird entscheidend<br />

vereinfacht, indem sich der Algorithmus auf die Betrachtung von 15 Grundkonfigurationen<br />

beschränkt (vgl. Abb. 2.8). Durch die Anwendung von einer Kombination der unten<br />

aufgelisteten Aktionen, können alle 256 Konfigurationen auf diese Standardkonfigurationen<br />

zurückgeführt werden (vgl. [Kaiser, 1999]):<br />

• Drehungen um die drei Hauptachsen<br />

• Spiegelungen an den drei Hauptachsen<br />

• Invertierung der Eckenklassifizierung<br />

Für jede Grundkonfiguration ist eine entsprechende Anordnung von Dreiecken vorgeschrieben,<br />

die die Objektoberfläche wiedergibt (vgl. Abb. 2.8). Der einfachste Fall (0) besagt,


14 KAPITEL 2. GRUNDLAGEN<br />

Abbildung 2.8: Standardkonfigurationen beim Marching-Cube-Algorithmus


2.2. SOFTWARETECHNISCHE GRUNDLAGEN 15<br />

dass alle Punkte des Würfels innerhalb oder außerhalb des gesuchten Objektes liegen. Folglich<br />

beinhaltet ein derartiger Würfel keine Oberflächendreiecke. Der nächsten Fall (1) tritt<br />

genau dann auf, wenn sich ein Eckpunkt von den anderen sieben unterscheidet. Dar<strong>aus</strong> resultiert<br />

ein Oberflächendreieck, dessen Eckpunkte sich auf den entsprechenden Kanten des<br />

Würfels befinden [Lorensen und Cline, 1987]. Alle anderen Fälle produzieren auf die selbe<br />

Weise Dreiecke, wobei die genaue Position eines Dreieckspunktes auf einer Kante durch eine<br />

Interpolation der Grauwerte der beteiligten Voxel bestimmt wird.<br />

Mit dem Durchwandern (marching) dieser Würfel (cubes) durch das Datenvolumen wird der<br />

gesamte <strong>3D</strong>-Bilddatensatz analysiert und eine Oberfläche des gesuchten Objektes erstellt.<br />

Der große Vorteil bei der Triangulation mit dem Marching-Cube-Algorithmus besteht darin,<br />

dass die Reihenfolge der Abarbeitung keine Rolle spielt.<br />

Abgesehen vom trivialen Fall 0 werden in jedem Würfel zwischen 1 und 4 Dreiecke erzeugt,<br />

wodurch eine große Anzahl an Dreiecken entsteht und glatte Flächen unnötig oft unterteilt<br />

werden. Trotz dieser Tatsache hat sich der Algorithmus vor allem wegen seiner hohen Detailtreue<br />

gegenüber anderen Triangulationsalgorithmen durchgesetzt (vgl. [Kaiser, 1999], [Tiede,<br />

1999b]). Die voxelige Struktur wird durch den Algorithmus vollständig aufgelöst. Die dabei<br />

entstehende sehr glatte Oberflächenbeschreibung eignet sich sehr gut für eine anschließende<br />

Reduktion der Dreiecke. Darüber hin<strong>aus</strong> liefert der Algorithmus immer eine eindeutige<br />

Lösung und der Rechenaufwand ist verhältnismäßig gering.


16 KAPITEL 2. GRUNDLAGEN


Kapitel 3<br />

Problemstellung<br />

3.1 Das Forschungsprojekt <strong>SEE</strong>-<strong>KID</strong><br />

Das Erkennen der Ursachen und das Korrigieren pathologischer Fälle verlangt vom Experten,<br />

gerade in der Augenmedizin, ein hohes Maß an geometrischer Vorstellungsgabe und Fähigkeit<br />

zur Modellbildung. Hier bietet die computerunterstützte Modellbildung und Simulation der<br />

Vorbereitung von Augenoperationen exzellente Hilfe.<br />

Die Sehschule des Konventhospitals der Barmherzigen Brüder Linz hat sich darauf spezialisiert,<br />

angeborene und erworbene Fehlstellungen der Augen (Motilitätsstörungen, Schielen,<br />

Nystagmus) bei Kleinkindern z. B. durch Verkürzung oder Verlagerung eines oder mehrerer<br />

<strong>Augenmuskeln</strong> operativ zu beheben.<br />

Bereits im Vorfeld derartiger Operationen müssen detaillierte Planungen erfolgen bzw. geeignete<br />

Schritte <strong>aus</strong>gewählt werden. Der Ablauf der Operation kann bislang nur direkt am<br />

Patienten erlernt und perfektioniert werden. Bei besonders komplizierten Fehlstellungen ist<br />

selbst der erfahrene Experte auf dokumentierte Erfahrungswerte, sowie sein unmittelbares<br />

Geschick angewiesen. Operationen an den <strong>Augenmuskeln</strong> führen in manchen Fällen erst bei<br />

wiederholtem Eingriff zum Erfolg (vgl. [Brüder, 2001]). Um die Arbeit der Augenärzte zu<br />

unterstützen, wurde an den Fachhochschulstudiengängen Software Engineering und Software<br />

Engineering für Medizin in Hagenberg gemeinsam mit der Sehschule des Konventhospitals<br />

der Barmherzigen Brüder in Linz das Projekt <strong>SEE</strong>-<strong>KID</strong> (Software Engineering Environment<br />

for Knowledge-based Interactive Eye Motility Diagnostics) ins Leben gerufen.<br />

3.1.1 Projektziel<br />

Das Ergebnis des Projekts, das Softwaresystem <strong>SEE</strong>-<strong>KID</strong>, wird es erstmals ermöglichen,<br />

meist kongenitale Fehlstellungen bei Augen von Kleinkindern, aber auch von Erwachsenen<br />

am Computer nachzumodellieren, graphisch dreidimensional zu visualisieren, sowie die Auswirkungen<br />

von chriurgischen Eingriffen zu berechnen und interaktiv darzustellen. Auf diese<br />

Weise kann der Chirurg bereits am Computer den für den jeweiligen Patienten optimalen<br />

17


18 KAPITEL 3. PROBLEMSTELLUNG<br />

Eingriff bestimmen (also welche Muskeln er auf welche Weise verkürzen oder verlagern muss)<br />

und so mehrfache Operationen durch das Erfassen der Motilitätsstörungen bzw. das Verstehen<br />

der zu Grunde liegenden Mechanismen vermeiden.<br />

Dieses System wird speziell als Lehr- und Lernsystem zur Aus- und Weiterbildung von<br />

Fachärzten an der Sehschule des Konventhospitals der Barmherzigen Brüder eingesetzt werden<br />

und auch Krankenhäusern in Österreich sowie - über Partner - im deutschsprachigen und<br />

später auch englischsprachigen Raum angeboten.<br />

3.1.2 Projektgeschichte<br />

Die Idee, das menschliche Auge am Computer zu simulieren bzw. Augenoperationen nachzustellen<br />

wurde am Fachhochschulstudiengang Software Engineering in Hagenberg erstmals<br />

im Jahr 1995 aufgegriffen. Eine Studentengruppe erarbeitete im Rahmen des Studienprojektes<br />

” Computerunterstützte Vorbereitung von Augenoperationen” einen ersten Prototyp, der<br />

eine einfache Visualisierung des Auges beinhaltete und grundsätzliche Funktionen für den<br />

Chirurgen anbot.<br />

Aufbauend auf diese Ergebnisse wurde ab dem Jahr 1999 das Forschungsprojekt <strong>SEE</strong>-<strong>KID</strong><br />

in Angriff genommen. Gefördert durch Mittel <strong>aus</strong> dem Forschungsförderungsfonds für die<br />

gewerbliche Wirtschaft (FFF) wurde intensiv an der Einbettung diverser medizinischer und<br />

mathematischer Modelle in das vorhandene System gearbeitet. Die Umsetzung der Forschungsergebnisse,<br />

die Verbesserung der Visualisierung und der Einbau diverser Masken und<br />

Auswertungstabellen in das Programm geschah im Zuge des Studienprojektes <strong>SEE</strong>++. Das<br />

Ergebnis dieser Arbeiten, das Programm <strong>SEE</strong>++ (Simulation Expert for Eyes +Diagnoses<br />

+Transposition Surgery), bietet umfassende Möglichkeiten, die über die einfache Visualisierung<br />

des Auges hin<strong>aus</strong> gehen. Durch den versuchsweisen Einsatz bei den Projektpartnern<br />

werden neben der Überprüfung der Praxisrelevanz auch Verbesserungsvorschläge eingebracht.<br />

3.1.3 Bisherige Projektergebnisse<br />

Die Erkenntnisse des Projektes <strong>SEE</strong>-<strong>KID</strong> flossen direkt in das System <strong>SEE</strong>++ ein. Um den<br />

Überblick über die komplexen Bereiche des Projektes zu bewahren, erfolgte eine Aufteilung<br />

des Gesamtsystems in vier Modelle:<br />

• Grafisches Modell: In diesem Modell wird die Visualisierung des Auges geregelt. Es<br />

ermöglich darüber hin<strong>aus</strong> eine grafische Interaktion.<br />

• Geometrisches Modell: Hier werden besondere Eigenschaften des Auges in der Bewegung<br />

berücksichtigt.<br />

• Dynamisches Modell: Es wird beschrieben, wie sich ein Muskel auf Grund einer<br />

Innervation kontrahiert.<br />

• Biomechanisches Modell: Dieses Modell kann als Verbindung zwischen geometrischem<br />

und dynamischem Modell gesehen werden. Weiters wird beschrieben, wie sich<br />

die Dynamik des Muskels auf den Bulbus <strong>aus</strong>wirkt.


3.1. DAS FORSCHUNGSPROJEKT <strong>SEE</strong>-<strong>KID</strong> 19<br />

Das Programm <strong>SEE</strong>++ bietet die Möglichkeit, auf Grund vorliegender Daten einen pathologischen<br />

Fall nachzubilden. Für einen Patient oder ein Szenario werden die vorhandenen<br />

Daten eingegeben. Mit diesen Daten ist es möglich, mit Hilfe verschiedener Diagramme und<br />

Ansichten (sowohl 3-dimensional als auch 2-dimensional), virtuelle Änderungen am Auge des<br />

Patienten vorzunehmen. Die Auswirkungen dieser Änderungen können sofort überprüft und<br />

auch als Grundlage für weitere Arbeiten in einer Datei gespeichert werden. Damit deckt<br />

<strong>SEE</strong>++ die grundsätzlichen Funktionen des grafischen und des geometrischen Modells ab.<br />

Die Eingabeparmeter werden aufgrund von Messungen am Patienten bestimmt. An dieser<br />

Stelle wird nur ein Überblick über die wichtigsten Messmethoden gegeben. Eine genaue<br />

Beschreibung ist in [Reisinger, 2001] zu finden:<br />

• Sehschärfentest,<br />

• Prismen- und Hornhautreflextest,<br />

• Abdeck-Aufdeck-Test,<br />

• Maddox-Wing-Test,<br />

• Hess-Test,<br />

• Less-Schirm.<br />

In Abb. 3.1 ist ein Screenshot vom Programm <strong>SEE</strong>++ zu sehen. Die dreidimensionale Darstellung<br />

des Auges ermöglicht es dem Benutzer, das Auge von allen Seiten zu betrachten<br />

bzw. die Muskelpfade zu verfolgen. Darüber hin<strong>aus</strong> sind andere Darstellungsmöglichkeiten<br />

vorgesehen, wie etwa die ” quadratische Plattkarte”, die den dreidimensionalen Bulbus auf eine<br />

zweidimensionale Ebene projiziert. Interaktive Veränderungen an den Muskeln, wie z. B.<br />

die Versetzung eines Insertionspunktes, können direkt am Hess-Diagramm oder am Muskelwirkungsverteilungsdiagramm<br />

abgelesen werden. Das System untersützt auch mehrere<br />

medizinische Modelle zur Beschreibung der Augenmuskelwirkung (vgl. dazu [Lehner, 2001]).<br />

Um die Visualisierung zu verbessern, wurde nach einer Möglichkeit gesucht, die <strong>Augenmuskeln</strong><br />

so darzustellen, wie sie tatsächlich <strong>aus</strong>sehen. Ein erster Ansatzpunkt dazu ist die<br />

vorliegende Arbeit. Das Ergebnis wird in [Lacher, 2001] aufgegriffen und erweitert, sodass<br />

eine Simulation der Muskeln und ein Einbau in das vorhandene System möglich wird.<br />

3.1.4 Projektpartner<br />

Der primäre Projektpartner ist die Sehschule des Konventhospitals der Barmherzigen Brüder<br />

mit ihrem Leiter Prim. Prof. Dr. Siegfried Priglinger. Er ist nicht nur der Initiator des<br />

Projektes, sondern auch wichtigster Ansprechpartner in medizinischen Belangen.<br />

Um immer am neuesten Stand der Augenforschung zu sein, unterstützen zwei internationale<br />

Partner das Projekt mit ihren neuesten Forschungsergebnissen. Es sind dies Dr. Joel M.<br />

Miller vom Smith-Kettlewell Eye Research Institute in San Francisco/USA und Dr. Thomas<br />

Haslwanter vom Universitätsspital der ETH Zürich in der Schweiz.


20 KAPITEL 3. PROBLEMSTELLUNG<br />

Abbildung 3.1: Screenshot vom Programm <strong>SEE</strong>++


3.2. NOTWENDIGKEIT EINER MUSKELVISUALISIERUNG 21<br />

Einen wichtigen Teil der Projektarbeit stellte die Beschaffung von geeigneten <strong>MR</strong>-Bildern<br />

des menschlichen Auges dar. Auch dazu konnten Spezialisten gefunden werden, die ihre<br />

Erfahrungen auf diesem Gebiet einbrachten. Erste Versuchsreihen wurden mit Univ.-Doz.<br />

Dipl.-Ing. Mag. DDr. Josef Kramer vom CT & <strong>MR</strong>T Institut am Schillerplatz in Linz durchgeführt.<br />

Am Allgemeinen Krankenh<strong>aus</strong> in St. Pölten wurden unter der Leitung von Prim.<br />

Univ.-Doz. DDr. Armin Ettl weitere Bildserien erstellt, die ebenfalls Grundlage diverser Arbeiten<br />

darstellten.<br />

Allen Projektpartnern sei an dieser Stelle ein herzlicher Dank für die geleistete Arbeit und<br />

die hervorragende Unterstützung <strong>aus</strong>gesprochen.<br />

3.2 Notwendigkeit einer Muskelvisualisierung<br />

Das Programm <strong>SEE</strong>++ bietet bereits eine gute Visualisierung des menschlichen Auges. Allerdings<br />

gibt es einen Schönheitsfehler: Die Muskeln werden nur als Linien dargestellt (vgl.<br />

Abb. 3.1). Daher wird eine Möglichkeit gesucht, die <strong>Augenmuskeln</strong> so darzustellen, wie sie<br />

tatsächlich <strong>aus</strong>sehen.<br />

Eine Möglichkeit zur Visualisierung von <strong>Augenmuskeln</strong> wird in [Miller, 1999] dargestellt.<br />

Dabei wird ein Drahtgittermodell angezeigt, welches die Muskeln repräsentieren soll (vgl.<br />

Abb. 3.2 und [Miller, 2001]). Der Schwachpunkt dieser Visualisierung ist, dass die Veränderung<br />

des Aussehens bei der Kontraktion eines Muskels willkürlich erfolgt. Damit ist gemeint,<br />

dass ein Muskel zwar die Form ändert, diese Veränderung aber nicht anatomisch nachvollziehbar<br />

ist.<br />

Abbildung 3.2: Augenvisualisierung nach Miller<br />

Zur Darstellung der <strong>Augenmuskeln</strong> wurde ein Weg gesucht, die betreffenden Muskeln <strong>aus</strong><br />

geeigneten <strong>MR</strong>-Bildern zu segmentieren und zu visualisieren. Die grundsätzliche Idee war


22 KAPITEL 3. PROBLEMSTELLUNG<br />

es, zunächst einen Muskel in einer Primärposition darzustellen (d.h. der Muskel ist nicht<br />

angespannt) und als zweiten Schritt eine Visualisierung des Muskels in einer Sekundär- oder<br />

Tertiärposition vorzunehmen (d.h. der untersuchte Muskel ist kontrahiert). Dadurch kann<br />

das Aussehen eines entspannten und eines kontrahierten Muskels veranschaulicht werden.<br />

Die Suche nach Programmen, die eine Bearbeitung von <strong>MR</strong>-Daten ermöglichen, ergab durch<strong>aus</strong><br />

interessante Ergebnisse. So ermöglicht beispielsweise die auf MATLAB basierende <strong>MR</strong>I<br />

Toolbox (vgl. [Tiede, 1999a]) die Generierung eines Datenvolumens <strong>aus</strong> <strong>MR</strong>-Schnittbildfolgen<br />

durch das Hintereinanderlegen von einzelnen <strong>MR</strong>-Bildern. Eine genaue Segmentierung bestimmter<br />

Bereiche bzw. eine dreidimensionale Darstellung ist allerdings nicht möglich. Eine<br />

gute dreidimensionale Visualisierung von menschlichen Organen bietet das Projekt ” Virtual<br />

Human Body” bzw. dessen Ergebnis, der ” VOXEL-MAN <strong>3D</strong>-NAVIGATOR”, von der Abteilung<br />

für Informatik und Datenverarbeitung in der Medizin der Universitätsklinik Hamburg-<br />

Eppendorf (vgl. [Höhne, 2001]). Wenngleich hier viele schöne <strong>3D</strong>-Modelle von diversen<br />

Körperteilen zu sehen sind, ist es nicht möglich, eigene Eingabedaten zu verwenden.<br />

Diese Erkenntnisse machten eine eigene Implementierung einer Muskelvisualisierung notwendig.<br />

Benötigt wird ein Programm, in dem <strong>aus</strong> beliebigen <strong>MR</strong>-Bildern ein bestimmtes Objekt,<br />

in diesem speziellen Fall ein Augenmuskel, segmentiert und anschließend visualisiert wird.<br />

Ein weiterer wichtiger Punkt war die Abspeicherung der Ergebnisse in einem standardisierten<br />

Format, um eine weitere Verarbeitung bzw. einen einfachen Datentransfer in andere Systeme<br />

zu ermöglichen. Neben der Abdeckung dieser Funktionalitäten wird durch diese Arbeit ein<br />

erster Schritt im Bereich der medizinischen Bildverarbeitung an den FH-Studiengängen Software<br />

Engineering und Software Engineering für Medizin in Hagenberg gesetzt, der Grundlage<br />

für spätere Arbeiten sein wird.<br />

3.3 Segmentierung und Visualisierung von <strong>Augenmuskeln</strong><br />

Wie bereits mehrfach erwähnt ist es Ziel dieser Arbeit, eine Methode anzugeben, die <strong>aus</strong> zweidimensionalen<br />

<strong>MR</strong>-Bildfolgen die <strong>Augenmuskeln</strong> segmentiert und die Oberfläche der Muskeln<br />

als dreidimensionale Objekte am Bildschirm darstellt.<br />

Die <strong>MR</strong>-Bilder sind zunächst so aufzubereiten, dass die Farbeinträge in der Farbpalette aufsteigend<br />

sortiert sind. Dadurch wird eine leichtere Vergleichbarkeit der Farbwerte ermöglicht.<br />

Durch ein Hintereinanderlegen der einzelnen Schnittbilder entsteht ein Datenvolumen, das<br />

alle notwendigen Bildinformationen enthält.<br />

Die <strong>Augenmuskeln</strong> setzen sich durch einen charakteristischen Grauwertbereich gegenüber<br />

der Nachbarschaft ab. Vereinfacht gesagt: Die Bildpunkte des gesuchten Augenmuskels sind<br />

deutlich dunkler als die Bildpunkte in der Umgebung des Augenmuskels. Dieser Umstand<br />

wird benutzt, um den Muskel zu isolieren. Durch das Setzen eines Schwellwertes werden die<br />

helleren Bildpunkte in der Umgebung des Muskels entfernt. Diese Schwellwertanalyse wird<br />

hier dahingehend erweitert, dass zwei Schwellwerte (ein oberer und ein unterer Schwellwert)<br />

definiert werden. Liegt ein Farbpunkt außerhalb dieses Schwellwertbereiches, wird er entfernt<br />

(vgl. Kap. 4.3.2).


3.3. SEGMENTIERUNG UND VISUALISIERUNG VON AUGENMUSKELN 23<br />

Auf einem <strong>MR</strong>-Bild nehmen diejenigen Bildpunkte, die den tatsächlich gesuchten Muskel<br />

repräsentieren, nur einen relativ kleinen Teil der Pixelmenge ein. Damit nicht jedes Mal das<br />

gesamte Datenvolumen analysiert werden muss, wird dem Benutzer die Möglichkeit gegeben,<br />

die gewünschten Bereiche mit Polygonen einzugrenzen. Mithilfe des Scan-Line-Verfahrens für<br />

Polygone (siehe Kap. 2.2.1) wird ein neues Datenvolumen, welches nur mehr die gewünschten<br />

Flächen beinhaltet, erstellt.<br />

Erst mit diesem Datenvolumen wird die eigentliche Generierung der Objektoberfläche in<br />

Angriff genommen. Der Marching-Cube-Algorithmus (siehe Kap. 2.2.2) durchläuft das Datenvolumen<br />

und berechnet die Oberfläche des Augenmuskels. Dabei wird ein Dreiecksmodell<br />

erstellt, das die gesuchte Oberfläche repräsentiert. Die genauen Positionen der einzelnen<br />

Eckpunkte der Dreiecke wird mittels linearer Interpolation der Farbwerte des Datenvolumens<br />

berechnet.<br />

Die Ergebnisse des Marching-Cube-Algorithmus sollten nicht nur am Bildschirm angezeigt,<br />

sondern auch für eine weitere Verarbeitung abgespeichert werden. Bereits während des<br />

Durchlaufens werden die Koordinaten der Dreicke in das standardisierte Grafikformat DXF<br />

(Drawing Interchange File Format) gespeichert und für jedes <strong>3D</strong>-fähige Grafikprogramm<br />

lesbar gemacht.<br />

Die vorliegende Arbeit beschreibt in den folgenden Kapiteln ein System, das zur Umsetzung<br />

dieser Anforderungen implementiert wurde.


24 KAPITEL 3. PROBLEMSTELLUNG


Kapitel 4<br />

Systemmodell und Ablauf<br />

4.1 Beschaffung von Bildern<br />

Als Ausgangspunkt für die Arbeiten wurden Magnetresonanzbilder gewählt, weil diese einen<br />

relativ hohen Weichteilkontrast aufweisen. Dadurch heben sich die Muskeln deutlich vom<br />

umliegenden Gewebe ab. Die deutlichen Kontraste sind wichtig für einen guten Erfolg der<br />

Analysealgorithmen.<br />

Die Beschaffung geeigneter Bildfolgen gestaltete sich anfangs schwierig. Erste Versuchsreihen<br />

erbrachten nicht die gewünschten Ergebnisse, da erst die richtigen Einstellungen für den<br />

<strong>MR</strong>-Tomographen gefunden werden mussten. Jener Bereich des Auges, der für die Untersuchungen<br />

interessant ist, ist relativ klein. Dementsprechend schwierig war das Finden der<br />

richtigen Auflösung bzw. der optimalen Schrittweite der Bildfolgen. Ein weiters Problem<br />

stellte der Proband selbst dar. Nach einer gewissen Zeitspanne, bei den Versuchen etwa nach<br />

45 Minuten, war es nicht mehr möglich, die Augen in der selben Position zu behalten. Trotz<br />

der Anwendung diverser Mittel führte das Auge unwillkürliche Bewegungen durch, die nicht<br />

zu unterbinden waren. Die Versuche mussten abgebrochen und auf eine späteren Zeitpunkt<br />

verschoben werden.<br />

Mit den ersten brauchbaren Bildern konnten Tests durchgeführt werden, bei denen die Bilder<br />

mit coronaler Schichtführung die besten Ergebnisse brachten. Der Grund ist darin zu finden,<br />

dass es bei coronalen Bildern mehr Schnitte gibt, auf denen ein Muskel zu sehen ist. Je mehr<br />

Eingabeinformationen vorhanden sind, desto besser wird auch das Ergebnis.<br />

Nr. Ort Proband Blickposition Vorh./Verw.<br />

1 CT & <strong>MR</strong>T Inst. am Schillerplatz Franz Pirklbauer primär 18/14<br />

2 AKH St. Pölten Dr. Hildebrandt primär 12/7<br />

3 AKH St. Pölten Dr. Hildebrandt sekundär 12/7<br />

Tabelle 4.1: Übersicht über die verwendeten <strong>MR</strong>-Bildfolgen<br />

25


26 KAPITEL 4. SYSTEMMODELL UND ABLAUF<br />

In Tab. 4.1 sind diejenigen Bildserien aufgelistet, mit denen hier gearbeitet wurde. Alle Bilder<br />

dieser Serien haben eine Auflösung von 512x512 Pixel und besitzen 256 Gr<strong>aus</strong>tufen. Nicht<br />

auf allen Bildern der Serien ist auch tatsächlich ein Augenmuskel zu erkennen. Darum wurde<br />

bei den Zahlenangaben zunächst die Anzahl aller vorhandenen Bilder in der Serie angegeben<br />

und daneben die Anzahl der tatsächlich verwendeten.<br />

Die einzelnen Bilder müssen im Bitmap-Format (*.bmp) vorliegen und die Namen der Dateien<br />

müssen aufsteigend sortiert sein (z. B. liegt die Datei xxx09.bmp in der Reihenfolge vor<br />

xxx10.bmp).<br />

4.2 Bildaufbereitung<br />

4.2.1 Sortieren der Farbpalette<br />

Die Farbpalette einer Bitmapdatei dient zur Verwaltung der Farbwerte, wobei die einzelnen<br />

Pixel im Bild nur mehr durch Indexwerte auf die entsprechenden Paletteneinträge verweisen.<br />

Die Paletteneinträge liegen im sogenannten RGB-Farbschema (Rot-Grün-Blau Farbwerte)<br />

vor. Da es sich bei <strong>MR</strong>-Bildern um Grauwertbilder handelt, sind die jeweiligen RGB-Einträge<br />

immer gleich. Bei einer Farbe, dessen Grauwert 50 ist, sind demnach die Farbwerte Rot =<br />

Grün = Blau = 50.<br />

Von den 256 möglichen Farbwerten werden in <strong>MR</strong>-Bildern nicht alle benutzt. Als erster<br />

Schritt ist also eine Untersuchung des Bildes auf die verwendeten Farben notwendig. Die nicht<br />

benutzten Farben werden für den Sortiervorgang markiert und an das Ende der Farbpalette<br />

verschoben. Diese nicht benutzten Werte werden nach dem Sortiervorgang der Einfachheit<br />

halber auf den Farbwert von Schwarz (Rot = Grün = Blau = 0) gesetzt. Die Sortierung<br />

selbst erfolgt nur über die verwendeten Farbwerte.<br />

Die veränderte Farbpalette wird wieder in die Bitmapdatei zurückgeschrieben. Das Aussehen<br />

des Bildes wird durch diese Aktion nicht beeinflusst. Die in späterer Folge durchzuführenden<br />

Vergleichsoperationen werden aber wesentlich vereinfacht. Wie bereits erwähnt besteht die<br />

Farbinformation in den Bildpunkten nur <strong>aus</strong> einem Indexverweis auf einen Farbpaletteneintrag.<br />

Durch die Sortierung der Farbpalette entspricht ein kleinerer Indexwert auch tatsächlich<br />

einem kleineren Farbwert.<br />

Ein einfaches Beispiel zur Sortierung der Farbpalette ist in Abb. 4.1 dargestellt. Die acht<br />

Farbwerte sind beliebig in der Palette verteilt. Der Farbwert mit dem Index 2 wird im Bild<br />

nicht verwendet, weil es kein Grauwert ist (die RGB-Werte sind verschieden). Nach der<br />

Sortierung stehen die Farbwerte in aufsteigender Reihenfolge, wobei die nicht verwendete<br />

Farbe auf Schwarz gesetzt wurde und am Ende der Palette steht. Der Index 1 verweist nun<br />

auf eine Farbe, die tatsächlich heller ist als die Farbe, auf die der Index 0 verweist.


4.2. BILDAUFBEREITUNG 27<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

Farbpalette vor der<br />

Sortierung<br />

2/2/2<br />

1/1/1<br />

132/231/132<br />

0/0/0<br />

3/3/3<br />

10/10/10<br />

8/8/8<br />

255/255/255<br />

4 5 3 7 7<br />

0 1<br />

3<br />

6<br />

6<br />

5<br />

5<br />

3<br />

4<br />

3<br />

Indexverweise<br />

der Pixel<br />

Farbpalette nach der<br />

Sortierung<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

0/0/0<br />

1/1/1<br />

2/2/2<br />

3/3/3<br />

8/8/8<br />

10/10/10<br />

255/255/255<br />

0/0/0<br />

3 5 0 6 6<br />

2 1<br />

0<br />

4<br />

4<br />

5<br />

5<br />

0<br />

3<br />

0<br />

Indexverweise<br />

der Pixel<br />

Abbildung 4.1: Vereinfachtes Beispiel zum Sortieren der Farbpalette<br />

4.2.2 Definition von Polygonbereichen<br />

In den vorhandenen <strong>MR</strong>-Bildern sind die Flächen, die den Augenmuskel darstellen, verglichen<br />

mit der gesamten Bildinformation relativ klein. Ein Algorithmus, der das gesamte<br />

Datenvolumen analysiert, wäre extrem ineffizient, weil<br />

• der Zeitaufwand zum Durchlaufen aller Bildpunkte zu groß ist bzw. überdimensionale<br />

Anforderungen an die Hardware gestellt werden,<br />

• neben den <strong>Augenmuskeln</strong> auch noch andere Körperteile dargestellt werden, die nicht<br />

relevant sind,<br />

• große Datenmengen erzeugt werden, die wiederum eine effiziente Weiterverarbeitung<br />

unmöglich machen.<br />

Um diesem Problemen <strong>aus</strong>zuweichen, wird eine Abgrenzung der zu untersuchenden Flächen<br />

vorgenommen. Diese Abgrenzung erfolgt interaktiv durch den Anwender, in dem auf jedem<br />

verwendeten <strong>MR</strong>-Bild ein Polygonbereich definiert wird. Bei der Analyse werden nur mehr<br />

diejenigen Bildpunkte betrachtet, die innerhalb des Polygons liegen. Dem Anwender wird<br />

damit ein Werkzeug gegeben, das ihm ermöglicht<br />

• selbst Schnitte durch Organe vorzunehmen,<br />

• bestimmte Organe vom umliegenden Gewebe zu trennen.<br />

Letzteres kann z. B. dann vorkommen, wenn ein Augenmuskel die Orbitawand fast berührt.<br />

Die Farbwerte von Muskel und Orbitawand sind im <strong>MR</strong>-Bild annähernd gleich. Das geschulte<br />

Auge eines Anwenders kann jedoch die Grenzen des Muskels erkennen und mit dem Polygon<br />

nachzeichnen. Optimale Ergebnisse werden dann erzielt, wenn neben den Polygonen auch<br />

die Schwellwerte laufend verändert werden. Oftmals sind mehrere Versuche notwendig, bis<br />

ein gesuchter Muskel tatsächlich isoliert werden kann.


28 KAPITEL 4. SYSTEMMODELL UND ABLAUF<br />

Polygone sind durch die Koordinaten ihrer Eckpunkte genau definiert. Das verwendete Koordinatensystem<br />

ist mit dem Bildraster der Pixel ident. Abb. 4.2a zeigt ein Polygon, das in<br />

ein Pixelraster eingebettet ist. Die Koordinaten der einzelnen Eckpunkte definieren genau<br />

die Lage und das Aussehen des Polygons.<br />

Abbildung 4.2: Polygonbeispiele<br />

Für die Verarbeitung ist es wichtig, dass Polygone definiert werden, die <strong>aus</strong> genau einer<br />

Fläche bestehen. Andernfalls würden zwei Bereiche auf dem Bild definiert, und der Analysealgorithmus<br />

würde einen Fehler liefern. Ein Polygon mit einer Fläche ist genau dann<br />

gegeben, wenn es bei den Polygonkanten zu keinen Überschneidungen kommt. Beim Polygon<br />

in Abb. 4.2b ist eine Überschneidung zu erkennen. Dadurch wird die Fläche in zwei Teile<br />

zerteilt, die sich zwar berühren, aber dennoch kein sinnvolles Ergebnis liefern.<br />

Eine Anforderung an das System ist die Abspeicherung der Polygone, damit einmal getätigte<br />

Eingaben auch für spätere Analysevorgänge zur Verfügung stehen. Die Koordinaten der Polygoneckpunkte<br />

definieren das Vieleck vollständig, daher ist es <strong>aus</strong>reichend, nur diese Punkte<br />

zu speichern. Aus der Reihenfolge der einzelnen Koordinatenwerte lassen sich die Seiten des<br />

Polygons rekonstruieren. Dabei ist es unerheblich, welche Koordinaten als erstes abgespeichert<br />

werden, da der letzte Punkt der Liste wieder mit dem ersten verbunden wird, um so<br />

das Polygon zu schließen.<br />

4.2.3 Definition von Schwellwerten<br />

Neben der Definition von Polygonen ist eine Möglichkeit vorgesehen, die bestimmte Bildpunkte<br />

<strong>aus</strong> einem <strong>MR</strong>-Bild her<strong>aus</strong>filtern kann. Dazu wird ein Schwellwertbereich definiert,<br />

der nur mehr die gewünschten Farbwerte zulässt.


4.3. GENERIEREN EINES POLYEDERMODELLS 29<br />

Zur Durchführung eines Schwellwertverfahrens muss vom Anwender ein Schwellwert t (engl.:<br />

threshold) definiert werden. Diese Eingabe erfolgt direkt interaktiv am Bild, d.h. jede<br />

Veränderung des Schwellwertes ist direkt am Bild zu beobachten. Eine zusätzliche Verbesserung<br />

bietet die Möglichkeit, einen Schwellwertbereich festzulegen. Damit ist gemeint,<br />

dass zwei Werte (tunten und toben) definiert werden, die eine Abgrenzung nach beiden Seiten<br />

ermöglichen.<br />

Das Beispiel in Abb. 4.3 soll dies veranschaulichen. Das Grauwertspektrum besteht <strong>aus</strong><br />

256 möglichen Grauwerten, die zwischen den Farben Schwarz und Weiß liegen (vgl. dazu<br />

den unteren Balken in Abb. 4.3). Der untere Schwellwert 8 und der obere Schwellwert 134<br />

stellen die Grenzen des Schwellwertbereiches dar. Diejenigen Grauwerte, die außerhalb dieses<br />

Bereiches liegen, werden einfach durch die Farbe Weiß ersetzt und damit nicht mehr angezeigt.<br />

In einer Schwellwertanalyse (Kap. 4.3.2) werden diese Eingabedaten weiter verarbeitet.<br />

Abbildung 4.3: Definition eines Schwellwertbereiches<br />

Genau wie die Polygone werden auch die Schwellwerte für eine spätere Verwendung abgespeichert.<br />

Dazu reicht es, die beiden Werte tunten und toben in einer Datei zu archivieren.<br />

Abschließend ist noch zu erwähnen, dass sämtliche Bildmanipulationen in allen verwendeten<br />

<strong>MR</strong>-Bildern einer Serie zu machen sind. Die Schwellwerte und Polygone müssen nicht gleich<br />

sein, jedoch empfielt es sich, keine zu großen Unterschiede in den Werten zu haben, da<br />

damit die Ergebnisse der Oberflächengenerierung verbessert werden. Im Protoyp, den diese<br />

Arbeit beschreibt, sind keine Automatisierungen vorgesehen. Der Benutzer soll selbst durch<br />

mehrmaliges Probieren die optimalen Einstellungen her<strong>aus</strong>finden und damit ein Gefühl für<br />

die richtigen Werte bekommen.<br />

4.3 Generieren eines Polyedermodells<br />

Nach dem ersten Schritt, der Vorbereitung der <strong>MR</strong>-Bilder, ist der zweite Schritt das Generieren<br />

eines Polyedemodells. Dabei wird mit Hilfe des Scan-Line Verfahrens (vgl. Kap. 2.2.1)<br />

für Polygone ein Datenvolumen erstellt, das dann mit dem Marching-Cube-Algorithmus (vgl.<br />

Kap. 2.2.2) analysiert wird. Wenngleich diese beiden Verfahren <strong>aus</strong> der Literatur bekannt<br />

sind, wird hier auf einige Besonderheiten für die spezielle Aufgabe der Generierung von Muskeloberflächen<br />

eingegangen.


30 KAPITEL 4. SYSTEMMODELL UND ABLAUF<br />

4.3.1 Erstellen des Datenvolumens<br />

Für diesen Arbeitsschritt wird als gegeben betrachtet, dass eine Serie von <strong>MR</strong>-Bildern vorliegt,<br />

wobei jedes Bild über einen definierten Schwellwertbereich sowie über ein Polygon<br />

verfügt. Anhand der Polygondaten wird ein Datenvolumen erstellt, das die Basis für die<br />

weitere Verarbeitung darstellt.<br />

Das geforderte Datenvolumen hat folgenden Anforderungen zu entsprechen:<br />

• Das Datenvolumen ist vergleichbar mit einem Quader <strong>aus</strong> Voxeln, der alle Polygonpunkte<br />

in den Bildern einschließt.<br />

• Für jede Schnittebene sind nur mehr diejenigen Bildpunkte aktiv, die innerhalb eines<br />

Polygons liegen.<br />

• Diejenigen Bildpunkte, die außerhalb der Polygone liegen, erhalten einen Farbwert, der<br />

sicher außerhalb der Schwellwertbereiche liegt. Damit sind zwar Bildpunkte vorhanden,<br />

sie sind aber für den Analysevorgang unerheblich.<br />

• Die Farbwerte der einzelnen Voxel innerhalb der Polygone werden unverändert in das<br />

Datenvolumen übernommen.<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

x x x x x x x x x x x x x x x x<br />

Abbildung 4.4: Segmentierung der Bilddaten<br />

x<br />

x x x x<br />

x x x x x<br />

x x x x x<br />

x x x x x x<br />

x x x x x x x x<br />

x x x x x x<br />

x x x x x x<br />

x x x x x x<br />

x x x x x x<br />

Um den Vorgang der Erstellung des Datenvolumens verständlich zu machen, wird zunächst<br />

nur ein Schichtbild betrachtet. Abb. 4.4 zeigt ein Feld mit 16x16 Bildpunkten. Darauf wurde<br />

ein 7-eckiges Polygon gezeichnet, welches die gewünschten Bildpunkte einschließt. Das<br />

Rechteck, das rund um das Polygon entsteht, orientiert sich an den maximalen bzw. minimalen<br />

x- und y-Werten des Polygons. Durch dieses Rechteck ist die Größe des zu erstellenden<br />

Rasters bereits vorgegeben und kann gleich initialisiert werden. Durch diese Initialisierung<br />

werden alle Bildpunkte mit einem Farbwert belegt, der sicher außerhalb des Schwellwertbereiches<br />

liegt (z. B. -1). Mithilfe des Scan-Line Verfahrens (Kap. 2.2.1) werden jetzt diejenigen<br />

x<br />

x<br />

x<br />

x


4.3. GENERIEREN EINES POLYEDERMODELLS 31<br />

Bildpunkte in das neue Datenvolumen geschrieben, die innerhalb des Polygons liegen. Das<br />

Ergebnis in Abb. 4.4 zeigt einen Raster <strong>aus</strong> Bildpunkten, der so groß ist wie das Rechteck, das<br />

das Polygon einschließt und in dem nur mehr die Bildpunkte innerhalb der Polygongrenzen<br />

markiert sind.<br />

Beim Generieren eines Datenvolumens <strong>aus</strong> mehreren Schichtbildern verändert sich lediglich<br />

das Finden eines geeigneten Rechtecks. Dazu werden am Beginn der Verarbeitung alle Polygone<br />

analysiert und die minimalen bzw. maximalen x- und y-Werte über alle Polygone zur<br />

Definition der Rechtecksdimension herangezogen. Danach werden alle Schichtbilder durchlaufen<br />

und mit dem Scan-Line Verfahren analysiert. Das Ergebnis ist ein Datenvolumen, das<br />

so breit bzw. lang ist wie das größte Rechteck <strong>aus</strong> den Polygoneckpunkten. Die Höhe des<br />

Datenvolumens entspricht der Anzahl der verwendeten Schichten.<br />

Durch diese Vorgangsweise werden natürlich viele leere Bildpunkte produziert, da die Polygone<br />

auf den einzelnen Schichtbildern versetzt sein können. Dennoch wird dadurch eine<br />

leichtere Weiterverarbeitung gewährleistet:<br />

• Es entsteht ein Datenvolumen, das in jeder Schicht die gleichen Dimensionen aufweist.<br />

Das Volumen kann also mit einfachen Schleifen durchlaufen werden.<br />

• Das gesamte Datenvolumen wird deutlich verringert. Die Anzahl der Bildpunkte ist<br />

nur mehr ein Bruchteil im Vergleich zu der Menge in den Ausgangsbildern.<br />

• Die Bildpunkte außerhalb der Polygone fallen automatisch weg. Diese müssen nicht<br />

mehr näher berücksichtigt werden.<br />

Das so erstellte Datenvolumen wird nun Punkt für Punkt durchlaufen. In jedem Schritt<br />

wird dabei ein Würfel definiert, dessen Eckpunkte einzelnen Voxeln entsprechen (vgl. dazu<br />

Abb. 2.7 auf Seite 13). Es werden jeweils vier benachbarte Punkte <strong>aus</strong> zwei übereinander<br />

liegenden Schichten hergenommen. Den so definierten Würfeln werden in einer Schwellwertanalyse<br />

bestimmte Konfigurationen zugewiesen, die als Eingabewerte für den Marching-<br />

Cube-Algorithmus dienen.<br />

4.3.2 Schwellwertanalyse<br />

Bei der schwellwertbasierten Segmentierung medizinischer Bildobjekte werden die zu einem<br />

Bildobjekt gehörenden Pixel anhand zweier Schwellwerte (engl.: thresholds) tunten und toben<br />

in dem Bild bzw. der <strong>3D</strong>-Bildfolge separiert und in einem Binärbild bzw. einer Binärbildfolge<br />

markiert. [Handels, 2000]<br />

Vereinfacht gesagt bedeutet dies, dass jedem Bildpunkt eine Wahr-Falsch-Entität zugewiesen<br />

wird. Die mathematische Berechnung erfolgt nach der Formel 2.2 (Seite 13). Ein Bildpunkt,<br />

dessen Farbwert innerhalb des Schwellwertbereiches liegt, erhält somit den Wert Wahr. Damit<br />

wird festgehalten, dass sich dieser Bildpunkt innerhalb des gesuchten Objektes befindet.<br />

Da diejenigen Bildpunkte, bei denen die Schwellwertanalyse Falsch ergibt, außerhalb des Objektes<br />

liegen, ist die Oberfläche des darzustellenden Objektes beim Übergang zwischen den<br />

Bildpunkten mit wahren und falschen Entitäten zu suchen.


32 KAPITEL 4. SYSTEMMODELL UND ABLAUF<br />

Diese Erkenntnis verwendet letztendlich auch der Marching-Cube-Algorithmus. So ist es<br />

jetzt notwendig, den Eckpunkten der vorher definierten Würfeln genau diese Entitäten zuzuordnen.<br />

Jeder Eckpunkt entspricht einem Voxel und kann somit einer Schwellwertanalyse<br />

unterzogen werden. Das Ergebnis ist eine sogenannte Würfelkonfiguration, bei der allen<br />

acht Ecken entweder ein Wert Wahr oder Falsch zugeordnet wird. Dabei können 2 8 = 256<br />

mögliche Würfelkonfigurationen entstehen, die relativ einfach auf einige wenige Grundkonfigurationen<br />

zurückgeführt werden können.<br />

4.3.3 Zurückführen auf Grundkonfigurationen<br />

Der Marching-Cube-Algorithmus gibt an, wie eine Dreiecksanordnung in einem Würfel <strong>aus</strong>zusehen<br />

hat, damit die gesuchte Objektoberfläche dargestellt wird. Dabei ist es nicht zielführend,<br />

alle 256 Möglichkeiten zu betrachten. [Lorensen und Cline, 1987] geben einen Weg<br />

an, diese 256 Würfelkonfigurationen auf 15 Grundkonfigurationen zurückzuführen. Dies geschieht<br />

im Wesentlichen durch<br />

• Invertieren der Würfelkonfigurationen, wenn mehr als die Hälfte der Punkte den Wert<br />

Wahr besitzen,<br />

• Spiegelungen um die drei Hauptachsen,<br />

• Rotationen um die drei Hauptachsen.<br />

Der einfachste Schritt ist die Umkehrung der Würfelkonfigurationen. Dieser ist nur dann<br />

notwendig, wenn mehr als die Hälfte der Eckpunkte einen Wert Wahr besitzen. Ist dies der<br />

Fall, werden einfach alle Wahr- und Falschwerte vert<strong>aus</strong>cht. In Abb. 4.5 besitzen die schwarz<br />

markierten Ecken einen Wert Wahr. Bei der Invertierung werden diese sechs Ecken in einen<br />

Wert Falsch umgewandelt, sodass nur mehr zwei Eckpunkte den Wert Wahr enthalten. Durch<br />

diese Vorgehensweise lassen sich die 256 Würfelkonfigurationen bereits auf 128 reduzieren.<br />

Abbildung 4.5: Invertierung der Würfelkonfiguration<br />

Etwas schwieriger sind die Spiegelungen bzw. Rotationen um die drei Hauptachsen. Versuche<br />

haben gezeigt, dass alle Fälle auf eine der 15 Grundkonfigurationen zurückgeführt<br />

werden können, wenn eine Kombination von Rotationen um alle drei Koordinatenachsen


4.3. GENERIEREN EINES POLYEDERMODELLS 33<br />

durchgeführt wird. Unter den Grund- bzw. Standardkonfigurationen sind die in Abb. 2.8 abgebildeten<br />

Würfeldefinitionen gemeint. Die Winkel, um die die Würfel dabei gedreht werden<br />

können sind<br />

• -90 ◦ ,<br />

• 0 ◦ ,<br />

• +90 ◦ und<br />

• +180 ◦ .<br />

Alle Kombinationen dieser vier Winkel um die drei Koordinatenachsen ergeben maximal 64<br />

Möglichkeiten, wie ein Würfel rotiert werden kann. Dadurch werden mit Sicherheit alle denkbaren<br />

Konfigurationen auf eine der 15 Grundkonfigurationen zurückgeführt. Eine zusätzliche<br />

Betrachtung der Spiegelungen ist nicht mehr notwendig.<br />

Der große Vorteil dieser Vorgehensweise zeigt sich erst später, wenn die Dreiecke, die in die<br />

Würfel gezeichnet werden, wieder zurückrotiert werden. Dieser Schritt ist notwendig, um die<br />

Ausgangsposition der Würfel wieder herzustellen. Die Dreiecke werden dadurch in diejenige<br />

Position gebracht, die sie laut der ursprünglichen Würfelkonfiguration einnehmen müssen.<br />

Diese Rückrotation kann wesentlich vereinfacht werden, wenn nur mit Rotationsachsen gerechnet<br />

wird (vgl. Kap. 5.3.2).<br />

Im Normalfall werden nicht alle 64 Möglichkeiten der Würfelrotationen benötigt. Der Algorithmus<br />

bricht ab, sobald der rotierte Würfel mit einer Standardkonfiguration übereinstimmt.<br />

Das Beispiel in Abb. 4.6 soll den Vorgang der Findung einer Grundkonfiguration nochmals<br />

verdeutlichen. Ausgegangen wird von einer Würfelkonfiguration, bei der fünf Eckpunkte<br />

den Wert Wahr haben. Im ersten Schritt wird eine Invertierung der Eckenklassifizierung<br />

vorgenommen. Dadurch entsteht ein Würfel mit drei Wahrwerten. Dieser Würfel wird<br />

jetzt um 180 ◦ um die z-Achse und um 90 ◦ um die x-Achse rotiert. Die jetzt entstandene<br />

Würfelkonfiguration ist mit der Standardkonfiguration 5 (Abb. 2.8) ident.<br />

Die Häufigkeit des Auftretens der Standardkonfigurationen in der Menge aller 256 verschiednen<br />

Möglichkeiten ist höchst unterschiedlich (vgl. Tab. 4.2). Die Grundkonfiguration mit<br />

dem Index 0 kommt beispielsweise nur zwei mal vor, nämlich genau dann, wenn entweder<br />

alle Eckpunkte einen Wert Wahr oder Falsch besitzen. Im Datenvolumen selbst wird dieser<br />

Fall allerdings am häufigsten vorkommen, weil die meisten Voxel außerhalb des gesuchten<br />

Objektes liegen, und somit den Wert Falsch aufweisen.


34 KAPITEL 4. SYSTEMMODELL UND ABLAUF<br />

z<br />

y<br />

180˚ um die<br />

z-Achse<br />

x<br />

Invertierung<br />

der Ecken<br />

90˚ um die<br />

x-Achse<br />

Das Ergebnis entspricht der<br />

Standardkonfiguration 5<br />

Abbildung 4.6: Zurückführung auf eine Standardkonfiguration<br />

Index der Standardkonfiguration Häufigkeit<br />

0 2<br />

1 16<br />

2 24<br />

3 24<br />

4 8<br />

5 48<br />

6 48<br />

7 16<br />

8 6<br />

9 8<br />

10 6<br />

11 12<br />

12 24<br />

13 2<br />

14 12<br />

Summe: 256<br />

Tabelle 4.2: Vorkommen der Grundkonfigurationen


4.3. GENERIEREN EINES POLYEDERMODELLS 35<br />

4.3.4 Definition der Polyeder<br />

Nach all diesen Vorarbeiten können nun die Dreiecke der gesuchten Objektoberfläche generiert<br />

werden, und zwar genau so, wie es der Marching-Cube-Algorithmus vorgibt. Dazu<br />

ist zunächst eine Indizierung der Würfeleckpunkte und der Würfelkanten notwendig. Die<br />

Eckpunkte des Würfels werden mit den Ziffern von 0 bis 7 indiziert. Die zwölf Kanten zwischen<br />

den Eckpunkten werden mit Buchstaben von a bis l benannt (vgl. Abb. 4.7). Diese<br />

Indizierung hilft entscheidend beim Verständnis der folgenden Erklärungen.<br />

7 g 6<br />

l<br />

h<br />

d<br />

4<br />

i<br />

5<br />

0 1<br />

3 2<br />

c<br />

a<br />

k<br />

e<br />

f<br />

b<br />

j<br />

a: 0 1<br />

b: 1 2<br />

c: 2 3<br />

d: 3 0<br />

e: 4 5<br />

f: 5 6<br />

g: 6 7<br />

h: 4 7<br />

i: 0 4<br />

j: 1 5<br />

k: 2 6<br />

l: 3 7<br />

Abbildung 4.7: Beschriftung der Würfeleckpunkte und Kanten<br />

Die Aufgabe des ersten Teilschrittes ist es, in die definierten Würfel Dreiecke zu legen, sodass<br />

die Objektoberfläche möglichst gut repräsentiert wird. Dabei ist zu beachten, dass<br />

• die Eckpunkte der Dreiecke auf den Kanten des Würfels liegen,<br />

• die Zuordnung der Dreieckseckpunkte auf die Würfelkanten fix durch den Marching-<br />

Cube-Algorithmus vorgegeben wird,<br />

• die genaue Lage der Dreieckspunkte auf den Kanten durch lineare Interpolation der<br />

Farbwerte in den Bildpunkten berechnet wird,<br />

• die endgültigen Koordinaten der Dreieckspunkte erst nach dem Zurückrotieren und<br />

nach dem Setzen des richtigen Offsets (damit ist die Position des Würfels im Datenvolumen<br />

gemeint) feststehen.<br />

Die Kanten der Würfel im Datenvolumen berühren einander naturgemäß. Damit durch die<br />

Dreiecke eine Oberfläche ohne Löcher entsteht, müssen auch sie sich berühren. Dies kann nur<br />

geschehen, wenn die Koordinaten der Eckpunkte der Dreiecke ebenso auf den Kanten liegen.<br />

Die zentrale Frage ist nun, wie die einzelnen Dreiecke je nach Standardkonfiguration in den<br />

Würfel gelegt werden. Die Antwort auf diese Frage gibt der Marching-Cube-Algorithmus. Die


36 KAPITEL 4. SYSTEMMODELL UND ABLAUF<br />

Dreieckseckpunkte werden genau auf jene Kanten gelegt, deren Eckpunkte eine verschiedene<br />

Wahr-Falsch-Konstellation aufweisen.<br />

Dazu ein kleines Beispiel: Es wird angenommen, dass die Punkte 0 und 1 einen Wert Wahr<br />

haben und der Punkt 2 einen Wert Falsch. Auf der Kante a wird mit Sicherheit kein Eckpunkt<br />

eines Dreieckes zu finden sein, hingegen wird das Dreieck irgendwo auf der Kante b eine Ecke<br />

haben.<br />

Die graphische Darstellung aller möglichen Dreieckszuordnungen in den Würfeln ist in<br />

Abb. 2.8 dokumentiert. In Tab. 4.3 wird genau dieser Sachverhalt in Tabellenform dargestellt,<br />

wobei die Indizierung <strong>aus</strong> Abb. 4.7 verwendet wird. Für alle Grundkonfigurationen<br />

wird angegeben, welche Eckpunkte den Wert Wahr haben müssen und auf welchen Kanten<br />

Dreieckspunkte liegen. Dabei definieren immer drei nebeneinander liegende Kanten ein<br />

Dreieck.<br />

Jede Kante des Würfels ist definiert durch zwei Eckpunkte A und B, für die neben den Wahr-<br />

Falsch-Entitäten auch die Farbwerte CA und CB bekannt sind. Weiters ist für jede Kante<br />

der zugehörige Schwellwert T bekannt. Dieser Schwellwert liegt im Normalfall zwischen den<br />

beiden Farbwerten CA und CB. Wenn die beiden Eckpunkte der Kante von ein und dem<br />

selben Bild kommen, wird entweder der obere oder untere Schwellwert des zugehörigen Bildes<br />

genommen, der zwischen den beiden Farbwerten liegt. Aufwändiger wird die Berechnung des<br />

Kantenschwellwertes, wenn die Eckpunkte der Kanten <strong>aus</strong> zwei verschiedenen Schichtbildern<br />

kommen. Es werden dabei die Durchschnitte des oberen und unteren Schwellwertes mit den<br />

Farbwerten verglichen. Die Lage der Dreieckspunkte ist einerseits durch die Kante vorgegeben.<br />

Der Abstand zu den Würfeleckpunkten d muss aber extra berechnet werden. Die<br />

Berechnung des relativen Abstandes d zum Punkt A erfolgt nach der Formel:<br />

⎧<br />

1 −<br />

⎪⎨<br />

d =<br />

⎪⎩<br />

T −CB<br />

CA−CB , falls CA > CB<br />

T −CA<br />

CB−CA , falls CA < CB<br />

0.5, falls CA = CB<br />

(4.1)<br />

Die Farbwerte CA und CB sind grundsätzlich verschieden, weil damit normalerweise die Unterschiede<br />

in den Wahr-Falsch-Entitäten verbunden sind. Allerdings kann es vorkommen,<br />

dass Voxel <strong>aus</strong> zwei verschiedenen Bildern zwar die gleichen Farbwerten besitzen, aber unterschiedliche<br />

Wahr-Falsch-Zustände aufweisen, da die Schwellwertbereiche unterschiedlich<br />

definiert wurden. Dieser Sonderfall ist speziell zu berücksichtigen. Der Eckpunkt des Dreiecks<br />

wird dann einfach in die Mitte zwischen Punkt A und B gelegt. d erhält also den Wert<br />

0.5.<br />

Abb. 4.8 zeigt die Fortsetzung des Beispiels <strong>aus</strong> Abb. 4.6. Die Dreiecke wurden wie im<br />

Marching-Cube-Algorithmus vorgeschrieben in den Würfel gelegt. Danach wurde die Ausgangsposition<br />

wieder hergestellt und die Dreiecke zurückrotiert.<br />

Die Dreiecke besitzen jetzt die richtige Orientierung im Würfel. Damit sie aber an der<br />

richtigen Stelle im dreidimensionalen Raum liegen, muss noch ein Offset dazuaddiert werden,


4.3. GENERIEREN EINES POLYEDERMODELLS 37<br />

Index Eckpunkte mit Wahrwerten Betroffene Würfelkanten Anzahl der Dreiecke<br />

0 - - 0<br />

1 3 d, c, l 1<br />

2 2, 3 d, k, l 2<br />

d, b, k<br />

3 3, 6 c, d, l 2<br />

f, k, g<br />

4 3, 5 c, d, l 2<br />

f, e, j<br />

5 0, 1, 2 c, d, k 3<br />

k, d, i<br />

k, i, j<br />

6 2, 3, 5 d, k, l 3<br />

d, b, k<br />

f, e, j<br />

7 2, 5, 7 f, e, j 3<br />

b, c, k<br />

h, g, l<br />

8 0, 1, 2, 3 k, l, i 2<br />

i, j, k<br />

9 0, 1, 3, 4 l, h, e 4<br />

l, e, c<br />

c, e, j<br />

j, b, c<br />

10 1, 3, 5, 7 d, h, g 4<br />

c, d, g<br />

a, b, f<br />

a, f, e<br />

11 0, 1, 3, 5 c, i, l 4<br />

c, i, f<br />

c, f, b<br />

i, f, e<br />

12 0, 1, 2, 7 c, d, k 4<br />

k, d, i<br />

k, i, j<br />

l, h, g<br />

13 1, 3, 4, 6 c, d, l 4<br />

a, b, j<br />

f, g, k<br />

e, i, h<br />

14 0, 1, 2, 4 d, c, h 4<br />

c, h, j<br />

j, c, k<br />

j, h, e<br />

Tabelle 4.3: Zuweisung der Dreieckseckpunkte auf die Würfelkanten


38 KAPITEL 4. SYSTEMMODELL UND ABLAUF<br />

zurück<br />

rotieren<br />

Abbildung 4.8: Zurückrotieren der Dreiecke<br />

der den Koordinaten des Würfels im Datenvolumen entspricht. Das heißt, die Dreiecke<br />

werden an diejenige Stelle geschoben, an der auch der Würfel liegt, von dem die Berechnung<br />

<strong>aus</strong>gegangen ist.<br />

Auf diese Art und Weise werden alle Bildpunkte des Datenvolumens durchlaufen und liefern<br />

die Koordinaten einer Polyederoberfläche. Diese kann nun entweder direkt mithilfe von<br />

z. B. OpenGL angezeigt werden, oder, wie im nächsten Kapitel beschrieben, für eine spätere<br />

Verwendung abgespeichert werden.<br />

4.4 Plattformunabhängige Abspeicherung<br />

Zur Abspeicherung der Dreiecksoberfläche wird ein Grafikformat benötigt, das<br />

• eine standardisierte Abspeicherung von dreidimensionalen Bildinformationen ermöglicht,<br />

• selbst programmierbar und veränderbar ist,<br />

• eine Portierung auf beliebige Systeme erlaubt.<br />

Ein Grafikformat, das diese Anforderungen erfüllt, ist das Drawing Interchange Fileformat<br />

(DXF) von der Firma Autodesk. Es wurde in erster Linie dafür entwickelt, verschiedenste<br />

Grafiken in CAD-Systeme einlesen zu können. Die Art und Weise, wie die Daten abgespeichert<br />

werden müssen, ist fix vorgegeben. Es handelt sich dabei um ein ASCII-Format, das<br />

nicht nur mit jedem beliebigen Editor erstellt bzw. verändert werden kann, es ist auch einfach<br />

selbst zu programmieren. DXF ist weit verbreitet. Beinahe jedes <strong>3D</strong>-fähige Grafikprogramm<br />

kann mit diesem Format umgehen.<br />

Die Struktur einer DXF-Datei erinnert entfernt an strukturierte Programmiersprachen wie<br />

etwa COBOL. Der gesamte Inhalt einer Grafik ist in vier sogenannte Sections unterteilt (vgl.<br />

[Pohl und Eriksdottar, 1991]):


4.4. PLATTFORMUNABHÄNGIGE ABSPEICHERUNG 39<br />

1. Die Header Section; Sie enthält die generellen Einstellungen, die für jede Zeichnung gemacht<br />

werden müssen, wie aktuelle Farben, aktueller Bildschirm<strong>aus</strong>schnitt, usw. Dafür<br />

stehen eine Reihe von Variablen zur Verfügung.<br />

2. Die Tables Section; Hier werden die Definitionen der zeichenabhängig definierten Einträge<br />

in Tabellen abgelegt.<br />

3. Die Blocks Section; Sie beschreibt die Blockdefinitionseinträge, die jeden Block der<br />

Grafik umfassen.<br />

4. Die Entities Section; Sie enthält schließlich die eigentlichen Zeichenelemente.<br />

Für die Abspeicherung der Dreiecke wird eine DXF-Datei mit standardisierter Header- und<br />

Tables-Section erstellt. Die Blocks-Section ist nicht unbedingt erforderlich und wird daher<br />

in unserem Fall weggelassen. In der Entities-Section werden die Koordinaten der Dreiecke<br />

der Reihe nach eingetragen. Dies geschieht bereits während des Durchlaufens des Marching-<br />

Cube-Algorithmus. Dadurch können Rechnerressourcen eingespart werden. Beim Erstellen<br />

der DXF-Datei entstehen große Datenmengen, da jede Dreieckskoordinate abgespeichert<br />

wird. Allerdings werden die Werte im ASCII-Format abgespeichert, dadurch relativiert sich<br />

der Platzbedarf. Das Ende einer DXF-Datei stellt ein ” END OF FILE” Eintrag dar.<br />

Durch die Abspeicherung der Dreiecksoberfläche im DXF-Format können die Ergebnisse der<br />

Oberflächenanalyse mit jedem beliebigen, DXF-fähigen <strong>3D</strong>-Grafikprogramm betrachtet werden.<br />

Weiters besteht die Möglichkeit, die Daten einfach in ein anderes System zu importieren,<br />

was eine leichte Weiterverwendung der Daten gewährleistet.


40 KAPITEL 4. SYSTEMMODELL UND ABLAUF


Kapitel 5<br />

Implementierung<br />

Die Umsetzung des in Kap. 4 beschriebenen Modells erfolgte in der Programmiersprache<br />

C++. Als Werkzeug wurde der Borland C++ Builder gewählt, da dieser eine relativ einfache<br />

Erzeugung einer Benutzeroberfläche erlaubt.<br />

Das gesamte Programm wurde in zwei Teilprogramme aufgeteilt. Im ersten Programmteil<br />

wird die Funktionalität der Bildbearbeitung implementiert. Dieser Teil beschränkt sich auf<br />

die Manipulation der Bilder und speichert die Zwischenergebnisse ab. Dadurch werden einmal<br />

getroffene Einstellungen für später abgelegt. Im zweiten Teil wird die Funktionalität der<br />

Generierung einer Polygonoberfläche zur Verfügung gestellt. Die Ergebnisse des ersten Teils<br />

werden verarbeitet und eine Objektoberfläche wird abgespeichert. Durch die beiden Programmteile<br />

können diese Arbeitsschritte unabhängig voneinander durchgeführt, wiederholt<br />

oder abgeändert werden.<br />

Bevor nun die technische Umsetzung des Systemmodells beschrieben wird, erfolgt eine Beschreibung<br />

des statischen Klassenmodells, das die Grundlage der Implementierung darstellt.<br />

5.1 Beschreibung des statischen Klassenmodells<br />

Es wurde versucht, alle geforderten Funktionalitäten möglichst objektorientiert in Klassen<br />

aufzuteilen und den notwendigen Daten die richtigen Methoden zuzuordnen. Diese Aufteilung<br />

und die Beziehungen zwischen den einzelnen Klassen sind in Abb. 5.1 dargestellt.<br />

Ausgangspunkt für alle hier beschriebenen Programme ist eine Klasse MyTForm, die von der<br />

Borland C++ Klasse TForm abgeleitet wird. Dadurch sind die grundlegenden Programmfunktionen<br />

eingebunden und es kann leicht ein Programmfenster erstellt werden, in dem die<br />

notwendigen Benutzereingaben erfolgen.<br />

Der linke Ast des statischen Klassenmodells ist in erster Linie für die Bildbearbeitung interessant.<br />

Die Klasse VolumeData dient dabei zur Verwaltung der Daten. Sie enthält im<br />

Wesentlichen eine Liste aller verwendeten Bilder. Die Bilder selbst werden in der Klasse<br />

Picture verwaltet. Die Bestandteile der Bilder sind die Farbpalette (Palette), das Polygon<br />

41


42 KAPITEL 5. IMPLEMENTIERUNG<br />

«struct»<br />

tab<br />

Palette<br />

Picture<br />

MyPolygon<br />

PolygonFill<br />

VolumeData<br />

edge<br />

«struct»<br />

voxel<br />

Threshold<br />

Cube<br />

MyTForm<br />

MarchingCube<br />

3dmath<br />

Abbildung 5.1: Statisches Klassenmodell<br />

TForm<br />

Triangle<br />

helpDxf


5.2. BILDBEARBEITUNG 43<br />

(MyPolygon), das ebenso wie der Schwellwertbereich (Threshold) vom Benutzer interaktiv<br />

definiert wird. Die Struktur tab, die zur Palette gehört, dient zur Verwaltung der Platteneinträge<br />

und hat zusätzlich einen Boolean-Wert, der angibt, ob eine Farbe im Bild vorkommt<br />

oder nicht.<br />

In der Klasse VolumeData wird auch die Funktionalität zum Erstellen des Datenvolumens<br />

zur Verfügung gestellt. Zentraler Bestandteil dabei ist die Implementierung des Scan-Line<br />

Algorithmus, welche in der Klasse PolygonFill durchgeführt wird. Die Klasse edge stellt<br />

dabei eine Hilfsklasse dar, die der Scan-Line Algorithmus benötigt.<br />

Die zentrale Klasse im rechten Ast des Klassenmodells ist MarchingCube, welche den Marching-<br />

Cube-Algorithmus implementiert. Die wichtigsten Methoden dieser Klasse sind Check, die<br />

eine bestimmte Würfelkonfiguration auf eine Standardkonfiguration zurückführt, und GenerateTriangles,<br />

die für das Erstellen der Dreiecke und das Zurückrotieren sorgt. Die Klassen<br />

Cube und Triangle sind diejenigen Klassen, in denen die Würfel und Dreiecke verwaltet<br />

werden. Ein Würfel besteht <strong>aus</strong> acht Voxel, wobei jeder Voxel den Farbwert, den Wahr-<br />

Falsch-Wert und die dazugehörenden Koordinaten verwaltet. Ein Dreieck besteht nur <strong>aus</strong><br />

den Koordinaten der Eckpunkte und einem Farbwert.<br />

Eine wesentliche Funktion von Würfel und Dreieck ist das Rotieren. Die Rotationen erfolgen<br />

mit sogenannten Quaternionen. Der Einfachheit halber werden deswegen auch die Koordinaten<br />

mithilfe von Quaternionen abgespeichert. Die Klasse 3dmath stellt die zugehörige<br />

Funktionalität zur Verfügung.<br />

Zum Abspeichern der Dreiecke ist die Hilfsklasse helpDxf vorgesehen. In diese Klasse sind<br />

Funktionen zur Dateiverwaltung und zur einfachen Erstellung der DXF-Sections zu finden.<br />

5.2 Bildbearbeitung<br />

5.2.1 Ausgangspunkt<br />

Die Beschaffung der benötigten <strong>MR</strong>-Bilder wurde bereits in Kap. 4.1 <strong>aus</strong>führlich beschrieben.<br />

Einige Anmerkungen <strong>aus</strong> technischer Sicht sind dennoch notwendig.<br />

Um die Bilder bearbeiten zu können, müssen sie im Bitmap-Format (*.bmp) vorliegen. Die<br />

meisten medizinischen Bilder werden aber in einem speziellen Datenformat, dem DICOM -<br />

Format, gespeichert. DICOM steht für Digital Imaging and Communications in Medicine<br />

(vgl. [Lehmann et al., 1997]) und verwaltet nicht nur einzelne Bilder, sondern bietet die<br />

Möglichkeit, ganze Bildarchive abzuspeichern, die zusammenhängende Abbildungen von Untersuchungen<br />

beinhalten. Liegen die Bilder im DICOM-Format vor, ist eine Umwandlung in<br />

entsprechende BMP-Files notwendig. Diese Umwandlung erfolgte mit der frei verfügbaren<br />

Software dicom2 von Sébastien Barré (vgl. [Barré, 2001]). Es handelt sich dabei um ein einfaches<br />

Kommandozeilen-Programm, das DICOM-Bilder problemlos in ein beliebiges Format<br />

umwandelt.<br />

Eine Bildserie besteht nach der Konvertierung <strong>aus</strong> einer bestimmten Anzahl von BMP-<br />

Dateien, bei denen sich der Name nur durch eine laufende Nummer unterscheidet (xxx01.bmp,


44 KAPITEL 5. IMPLEMENTIERUNG<br />

xxx02.bmp, usw.). Dabei wird vor<strong>aus</strong>gesetzt, dass die Dateinamen aufsteigend sortiert sind.<br />

Damit ist gemeint, dass z. B. die Datei xxx09.bmp räumlich vor der Datei xxx10.bmp liegt.<br />

Ist dies gewährleistet, können die Veränderungen an den Bildern vorgenommen werden.<br />

5.2.2 Veränderungen an den Bildern<br />

5.2.2.1 Farbpalette<br />

Zum Sortieren der Farbpalette muss jedes Bild einer Serie einzeln geladen werden. Die<br />

Farbpalette wird dann mithilfe der Funktion GetPaletteEntries() in ein Objekt der Klasse<br />

Palette eingelesen. Ein derartiges Objekt besteht im Wesentlichen <strong>aus</strong> einem Feld mit 256<br />

Einträgen, wobei jeder Eintrag einen Farbwert (=Paletteneintrag) und einen Wahr-Falsch-<br />

Markierer enthält (vgl. Abb. 5.2). Jeder Farbwert wird jetzt untersucht, ob er im Bild<br />

vorkommt. Dazu wird für jeden Paletteneintrag eine Vertretung im Bild gesucht. Wird ein<br />

Farbindex im Bild gefunden, erhält der zugehörige Markierer den Wert Wahr, andernfalls den<br />

Wert Falsch. Die gefundenen Farbindizes werden dabei in einer Zählvariable (AnzahlFarben)<br />

mitgezählt.<br />

data<br />

0 1 2 3 4 5 6 ... 255<br />

entry: PALETTEENTRY<br />

marker: BOOLEAN<br />

Abbildung 5.2: Feld zur Verwaltung der Paletteneinträge<br />

Die Farbpalette wird jetzt entsprechend sortiert:<br />

1. Diejenigen Farbwerte, dessen Markierer den Wert Wahr haben, kommen an den Anfang<br />

der Liste.<br />

2. Die ” wahren” Farbwerte werden der Reihe nach aufsteigend sortiert.<br />

Am Ende der Sortierung werden noch diejenigen Farbwerte, die nicht im Bild vorkommen<br />

(also deren Markierer den Wert Falsch besitzen) auf die Farbe Schwarz gesetzt, in dem die<br />

Rot-Grün-Blauwerte jener Paletteneinträge, die hinter dem Index AnzahlFarben liegen, auf<br />

0 gesetzt werden.<br />

Zum Abspeichern der Farbpalette wird die Funktion CreatePalette() hergenommen, die als<br />

Parameter eine Variable vom Typ TLogPalette benötigt. Dieser Typ besitzt neben den<br />

Paletteneinträgen und der Anzahl der Paletteneinträge eine Versionsnummer. Die einzelnen<br />

Farbwerte werden also in der sortierten Reihenfolge in eine TLogPalette geschrieben und mit<br />

CreatePalette dem Bild zugeordnet (vgl. Anhang A).<br />

Diese Vorgehensweise verändert das Bild selbst nicht. Es wird lediglich die Palette verändert,<br />

was später eine bessere Vergleichbarkeit der Farbwerte erlaubt.


5.2. BILDBEARBEITUNG 45<br />

5.2.2.2 Polygon<br />

Um die Bilder weiter bearbeiten zu können, müssen jetzt die Bilder der Serie geladen werden.<br />

Die einzelnen Dateinamen der Bilder werden in einer Liste angezeigt (vgl. Abb. 5.3). Bei der<br />

Auswahl eines Bildes, wird dieses angezeigt. Falls zu den Bildern bereits ein Polygon oder<br />

ein Schwellwertbereich definiert wurde, wird hier bereits das veränderte Bild angezeigt.<br />

Abbildung 5.3: Screenshot vom Programm zur Bildbearbeitung<br />

Auf einem Bild kann jetzt mithilfe von M<strong>aus</strong> und Tastatur ein beliebiges Polygon gezeichnet<br />

werden. Folgende Aktionen sind dabei möglich:<br />

• Hinzufügen eines Polygonpunktes: Ein Klick mit der linken M<strong>aus</strong>taste während die<br />

Shift-Taste gedrückt wird fügt an der aktuellen M<strong>aus</strong>position einen Punkt ein.<br />

• Verschieben eines Punktes: Durch einen Klick auf einen Punkt wird dieser markiert<br />

und dann mit gedrückter M<strong>aus</strong>taste an die neue Position gezogen.<br />

• Löschen eines Punktes: Ein Punkt wird gelöscht, wenn dieser bei gedrückter Ctrl-Taste<br />

mit der M<strong>aus</strong> angeklickt wird.<br />

Der Programm<strong>aus</strong>schnitt, der diese Funktionalität realisiert, ist in Anhang A zu finden. Im<br />

Wesentlichen werden dabei die Funktionen AddPoint(), ChangePoint() und DeletePoint()<br />

<strong>aus</strong> der Klasse MyPolygon() aufgerufen. Bevor eine Veränderung tatsächlich wirksam wird,<br />

wird untersucht, ob das veränderte Polygon noch <strong>aus</strong> einer Fläche besteht. Dazu wird bei<br />

jeder Kante des Polygons überprüft, ob es eine Überschneidung mit irgendeiner anderen<br />

Kante gibt. Diese Überprüfung geschieht mit dem Algorithmus zum Schneiden von Strecken<br />

<strong>aus</strong> [Sedgewick, 1997]. Für die einzelnen Fälle gilt dabei:<br />

• AddPoint: Bei AddPoint entstehen zwei neue Kanten. Es muss lediglich überprüft<br />

werden, ob diese beiden Kanten eine bereits vorhandene Polygonkante schneiden.


46 KAPITEL 5. IMPLEMENTIERUNG<br />

• ChangePoint: Verändert sich ein Punkt im Polygon, verändern sich damit zwei Polygonkanten.<br />

Diese beiden Kanten werden mit allen anderen Kanten im Polygon geschnitten.<br />

• DeletePoint: Es wird ein Hilfspolygon angelegt, bei dem der zu löschende Punkt <strong>aus</strong>gelassen<br />

wird. In diesem Polygon wird jede Kante mit jeder geschnitten.<br />

Kommt es dabei zu keinen Überschneidungen von Kanten, kann die gewünschte Aktion durchgeführt<br />

werden. Weiters ist eine Überschneidung unmöglich, wenn die Gesamtanzahl der<br />

Polygoneckpunkte kleiner oder gleich 3 ist. Damit ist gemeint, dass z. B. bei AddPoint im<br />

bisherigen Polygon maximal zwei Eckpunkte vorhanden sind oder dass bei ChangePoint maximal<br />

drei Polygoneckpunkte existieren. Tritt dieser Fall auf, kann die Aktion auf jeden Fall<br />

durchgeführt werden.<br />

Die grafische Visualisierung des Polygons ist von der tatsächlichen Veränderung im gespeicherten<br />

Polygon getrennt. Wird z. B. ein Eckpunkt verschoben, wird das ” neue” Polygon nur<br />

gezeichnet, solange die M<strong>aus</strong>taste gedrückt wird. Dies geschieht mit einer eigenen Funktion<br />

Draw(). Die Veränderungen werden erst dann wirksam, wenn die M<strong>aus</strong>taste wieder <strong>aus</strong>gelassen<br />

wird. Der Benutzer kann so ein beliebiges Polygon am Bildschirm zeichnen, wobei die<br />

einzige Einschränkung die ist, dass das Polygon <strong>aus</strong> einer Fläche bestehen muss.<br />

5.2.2.3 Schwellwertbereich<br />

Der Schwellwertbereich wird im Programm dadurch gesetzt, dass der obere und untere<br />

Schwellwert durch einen Schieberegler eingestellt wird (vgl. dazu Abb. 5.3 links unten). Im<br />

angezeigten Bild umfasst der Schwellwertbereich alle Grauwertstufen (unterer Schwellwert 0<br />

und oberer Schwellwert 255). Darum ist das Bild im Original zu sehen.<br />

Der Benutzer kann jetzt mithilfe der Schieberegler einen beliebigen Schwellwertbereich einstellen.<br />

Der untere bzw. der obere Schwellwert können unabhängig voneinander verändert<br />

werden. Die Auswirkungen sind direkt am Bildschirm erkennbar. In Anhang B sind einige<br />

Beispiele von verschiedenen Schwellwerteinstellungen zu sehen. Wird z. B. der untere Schwellwert<br />

nach oben gesetzt, verschwinden die dunkleren Bildpunkte. Wird der obere Schwellwert<br />

nach unten gesetzt, verschwinden die helleren Bildpunkte.<br />

Bei jeder Veränderung einer Schwellwertgrenze wird die zugehörige Variable lowerBound<br />

oder upperBound <strong>aus</strong> der Klasse Threshold gesetzt und die Funktion Draw() <strong>aus</strong> der Klasse<br />

Picture aufgerufen. Diese Funktion zeichnet das Bild Pixel für Pixel auf den Bildschirm.<br />

Dabei wird für jedes Pixel der Farbwert überprüft. Befindet sich der Farbwert innerhalb des<br />

Schwellwertbereiches, wird dieser Farbwert auf dem Bildschirm angezeigt. Ansonsten wird<br />

ein weißer Punkt gezeichnet.<br />

Dadurch kann der Benutzer die optimale Einstellung für einen Schwellwertbereich finden.<br />

Wurden jetzt sowohl Schwellwertbereich als auch Polygon definiert, können diese Dinge abgespeichert<br />

werden, um die Einstellungen für später zu archivieren.


5.2. BILDBEARBEITUNG 47<br />

Bilddatei Polygondatei Thresholddatei<br />

20001123 coronal512 05.bmp 20001123 coronal512 05.pol 20001123 coronal512 05.thr<br />

20001123 coronal512 06.bmp 20001123 coronal512 06.pol 20001123 coronal512 06.thr<br />

20001123 coronal512 07.bmp 20001123 coronal512 07.pol 20001123 coronal512 07.thr<br />

20001123 coronal512 08.bmp 20001123 coronal512 08.pol 20001123 coronal512 08.thr<br />

20001123 coronal512 09.bmp 20001123 coronal512 09.pol 20001123 coronal512 09.thr<br />

20001123 coronal512 10.bmp 20001123 coronal512 10.pol 20001123 coronal512 10.thr<br />

20001123 coronal512 11.bmp 20001123 coronal512 11.pol 20001123 coronal512 11.thr<br />

... ... ...<br />

Tabelle 5.1: Beispiel für die Dateibenennung<br />

5.2.3 Abspeichern der Zwischenergebnisse<br />

Sowohl in der Klasse MyPolygon als auch in der Klasse Threshold gibt es eine Methode<br />

Save(), die zum Abspeichern der jeweiligen Informationen dient.<br />

Die Gemeinsamkeit dabei ist, dass beide Methoden als Parameter den Namen der zugehörigen<br />

Bilddatei erhalten. Der Name der Bilddatei ist gleichzeitig der Name der Polygon- bzw.<br />

Threshold-Datei. Es wird lediglich die Dateiendung abgeändert. So erhalten Polygondateien<br />

die Endung ” *.pol” und Thresholddateien die Endung ” *.thr”. Tab. 5.1 zeigt einen Ausschnitt<br />

derjenigen Dateien, die für die erste Bildserie erstellt wurden. Die Beibehaltung der<br />

Dateinamen wurde deswegen gewählt, weil dadurch eine relativ einfache Implementierung des<br />

Speichervorgangs möglich ist. Werden zu einem bestimmten Bild die gespeicherten Polygonoder<br />

Thresholdwerte benötigt, reicht es, den Namen der Bilddatei zu kennen.<br />

Wenn die gewünschte Datei noch nicht existiert, wird sie mit CreateFile(FileName) erstellt.<br />

Ist die Datei bereits vorhanden, wird sie mit OpenFile(FileName, Mode) geöffnet, wobei<br />

alle bisherigen Inhalte gelöscht werden (Mithilfe des Parameters Mode wird die Datei für<br />

Schreibzugriff geöffnet). Der Rückgabewert beider Funktionen ist ein iFileHandle, mit dem<br />

die folgenden Funktionen auf die Datei zugreifen.<br />

Zum Speichern eines Polygons wird jetzt die Liste, die die Koordinaten verwaltet, durchlaufen.<br />

Jeder Polygonpunkt wird einzeln in die Datei gespeichert, wobei die Funktion File-<br />

Write(...) verwendet wird. Ein Schwellwertbereich wird abgespeichert, in dem die beiden<br />

Integer-Werte lowerBound und upperBound mithilfe von FileWrite(...) in die entsprechende<br />

Datei geschrieben werden. Am Ende wird die Datei mit FileClose(...) geschlossen.<br />

Weiters ist eine Methode Load() zum Laden der Dateien vorgesehen. Dabei wird eine Datei<br />

für den Lesezugriff geöffnet und die Inhalte mit FileRead(...) <strong>aus</strong> der Datei gelesen. Wird<br />

ein Polygon geladen, wird die Liste der Punkte mit den Werten <strong>aus</strong> der Datei neu aufgebaut.<br />

Die geladenen Schwellwerte werden den Variablen in der Klasse Threshold zugewiesen.<br />

Obwohl durch diese Vorgangsweise viele kleine Dateien entstehen (die Thresholddatein sind<br />

beispielsweise nur acht Bytes groß), wurde ihr der Vorzug gegeben. Sie ist relativ einfach zu<br />

implementieren, da keine zusätzlichen Suchalgorithmen oder Datenbankfunktionen notwen-


48 KAPITEL 5. IMPLEMENTIERUNG<br />

dig sind.<br />

5.3 Generierung eines Polyedermodells<br />

Die vorbereiteten Bilder werden jetzt im zweiten Programmteil analysiert und ein Polyedermodell<br />

der gesuchten Oberfläche wird erstellt. Dazu ist zunächst ein Datenvolumen aufzubauen,<br />

das nur mehr die relevanten Bildpunkte beinhaltet. Erst danach wird dieses Datenvolumen<br />

durchlaufen und ein Polyedermodell bestehend <strong>aus</strong> Dreiecken erstellt. Dieses Dreiecksmodell<br />

wird schließlich abgespeichert und damit anderen Anwendungen zur Verfügung<br />

gestellt.<br />

5.3.1 Erstellung eines Volumensmodells<br />

Um ein Datenvolumen erstellen zu können, müssen die zuvor manipulierten Bilder geladen<br />

werden. Dabei kann der Benutzer selbst <strong>aus</strong>wählen, welche Bilder zur Verwendung kommen.<br />

Es müssen allerdings für alle verwendeten Bilder auch die zugehörigen Polygon- und<br />

Threshold-Dateien vorhanden sein.<br />

Ein Objekt der Klasse VolumeData öffnet zunächst einen Dialog, indem der Benutzer die<br />

gewünschten Dateien <strong>aus</strong>wählen kann. Für jeden Eintrag dieser Dateiliste wird jetzt<br />

• die zugehörige Bilddatei in den Hauptspeicher geladen,<br />

• die richtige Einfügeposition ermittelt (ist der Eintrag bereits vorhanden, wird der<br />

nächste Eintrag bearbeitet),<br />

• ein Objekt der Klasse Picture angelegt, das mit den gespeicherten Werten initialisiert<br />

wird,<br />

• dieses Picture-Objekt an die ermittelte Position in der Liste eingefügt.<br />

Das Laden der Bilddatei erfolgt mit der Funktion LoadFromFile(FileName). Ist die Datei mit<br />

dem angegebenen Dateinamen nicht vorhanden, wird eine Ausnahme (Exception) geworfen<br />

und die Verarbeitung für diese Datei abgebrochen.<br />

Zum Ermitteln der richtigen Einfügeposition werden die Dateinamen miteinander verglichen.<br />

Die Bilder werden in einer TList abgespeichert, die im Grunde nur ein Feld von Zeigern<br />

verwaltet. Die Dateinamen jedes Eintrages werden nun mit dem neuen Eintrag verglichen.<br />

Ist noch kein Eintrag vorhanden, kann direkt mit der Verarbeitung fortgefahren werden.<br />

Ansonsten stoppt die Suche nach der richtigen Position, sobald der Eintrag <strong>aus</strong> der Liste<br />

größer oder gleich ist, als der Dateiname des neuen Eintrags. Bei gleichen Dateinamen darf<br />

dieser nicht in die bestehende Liste eingefügt werden. Eine Fehlermeldung wird angezeigt<br />

und die Verarbeitung mit der nächsten Datei fortgesetzt.<br />

Jetzt wird ein neues Objekt der Klasse Picture erstellt. Dem Konstruktor wird dabei das<br />

geladene Bitmap und der Dateiname übergeben. Dort werden Objekte der Klassen Palette,<br />

MyPolygon und Threshold erstellt und initialisiert:


5.3. GENERIERUNG EINES POLYEDERMODELLS 49<br />

• Die Paletteneinträge werden <strong>aus</strong> dem Bitmap in die Palette geschrieben.<br />

• Die Indizes der Bildpunkte werden <strong>aus</strong> dem Bitmap in ein zweidimensionales Feld <strong>aus</strong><br />

Integer-Werten geschrieben.<br />

• Das Polygon wird aufgebaut, indem mit der Methode Load die gespeicherten Einträge<br />

geladen werden.<br />

• Dem Threshold-Objekt werden mit der Methode Load die gespeicherten Werte zugewiesen.<br />

Das so erstellte Picture-Objekt wird in die Liste der Bilder eingefügt. Der Datentyp TList<br />

stellt dazu die Methode Insert(index, pointer) zur Verfügung. Diese fügt an der Stelle index<br />

den Zeiger auf das Objekt ein und verwaltet selbständig den Speicher.<br />

Mithilfe der Methode GenerateSubVolume() <strong>aus</strong> der Klasse VolumeData wird jetzt das neue<br />

Datenvolumen erstellt. Dabei werden zunächst die maximalen bzw. minimalen Koordinaten<br />

der Polygone aller beteiligter Bilder ermittelt. Sämtliche Punkte aller Polygone werden<br />

betrachtet. Die kleinsten Koordinaten werden in einer Variable min gespeichert und die<br />

größten Koordinaten in einer Variable max (vgl. dazu das Programmbeispiel <strong>aus</strong> Anhang A).<br />

Um sicher zu gehen, dass alle Polygoneckpunkte im neuen Datenvolumen Platz finden, wird<br />

ein Sicherheitsrand von einem Pixel an allen Seiten angebracht. Die min-Werte werden um<br />

1 verringert, die max-Werte um 1 erhöht.<br />

Das neue Datenvolumen (das SubVolume) wird erstellt, indem neue Objekte der Klasse<br />

Picture angelegt werden. Die Ausdehnung dieser Bilder in x-Richtung entspricht xlength =<br />

xmax − xmin und die Ausdehung in y-Richtung ist ylength = ymax − ymin. Beim Erstellen<br />

dieser Bilder werden zunächst alle Farbwerte auf einen sicher falschen Wert (-1) gesetzt.<br />

Die Implementierung des Scan-Line Verfahrens befindet sich in der Klasse PolygonFill. Nach<br />

einer entsprechenden Initialisierung liefert die Methode GetNextPoint() solange den nächsten<br />

Punkt im Polygon, bis der zurückgelieferte y-Wert gleich -1 ist. Jedes Pixel, das sich innerhalb<br />

des Polygons befindet, wird nun in das neue Datenvolumen kopiert, indem die Methode<br />

SetIndexForPixel(...) vom neu erstellten Picture-Objekt aufgerufen wird. Als Parameter<br />

erhält diese Methode den Wert, der durch GetIndexFromPixel(...) vom ursprünglichen Bild<br />

geliefert wird (vgl. Anhang A). Das neue Picture-Objekt wird schließlich in das SubVolume<br />

eingefügt.<br />

Das so entstandene neue Datenvolumen beinhaltet nicht nur alle Bildpunkte, die innerhalb<br />

der Polygone liegen. Es sind auch viele Bildpunkte außerhalb der Polygone enthalten. Diese<br />

besitzen allerdings durch die Initialisierung am Beginn einen sicher falschen Farbwert und<br />

werden somit beim Generieren der Polygonoberfläche nicht berücksichtigt.<br />

5.3.2 Polygongenerierung mithilfe des Marching-Cube-Algorithmus<br />

Beim Durchlaufen des Datenvolumens wird bei jedem Schritt ein Würfel definiert. Diese<br />

Aufgabe wird von der Methode GetNextCube(...) <strong>aus</strong> der Klasse VolumeData übernommen.


50 KAPITEL 5. IMPLEMENTIERUNG<br />

Eckenindex x-Ausdehnung y-Ausdehnung z-Ausdehnung<br />

0 col index line index + 1 pic index<br />

1 col index + 1 line index + 1 pic index<br />

2 col index + 1 line index + 1 pic index + 1<br />

3 col index line index + 1 pic index + 1<br />

4 col index line index pic index<br />

5 col index + 1 line index pic index<br />

6 col index + 1 line index pic index + 1<br />

7 col index line index pic index + 1<br />

Tabelle 5.2: Definition der Würfel<br />

Dabei ist der Rückgabewert wahr, solange sich ein Würfel im Datenvolumen generieren lässt.<br />

Die Methode verwendet drei Laufvariablen, die zu Beginn der Verarbeitung auf 0 gesetzt<br />

werden und die Voxelstruktur durchlaufen:<br />

• col index: Durchläuft das Datenvolumen in x-Richtung. Sie wird bei jedem Aufruf von<br />

GetNextCube(...) erhöht, solange bis sie die Anzahl der Voxel in der Spalte -1 erreicht<br />

hat (col index = xlength − 1). Dann wird col index auf 0 gesetzt und line index erhöht.<br />

• line index: Durchläuft das Datenvolumen in y-Richtung. Ein Zeilenvorschub geschieht<br />

immer dann, wenn alle Punkte einer Zeile analysiert worden sind. Wenn line index =<br />

ylength − 1 ist, wird line index auf 0 gesetzt und der pic index erhöht.<br />

• pic index: Durchläuft alle Bilder im Datenvolumen. Wurden alle Bildpunkte im Bild<br />

analysiert, wird auf das nächste Bild weitergeschaltet. Auch dieser Index läuft nur bis<br />

zu der um eins verminderten Anzahl der Bilder.<br />

Die jeweiligen Indizes laufen immer bis zur maximalen Anzahl -1. Der Grund liegt darin,<br />

dass beim Aufbau eines Würfels die ” nächsten” Punkte auch benötigt werden. Die Zuweisung<br />

der Laufvariablen zu den Würfeleckpunkten ist in Tab. 5.2 angegeben. Die x-y-Ebene<br />

spannt dabei ein Bild auf und die z-Richtung entspricht dem Index der Schnittbilder. Diese<br />

Zuordnung ist in Abb. 5.4 grafisch dargestellt.<br />

Ein Würfel wird im Programm mit einem Objekt der Klasse Cube repräsentiert. Die Komponenten<br />

von Cubes sind<br />

• ein Feld von acht Voxel (ein Voxel besteht <strong>aus</strong> dem Farbwert, einem Wahr-Falsch-<br />

Markierer und den Koordinaten) und<br />

• ein Feld von zwölf Werten vom Typ unsigned char, die zur Verwaltung der Schwellwerte<br />

für die Würfelkanten dienen.<br />

Bevor mit dem Füllen der einzelnen Voxel begonnen werden kann, ist die Schwellwertanalyse<br />

durchzuführen. Die Methode Analyze(ColorIndex) <strong>aus</strong> der Klasse Threshold überprüft, ob<br />

ein Index auf eine Farbe innerhalb der Schwellwertgrenze liegt und gibt einen Wahr- oder


5.3. GENERIERUNG EINES POLYEDERMODELLS 51<br />

pic_index+1<br />

line_index<br />

z<br />

line_index+1<br />

pic_index<br />

7<br />

3<br />

y<br />

Abbildung 5.4: Aufbau eines Würfels<br />

0<br />

4<br />

2<br />

6<br />

col_index col_index+1<br />

Falschwert zurück. Dabei ist natürlich darauf zu achten, dass der richtige Schwellwertbereich<br />

hergenommen wird, da für die Bilder unterschiedliche Definitionen vorhanden sind. Zum<br />

Befüllen der einzelnen Voxel stellt die Klasse Cube drei Methoden zur Verfügung:<br />

1. SetIncludedOfVoxel(index, marker) setzt für einen bestimmten Eckenindex den Wahr-<br />

Falsch-Wert, den die Schwellwertanalyse ergibt.<br />

2. SetCoordOfVoxel(index, coords) setzt die Koordinaten für den Eckpunkt.<br />

3. SetColorOfVoxel(index, color) setzt denjenigen Farbwert, der auf dem Originalbild an<br />

dieser Stelle vorhanden ist.<br />

Die Berechnung des Kantenschwellwertes erfolgt mithilfe der Funktion GetEdgeThreshold(...)<br />

(die Implementierung ist in Anhang A zu finden). Als Eingabe werden dabei die Farbwerte<br />

der beiden Eckpunkte einer Kante benötigt und ein Schwellwertbereich. Befinden sich die<br />

Kanten des Würfels auf einem Bild, wird jeweils das zugehörige Threshold-Objekt übergeben.<br />

Wenn nicht, wird jeweils <strong>aus</strong> den oberen und unteren Schwellwerten der beiden Bereiche der<br />

Durchschnitt <strong>aus</strong>gerechnet und der somit neu entstandene Schwellwertbereich übergeben.<br />

Die so definierten Würfel werden jetzt mit der Methode Check(...) <strong>aus</strong> der Klasse MarchingCube<br />

auf eine Standardkonfiguration zurückgeführt. Der Rückgabewert dieser Methode<br />

entspricht dem Index der Standardkonfiguration.<br />

Bei der Verarbeitung in der Methode Check(...) werden zunächst in einer Schleife die Wahr-<br />

Falsch-Entitäten der acht Eckpunkte untersucht. Gibt es mehr als vier Eckpunkte mit einem<br />

Wert Wahr, werden diese Entitäten einfach vert<strong>aus</strong>cht.<br />

5<br />

1<br />

x


52 KAPITEL 5. IMPLEMENTIERUNG<br />

In einer weiteren Schleife werden jetzt diejenigen Rotationen, die bereits in Kap. 4.3.3 beschrieben<br />

wurden, auf den Würfel angewendet. Eine Methode Rotate(...) <strong>aus</strong> der Klasse<br />

Cube sorgt für die Rotationen. Dabei werden sogenannte Quaternionen verwendet.<br />

Quaternionen bestehen grundsätzlich <strong>aus</strong> einem skalaren Anteil s und einem einem vektoriellen<br />

Anteil �v. Der große Nutzen für die Berechnung von Rotationen besteht darin, dass mit<br />

dem vektoriellen Teil eine (beliebige) Rotationsachse aufgestellt werden kann und im skalaren<br />

Teil wird dann der Rotationswinkel angegeben. Eine genaue Beschreibung der Quaternionen<br />

in Verbindung mit Rotationen ist in [Kaltofen, 2001] zu finden.<br />

Alle Koordinaten im Würfel werden mit Quaternionen gespeichert. Dazu wird der Skalaranteil<br />

auf 0 gesetzt und im vektoriellen Anteil die Koordinaten eingetragen. Um jetzt einen<br />

beliebigen Punkt P um einen Quaternion Q zu rotieren, genügt es die Formel<br />

PRot = Q ◦ P ◦ Q −1<br />

(5.1)<br />

anzuwenden. Dabei ist anzumerken, dass das Rotationsquaternion Q ein Einheitsquaternion<br />

sein muss.<br />

Nun wird untersucht, ob der rotierte Würfel schon mit einer Standardkonfiguration übereinstimmt.<br />

Dazu wird der Würfel in einer Schleife mit allen 15 Grundkonfigurationen verglichen.<br />

Dies geschieht mit einer Methode Compare(...) <strong>aus</strong> der Klasse Cube, die für alle acht Eckpunkte<br />

die Wahr-Falsch-Entitäten beider Würfel vergleicht.<br />

Sobald eine Übereinstimmung gegeben ist, wird der Vorgang abgebrochen und die Methode<br />

Check() beendet. Wichtig ist, dass die Nummer der Standardkonfiguration sowie das<br />

Rotatationsquaternion und der rotierte Würfel zurückgegeben werden.<br />

Mit diesen Informationen wird die Methode GenerateTriangles(...) <strong>aus</strong> der Klasse MarchingCube<br />

aufgerufen. Mit dem Index der Standardkonfiguration wird die entsprechende<br />

Dreieckskonfiguration laut Tab. 4.3 zugewiesen. Die genaue Berechnung der Dreieckspunkte<br />

geschieht mit der Funktion CalculatePoint(...), der neben den beiden Farbwerten der Kanteneckpunkte<br />

auch der Kantenschwellwert als Parameter übergeben wird.<br />

Die jetzt entstandenen Dreiecke können relativ einfach zurückrotiert werden. Dies geschieht<br />

in einer Methode Rotate(...) <strong>aus</strong> der Klasse Triangle, indem der Rotationsquaternion invertiert<br />

wird:<br />

PRot = Q −1 ◦ P ◦ Q (5.2)<br />

Wenn die Würfelkonfiguration am Beginn der Verarbeitung invertiert wurde, muss jetzt noch<br />

die Orientierung der Dreiecke geändert werden. Dies ist notwendig, damit die späteren<br />

Visualisierungsprogramme die Normalen auf die Dreiecke richtig zeichnen. In einer Methode<br />

Flip() <strong>aus</strong> der Klasse Triangle werden einfach zwei Eckpunkte vert<strong>aus</strong>cht und somit die<br />

Orientierung geändert.<br />

Um die Dreiecke in die richtige Lage im Objekt zu bringen, werden die Ausgangskoordinaten,<br />

die durch den Würfel bekannt sind, zu den Dreieckskoordinaten dazuaddiert. Die Dreiecke


5.3. GENERIERUNG EINES POLYEDERMODELLS 53<br />

besitzen jetzt die richtige Orientierung und Lage im Objekt und können im folgenden Schritt<br />

abgespeichert werden.<br />

5.3.3 Abspeicherung der Resultate<br />

Der Vorgang des Abspeicherns beginnt schon vor der Deklaration des ersten Würfels. Durch<br />

das Anlegen eines neuen Objekts der Klasse helpDxf wird eine DXF-Datei angelegt. Die<br />

Klasse helpDxf stellt einige Methoden zur Verfügung, die das Schreiben in die DXF-Datei<br />

unterstützen:<br />

• Write(...): Schreibt einen DXF-Eintrag.<br />

• WriteHeaderSection(): Schreibt eine fix vorgegebene Header-Section in die DXF-Datei.<br />

• WriteTablesSection(): Schreibt eine fix vorgegebene Tables-Section in die DXF-Datei.<br />

• WriteTriangle(...): Die Eckpunkte eines Dreiecks werden übergeben und in die DXF-<br />

Datei geschrieben.<br />

Nach jedem Aufruf von GenerateTriangles(...) werden die erstellten Dreiecke sofort mithilfe<br />

der Methode WriteTriangle(...) abgespeichert. Dies geschieht, indem alle drei Punkte des<br />

Dreiecks mit ihren Koordinaten in das DXF-Format gebracht werden und dann mittels der<br />

Funktion Write(...) zeichenweise in die Datei geschrieben werden.<br />

Zusätzlich zur DXF-Datei wird noch eine Metadatei im Textformt gespeichert. Die darin<br />

enthalten Informationen sind die Größe der verwendeten Bilder bzw. die Ausdehnungen des<br />

erstellten Datenvolumens und eine Liste aller verwendeten Bilddateien. Diese Informationen<br />

werden für spätere Arbeiten mit den Ergebnissen benötigt.


54 KAPITEL 5. IMPLEMENTIERUNG


Kapitel 6<br />

Anwendung und Ergebnisse<br />

6.1 Beispiel: <strong>Rekonstruktion</strong> des m. rect. med. <strong>aus</strong> Coronalschnitten<br />

Dieses Beispiel soll den Ablauf der bisher beschriebenen Tätigkeiten veranschaulichen. Die<br />

Aufgabe besteht darin, <strong>aus</strong>gehend von den Bildern der Serie 1, es handelt sich dabei um<br />

Coronalschnitte, die wenige Millimeter hinter dem Augapfel aufgenommen wurden, den<br />

m. rect. med. zu segmentieren und schließlich dreidimensional darzustellen.<br />

Die Bilder liegen bereits im BMP-Format vor und die Namen der Dateien sind aufsteigend<br />

sortiert. Der erste Schritt ist also das Sortieren der Farbpaletten. Dazu wird ein Bild in das<br />

Programm Farbpalette geladen. Der Menüpunkt Aktion bietet zwei Möglichkeiten:<br />

1. Anzeigen der Farbpalette,<br />

2. Sortieren der Farbpalette.<br />

Bei Auswahl der ersten Aktion wird die Farbpalette im Textfeld angezeigt. Bei Auswahl<br />

der zweiten Aktion wird zunächst die Farbpalette vor der Sortierung angezeigt, dann wird<br />

die Sortierung durchgeführt und schließlich die neue, veränderte Farbpalette in das Textfeld<br />

geschrieben (vgl. Abb. 6.1). Beim angezeigten Bild sind 244 Gr<strong>aus</strong>tufen in Verwendung. Der<br />

Rest wurde auf Schwarz gesetzt. Vor dem Verlassen des Programms kann das Bild mit der<br />

veränderten Farbpalette abgespeichert werden.<br />

Um jetzt die Bilder zu bearbeiten, werden sie in das Programm ” Bilder segmentieren” geladen<br />

(vgl. Abb. 6.2). Dazu werden alle 18 Bilder der Serie markiert und geöffnet. Die Dateinamen<br />

werden im Listenfeld auf der rechten Seite des Programmfensters aufgelistet. Bei der Auswahl<br />

eines Dateinamens wird das zugehörige Bild angezeigt. Existiert bereits eine Polygon- bzw.<br />

eine Threshold-Datei, wird sofort das Polygon auf das Bild gezeichnet bzw. werden diejenigen<br />

Bildpunkte, die außerhalb des Schwellwertbereiches liegen, nicht mehr angezeigt.<br />

Der Benutzer kann jetzt die Einstellungen für Polygone und Schwellwerte treffen. Abb. 6.3<br />

55


56 KAPITEL 6. ANWENDUNG UND ERGEBNISSE<br />

Abbildung 6.1: Sortieren der Farbpalette<br />

Abbildung 6.2: Öffnen der Bilddateien


6.1. BEISPIEL: REKONSTRUKTION DES M. RECT. MED. AUS CORONALSCHNITTEN57<br />

zeigt eine selbstverständlich unsinnige, aber mögliche Einstellung der Werte. Der Schwellwertbereich<br />

wurde so gewählt, dass die dunkleren Bildpunkte verschwinden. Dadurch werden<br />

die Farbinformationen beim Muskel gelöscht. Das Polygon ist willkürlich im Zeichenbereich<br />

angeordnet. Das ist möglich, solange das Polygon <strong>aus</strong> einer Fläche besteht, und das ist hier<br />

der Fall. Es liegt also in der Verantwortung des Benutzers, wie er die Einstellungen trifft.<br />

Abbildung 6.3: Mögliche Schwellwert- und Polygondefinition<br />

Jedes einzelne Bild muss jetzt also für sich betrachtet und manipuliert werden. Die getroffenen<br />

Schwellwerteinstellungen für dieses Beispiel sind in Tab. 6.1 zu sehen und Ausschnitte<br />

von den manipulierten Bildern sind in Abb. 6.4 abgebildet. Auf den Bildern 01 bis 04 ist kein<br />

Muskel zu erkennen. Diese Bilder haben daher auch keine Relevanz für die späteren Arbeiten.<br />

Es wurde weder ein Schwellwertbereich noch ein Polygon definiert. Bei den Schwellwertbereichen<br />

in der Tabelle fällt auf, dass nur obere Schwellwerte definiert wurden. Auf allen<br />

Bildern wird also der gewünschte Bereich, nämlich der des m. rect. med., allein durch die<br />

Her<strong>aus</strong>filterung der hellen Bildpunkte <strong>aus</strong>reichend gut isoliert.<br />

All diese Manipulationen werden jetzt abgespeichert. Das Programm ” DXF erstellen” benutzt<br />

diese Daten als Eingabe und führt das Scan-Line Verfahren und den Marching-Cube-<br />

Algorithmus <strong>aus</strong>. Die einzige Benutzereingabe, die dabei notwendig ist, geschieht beim Laden<br />

der Dateien. In einem Öffnen-Dialog werden diejenigen Dateien <strong>aus</strong>gewählt, die in das Ergebnis<br />

einfließen sollen. Im Beispielfall sind das die Bilder 05 bis 18.<br />

Es werden jetzt alle Bilder durchlaufen und eine DXF-Datei erstellt. Diese DXF-Datei kann<br />

mit einem beliebigen <strong>3D</strong>-fähigen Grafikprogramm visualisiert werden. In diesem Fall wurde<br />

die Datei mit dem Program ” Micrografx Instant <strong>3D</strong>” geöffnet. Das gespeicherte Objekt wird<br />

dreidimensional visualisiert und kann von allen Seiten betrachtet werden (vgl. Abb. 6.5).<br />

Die Dreiecke bilden im Wesentlichen eine geschlossene Oberfläche. Die kleinen Gebilde am<br />

rechten Rand des Muskels stammen von ” Pixelüberresten” <strong>aus</strong> den Bildern. Es sind dies<br />

jene Pixel, die weder durch die Schwellwertanalyse noch durch die Polygongrenzen eliminiert


58 KAPITEL 6. ANWENDUNG UND ERGEBNISSE<br />

Bildindex unterer Schwellwert oberer Schwellwert<br />

01 kein Schwellwert kein Schwellwert<br />

02 kein Schwellwert kein Schwellwert<br />

03 kein Schwellwert kein Schwellwert<br />

04 kein Schwellwert kein Schwellwert<br />

05 0 119<br />

06 0 107<br />

07 0 138<br />

08 0 131<br />

09 0 150<br />

10 0 146<br />

11 0 136<br />

12 0 112<br />

13 0 139<br />

14 0 135<br />

15 0 121<br />

16 0 115<br />

17 0 129<br />

18 0 139<br />

Tabelle 6.1: Schwellwertbereiche der Bildserie<br />

Abbildung 6.4: Ausschnitte der manipulierten Bilder


6.2. VERGLEICH DER ERGEBNISSE MIT ANDEREN ANWENDUNGEN 59<br />

werden konnten. In Abb. 6.6 wurde der selbe Muskel so gedreht, dass ein Blick durch den<br />

Muskel hindurch möglich ist. Auch hier ist die geschlossene Oberfläche wieder zu erkennen.<br />

Abbildung 6.5: <strong>3D</strong>-<strong>Rekonstruktion</strong> des m. rect. med.<br />

6.2 Vergleich der Ergebnisse mit anderen Anwendungen<br />

Gerade in einer Zeit, in der die technische Entwicklung von Computern immer rasanter<br />

fortschreitet, wird auch auf dem Gebiet der Visualisierung von menschlichen Organen eine<br />

intensive Forschungstätigkeit betrieben. Ein interessanter und gleichzeitig bemerkenswerter<br />

Meilenstein ist dabei der Abteilung für Informatik und Datenverarbeitung in der Medizin<br />

der Universitätsklinik Hamburg-Eppendorf [Höhne, 2001] gelungen: Der Voxel-Man<br />

<strong>3D</strong>-Navigator Gehirn und Schädel.<br />

In diesem Programm wurden zahlreiche <strong>MR</strong>- und CT-Bilddatensätze verarbeitet und verschiedenste<br />

Modelle des menschlichen Schädels erstellt. Eine detaillierte Visualisierung der<br />

Schädelknochen ist dabei gen<strong>aus</strong>o zu finden, wie eine Darstellung des Gehirns oder der Blutbahnen.<br />

In Abb. 6.7 ist eine Szene zu sehen, in der das Kleinhirn, der Rückenmarkansatz<br />

sowie Sehnerv und Bulbus dargestellt sind.<br />

Um nun eine Vorstellung darüber zu bekommen, inwieweit die vorliegende Arbeit mit derartigen<br />

Visualisierungen mithalten kann, wurde <strong>aus</strong> einem Bilddatensatz der Sehnerv und<br />

der Bulbus rekonstruiert. Das Ergebnis in Abb. 6.8 zeigt natürlich gravierende Unterschiede<br />

zum Voxel-Man, aber, es ist doch schon eine Oberfläche des Nerves bzw. die Krümmung des<br />

Bulbus zu erkennen.<br />

Die deutlichen Unterschiede ergeben sich schon alleine <strong>aus</strong> der Tatsache, dass für diesen Ver-


60 KAPITEL 6. ANWENDUNG UND ERGEBNISSE<br />

Abbildung 6.6: Blick durch den m. rect. med.<br />

such nur eine kleine Anzahl von <strong>MR</strong>-Bildern zur Verfügung gestanden sind. Weiters wurden<br />

<strong>Rekonstruktion</strong>salgorithmus und Darstellungstechniken beim Voxel-Man durch jahrelange<br />

Forschung verfeinert und optimiert. Dieser Vergleich zeigt aber, dass bei den Entscheidungen<br />

für bestimmte Vorgehensweisen der richtige Weg eingeschlagen wurde.<br />

Ein weiterer positiver Effekt dieses Vergleiches ist die Erkenntnis, dass das erstellte Programm<br />

beliebige Körperteile nachbilden kann. Mit relativ geringem Aufwand konnte die<br />

Visualisierung des Sehnervs und des Bulbus durchgeführt werden. Es ist also leicht vorstellbar,<br />

dieses Programm auch für andere Körperregionen einzusetzen. Einzige Vor<strong>aus</strong>setzung<br />

ist, dass die Eingabeparameter, also die medizinischen Bildfolgen, von <strong>aus</strong>reichender Qualität<br />

sind. Je besser die Bilder, um so besser das Ergebnis!


6.2. VERGLEICH DER ERGEBNISSE MIT ANDEREN ANWENDUNGEN 61<br />

Abbildung 6.7: Ausschnitt <strong>aus</strong> dem Voxel-Man <strong>3D</strong>-Navigator


62 KAPITEL 6. ANWENDUNG UND ERGEBNISSE<br />

Abbildung 6.8: <strong>3D</strong>-<strong>Rekonstruktion</strong> von Sehnerv und Bulbus


Kapitel 7<br />

Vorgehen <strong>aus</strong> der Sicht des<br />

Software-Ingenieurs<br />

Bei der Erstellung von Software für eine medizinische Anwendung wird vom Software-Ingenieur<br />

ein gewisses Maß an medizinischem Detailwissen verlangt. Der klassische Software-<br />

Ingenieur hat in der Regel nicht die Möglichkeit, derartiges Wissen bereits in der Ausbildung<br />

aufzubauen. Am Beginn eines Softwareprojektes für die Medizin ist also ein Einlesen in<br />

anatomische und diagnostische Grundlagen des menschlichen Körpers notwendig. Für die<br />

vorliegende Arbeit war speziell das menschliche Auge und die Art und Weise der Augenbewegungen<br />

interessant. Die medizinischen Fach<strong>aus</strong>drücke sind anfangs doch sehr verwirrend,<br />

allerdings wird mit einiger Übung eine gewisse Routine aufgebaut und so die Sprache der<br />

Mediziner erlernt.<br />

Genau um dieses gegenseitige Verständnis geht es bei jeder Art von Softwareerstellung. Die<br />

Meinungen und das Wissen eines Arztes ist für ein gutes Programm unbedingt notwendig.<br />

Die Aufgabe des Programmierers ist es dabei, die Vorgänge zu analysieren, zu verstehen<br />

und schließlich umzusetzen. Die Wissensgrundlagen für diese Arbeit lassen sich wie folgt<br />

konkretisieren:<br />

• Anatomie des menschlichen Auges,<br />

• medizinische Bezeichnungen der beteiligten Körperteile,<br />

• Wirkung der einzelnen Muskeln auf den Bulbus,<br />

• Entstehung von <strong>MR</strong>-Bildern,<br />

• Erkennung von Organen auf <strong>MR</strong>-Bildern.<br />

In dieser Aufzählung wurden nur die medizinischen Grundlagen erwähnt. Natürlich waren<br />

auch im softwaretechnischen Bereich einige Algorithmen und Verfahren zu erlernen bzw.<br />

zu perfektionieren. Die gesamte Einlesearbeit nahm einen nicht unbeträchtlichen Teil der<br />

Arbeitszeit in Anspruch, ist aber für ein gutes Ergebnis unbeding notwendig.<br />

63


64 KAPITEL 7. VORGEHEN AUS DER SICHT DES SOFTWARE-INGENIEURS<br />

Das Projekt <strong>SEE</strong>-<strong>KID</strong> ist ein Forschungsprojekt. Der Vorteil eines Forschungsprojektes ist<br />

gleichzeitig auch der Nachtel: Das Arbeiten in einem Forschungsumfeld ermöglicht es bzw.<br />

erfordert es, sich in völlig neue und bislang unbekannte Algorithmen und Abläufe einzuarbeiten.<br />

Das gute Arbeitsumfeld und die ständige Beschäftigung mit Neuem fördern die<br />

Motivation und laden ein, die eigenen Grenzen <strong>aus</strong>zuloten und den Horizont zu erweitern.<br />

Allerdings sind die Vorgaben bezüglich einer Projektplanung eher rar. Es besteht leicht die<br />

Gefahr, den Roten Faden zu verlieren und sich auf die falschen und unwichtigen Dinge zu<br />

sehr zu konzentrieren. Man ist teilweise völlig auf sich allein gestellt, was einerseits zwar die<br />

Kreativität fördert, aber andererseits eine hohe Selbstdisziplin erfordert.<br />

Zur Sicherung der Qualität der erstellten Software wurden laufend Überprüfungen der Zwischen-<br />

und Endergebnisse durchgeführt. Pl<strong>aus</strong>ibilität und Verwendbarkeit waren dabei die<br />

obersten Kriterien. So wurde z. B. beim Sortieren der Farbpalette das Ergebnis des erstellten<br />

Programms in einem handelsüblichen Grafikprogramm kontrolliert, indem dort die Farbpalette<br />

angezeigt wurde. Die Veränderung der Farbanordnung vor und nach der Sortierung<br />

waren gut zu erkennen.<br />

Im Vordergrund der Arbeit stand immer eine möglichst genaue Implementierung der Algorithmen.<br />

Das Erhalten von richtigen Ergebnisse war wichtiger als eine besonders bedienerfreundliche<br />

Benutzeroberfläche, da das System für die Benutzung von Expertern <strong>aus</strong>gelegt ist. Die<br />

Erfahrung zeigte allerdings, dass gewisse Grundelemente, wie Statuszeile oder Menüführung,<br />

dennoch vorhanden sein müssen.<br />

Weiters ist die Verwendung einer Versionsverwaltung unbeding empfehlenswert. Gerade in<br />

einer Forschungsumgebung, in der viel <strong>aus</strong>probiert, verändert und wieder verworfen wird,<br />

kann leicht der Überblick verloren werden. Eine gute Dokumentation hilft dabei wesentlich,<br />

ist aber nicht das einzige Allheilmittel.<br />

Abschließend sei mir noch eine persönliche Anmerkung erlaubt: Das Arbeiten im medizinischen<br />

Umfeld ist höchst faszinierend. Allein die Tatsache, dass das oberste Ziel des Projektes<br />

eine Verbesserung der Situation des Patienten ist, motiviert zu Höchstleistungen. Eine umfassende<br />

Forschung ist die Grundlage für viele Arbeiten - und das nicht nur in der Medizin.<br />

Es werden aber auch die entsprechenden Praktiker benötigt, die die Ergebnisse der Forschung<br />

umsetzen. Diese Praktiker liefern ihrerseits wieder neue Ideen, die in die Forschung einfließen.<br />

Forscher sind wichtig für Praktiker - Praktiker sind wichtig für Forscher.


Kapitel 8<br />

Schlussbemerkungen<br />

8.1 Ergebnis<br />

Im Rahmen dieser Arbeit wurde ein System entwickelt, mit dem es möglich ist, <strong>aus</strong>gehend<br />

von <strong>MR</strong>-Bildern des menschlichen Auges die extraokulären <strong>Augenmuskeln</strong> zu segmentieren,<br />

die Oberfläche zu analysieren und dreidimensional darzustellen. Das Programm wurde so<br />

<strong>aus</strong>gelegt, dass die Auswahl des gewünschten Darstellungsbereiches vom Benutzer selbst getroffen<br />

wird. Dadurch ist nicht nur eine Visualisierung der <strong>Augenmuskeln</strong> möglich, es kann<br />

jeder beliebige Körperteil analysiert werden.<br />

Eine wesentliche Anforderung war das Finden und Implementieren geeigneter Bildverarbeitungsalgorithmen.<br />

Mit dem Scan-Line Verfahren (Kap. 2.2.1) und dem Marching-Cube-<br />

Algorithmus (Kap. 2.2.2) wurden zwei weit verbreitete Vorgehensweisen umgesetzt und in<br />

das Programm eingebaut.<br />

Durch die Aufteilung des Ergebnisses in drei Programmteile wurde eine Verteilung der Aufgaben<br />

erreicht, womit jeder Arbeitsschritt unabhängig von den anderen durchgeführt werden<br />

kann. Die Bezeichnungen der Programmteile lauten:<br />

• Farbpalette sortieren,<br />

• Bilder segmentieren und<br />

• DXF erstellen.<br />

Jeder Arbeitsschritt liefert ein Zwischenergebnis, das zur weiteren Verarbeitung abgespeichert<br />

wird. Die Veränderungen an der Farbpalette werden direkt in das Bild gespeichert.<br />

Die Manipulationen an den Bildern, also die Schwellwerte und die Polygone, werden in eigenen<br />

Dateien gespeichert, damit das Ausgangsbild nicht verändert wird. Die DXF-Dateien<br />

gelten als Ergebnis der vorliegenden Arbeit und sind mit jedem <strong>3D</strong>-fähigen Grafikprogramm<br />

darstellbar.<br />

65


66 KAPITEL 8. SCHLUSSBEMERKUNGEN<br />

8.2 Verbesserungsmöglichkeiten<br />

Das hier beschriebene Ergebnis kann nur ein erster Schritt in Richtung einer optimalen Visualisierung<br />

von medizinischen Daten sein. Die Einarbeitung aller Feinheiten und wissenschaftlichen<br />

Erkenntnissen würde wohl den Umfang dieser Arbeit sprengen. Vor allem ist<br />

der Zeitaufwand für eine genaue Implementierung der Algorithmen und die Beachtung aller<br />

möglichen Fälle nicht abzuschätzen. Die folgende Liste soll nur einen kurzen Überblick<br />

darüber geben, wie das Ergebnis noch verbessert werden kann:<br />

• Die Geräte zur Erzeugung von <strong>MR</strong>-Bildern unterliegen einer ständigen Verbesserung.<br />

Neue und bessere Bilder bringen bessere Eingabewerte und ermöglichen eine genauere<br />

Segmentierung der <strong>Augenmuskeln</strong>.<br />

• Einige Teile der Implementierung der Algorithmen sind durch<strong>aus</strong> verbesserungswürdig.<br />

So kann beispielsweise durch eine Optimierung der Würfelrotationen oder der Definition<br />

der Dreiecke im Würfel eine Steigerung der Effizienz erreicht werden.<br />

• Die Oberfläche des generierten Objektes besteht <strong>aus</strong> vielen Dreiecken, die oftmals in<br />

der selben Ebene liegen. Eine Reduktion dieser Dreiecke bzw. eine Umwandlung in<br />

andere geometrische Figuren, wie sie bereits in diversen Arbeiten ansatzweise beschrieben<br />

wurde (z. B. in [Handels, 2000] oder in [Kaiser, 1999]), kann das Datenvolumen der<br />

DXF-Datei erheblich vermindern.<br />

Diese Arbeit stellt nicht den Anspruch auf eine perfekte <strong>Rekonstruktion</strong> von <strong>Augenmuskeln</strong>.<br />

Die gestellten Anforderungen wurden allerdings erreicht. Die Darstellung erfolgt im dreidimensionalen<br />

Raum und die Ergebnisse können in anderen Programmen weiterverarbeitet<br />

werden.<br />

8.3 Ausblick<br />

Ein Programm, das auf den Ergebnissen dieser Arbeit aufbaut, ist in [Lacher, 2001] beschrieben.<br />

Die DXF-Dateien werden von diesem Programm eingelesen und analysiert. Die spezielle<br />

Aufgabe liegt nun darin, die Muskelpfade her<strong>aus</strong>zufinden und anzuzeigen. Dies geschieht<br />

mit verschiedensten mathematischen Analysevorgängen, die <strong>aus</strong> der erstellten Oberfläche die<br />

Schwerpunkte <strong>aus</strong>rechnen und so auf einen Muskelpfad schließen lassen.<br />

Weiters ist es möglich, zwei DXF-Dateien <strong>aus</strong> Bildfolgen zu generieren, in denen verschiedene<br />

Blickpositionen dargestellt sind, damit die Veränderung des Muskels untersucht werden<br />

kann. So wird das Zusammenziehen und die anschließende Entspannung von Muskeln am<br />

Computer zu simuliert. Diese Erkenntnise wiederum sollen in weiterer Folge in das dynamische<br />

Muskelmodell einfließen und eine originalgetreue Visualisierung der Muskelbewegung<br />

ermöglichen.<br />

Noch ist ein weiter Weg zurückzulegen, bis die Vision der vollständigen Darstellung aller<br />

<strong>Augenmuskeln</strong> im System <strong>SEE</strong>++ Wirklichkeit wird. Die Erstellung des dynamischen Mo-


8.3. AUSBLICK 67<br />

dells gestaltet sich als sehr schwierig, da jeder der sechs <strong>Augenmuskeln</strong> seine eigene Gesetzmäßigkeit<br />

hat und diese nur schwer in Modellform zu bringen sind.<br />

Bei Betrachtung der vielfältigen Möglichkeiten, die bildgebende Verfahren in der Medizin bieten,<br />

kann die Idee geboren werden, pathologische Fälle auf Grund von <strong>MR</strong>-Untersuchungen<br />

nachzustellen und so dem Arzt eine Grundlage für die Diagnose zu liefern bzw. eine genauere<br />

Vorbereitung der Operation zu ermöglichen. Diese Vorgehensweise wird allerdings <strong>aus</strong> heutiger<br />

Sicht eine Vision bleiben, weil die Generierung der Bilder zu aufwändig und kostenintensiv<br />

ist. Die persönliche Erfahrung des Mediziners wird auch in Zukunft unbedingt notwendig<br />

sein. Ein medizinisches Softwaresystem kann und darf nur eine Hilfestellung bieten.


68 KAPITEL 8. SCHLUSSBEMERKUNGEN


Anhang A<br />

Quellcodebeispiele<br />

A.1 Farbpalette setzen<br />

Die veränderte Farbpalette steht im Datenfeld data[]. Diese wird nun Eintrag für Eintrag in<br />

eine TLogPalette geschrieben und dann mittels CreatePalette() dem Bild zugeordnet.<br />

Graphics::TBitmap * Palette::SetPalette()<br />

{<br />

typedef struct {<br />

TLogPalette lPal;<br />

TPaletteEntry dummy[PALETTE_MAX];<br />

} LogPal;<br />

}<br />

LogPal SysPal;<br />

SysPal.lPal.palVersion = 0x300;<br />

SysPal.lPal.palNumEntries = PALETTE_MAX;<br />

for (int i = 0; i < PALETTE_MAX; i++)<br />

{<br />

SysPal.lPal.palPalEntry[i] = data[i].entry;<br />

}<br />

pBitmap->Palette = CreatePalette(&SysPal.lPal);<br />

return pBitmap;<br />

69


70 ANHANG A. QUELLCODEBEISPIELE<br />

A.2 Polygonaktionen<br />

Die Interaktionen, die die Veränderung von Polygonpunkten bewirken, werden mit drei<br />

” Mouse-Events” implementiert:<br />

1. MouseDown, wenn eine M<strong>aus</strong>taste gedrückt wird,<br />

2. MouseMove, wenn sich die Position des M<strong>aus</strong>zeigers ändert,<br />

3. MouseUp, wenn eine M<strong>aus</strong>taste losgelassen wird.<br />

Im folgenden Programm<strong>aus</strong>schnitt muss ein aktuelles Polygon (actPol; Instanz der Klasse<br />

MyPolygon) und ein aktuelles Bild (actPic; Instanz der Klasse Picture) definiert sein. Die<br />

Methode Draw() <strong>aus</strong> der Klasse MyPolygon dient zum Zeichnen des gesamten Polygons auf<br />

ein Canvas. Sie kann auch mit zwei neuen Koordinaten aufgerufen werden, dann wird das<br />

bisherige Polygon mit einem neuen Punkt gezeichnet.<br />

void TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,<br />

TShiftState Shift, int X, int Y)<br />

{<br />

// Wenn noch kein Polygon definiert, Abbruch<br />

if(!actPol) return;<br />

}<br />

// Wenn -Taste gedrückt ist, neuen Punkt hinzugefügen<br />

if (Shift.Contains(ssShift))<br />

{<br />

actPol->AddPoint(X, Y);<br />

if(actPic) CopyCanvas(hideBmp);<br />

if(actPol) actPol->Draw(paintBox->Canvas);<br />

}<br />

// Überprüfung, ob die aktuelle M<strong>aus</strong>position mit einem Polygonpunkt<br />

// übereinstimmt<br />

// Falls ja, wird changeIndex ein Wert ungleich -1 zugewiesen<br />

if (actPol) changeIndex=actPol->FindPoint(X, Y);<br />

// Wenn die -Taste drückt ist, wird ein Punkt gelöscht<br />

if (Shift.Contains(ssCtrl) && changeIndex != -1)<br />

{<br />

actPol->DeletePoint(changeIndex);<br />

if(actPic) CopyCanvas(hideBmp);<br />

if(actPol) actPol->Draw(paintBox->Canvas);<br />

}


A.2. POLYGONAKTIONEN 71<br />

//-------------------------------------------------------------------<br />

void TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,<br />

int X, int Y)<br />

{<br />

// Wenn noch kein Polygon definiert, Abbruch<br />

if(!actPol) return;<br />

if (Shift.Contains(ssCtrl)) return;<br />

// Wenn die -Taste gedrückt ist und die M<strong>aus</strong> bewegt wird,<br />

// heißt das, dass gerade ein neuer Punkt gezeichnet wird.<br />

// Der neue Punkt wird auf Pl<strong>aus</strong>ibilität geprüft und gezeichnet.<br />

if(Shift.Contains(ssShift))<br />

{<br />

pressed = true;<br />

if(actPol->CheckPoint(X,Y))<br />

{<br />

if(actPic) CopyCanvas(hideBmp);<br />

if(actPol) actPol->Draw(paintBox->Canvas, X,Y);<br />

}<br />

}<br />

else<br />

{<br />

if (pressed)<br />

{<br />

pressed = false;<br />

}<br />

}<br />

if(actPic) CopyCanvas(hideBmp);<br />

if(actPol) actPol->Draw(paintBox->Canvas);<br />

// Wird die M<strong>aus</strong> bewegt und die linke M<strong>aus</strong>taste gedrückt,<br />

// wird möglicherweise ein Punkt verschoben.<br />

// Dies ist dann der Fall, wenn changeIndex != -1 ist.<br />

if(Shift.Contains(ssLeft))<br />

{<br />

if (changeIndex != -1)<br />

{<br />

actPol->ChangePoint(changeIndex, X, Y);<br />

}<br />

if(actPic) CopyCanvas(hideBmp);<br />

if(actPol) actPol->Draw(paintBox->Canvas);


72 ANHANG A. QUELLCODEBEISPIELE<br />

}<br />

}<br />

//-------------------------------------------------------------------<br />

void TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,<br />

TShiftState Shift, int X, int Y)<br />

{<br />

// Wenn noch kein Polygon definiert, Abbruch<br />

if(!actPol) return;<br />

}<br />

// Wird die M<strong>aus</strong>taste <strong>aus</strong>gelassen und der changeIndex<br />

// ist ungleich -1, wird der veränderte Punkt gespeichert<br />

if(Shift.Contains(ssLeft))<br />

{<br />

if (changeIndex != -1)<br />

{<br />

actPol->ChangePoint(changeIndex, X, Y);<br />

changeIndex = -1;<br />

}<br />

}<br />

if(actPic) CopyCanvas(hideBmp);<br />

if(actPol) actPol->Draw(paintBox->Canvas);<br />

A.3 Datenvolumen generieren<br />

Zunächst werden die minimalen und maximalen Ausdehungen der Polygone ermittelt und<br />

in den Variablen min und max (beides Variablen vom Typ POINT) abgespeichert. Danach<br />

werden neue Pictures angelegt, deren Größe dem Bereich zwischen min und max entspricht.<br />

Die Bildpunkte werden zunächst mit einem sicher falschen Wert (-1) initialisiert. Mithilfe<br />

des Scan-Line Verfahrens werden jetzt die noch vorhandenen Bildpunkte in das neue Datenvolumen<br />

kopiert, wobei GetNextPoint() solange den nächsten Punkt im Polygon liefert, bis<br />

der y-Wert gleich -1 ist.<br />

bool VolumeData::GenerateSubVolume()<br />

{<br />

POINT min,max;<br />

MyPolygon *polygon;<br />

Picture *pic, *sub_pic;<br />

bool first=true;<br />

POINT *p;


A.3. DATENVOLUMEN GENERIEREN 73<br />

for (int i = 0; i < pics->Count; i++)<br />

{<br />

pic = (Picture*)pics->Items[i];<br />

polygon = pic->GetPolygon();<br />

}<br />

for (int j = 0; jGetNumOfPoints(); j++)<br />

{<br />

p = (POINT*)polygon->GetPointList()->Items[j];<br />

if (first)<br />

{<br />

min=max=*p;<br />

first = false;<br />

}<br />

else<br />

{<br />

// Ist der Punkt p größer oder kleiner als min oder max,<br />

// wird der entsprechende min- oder max-Wert berichtigt<br />

if (p->x < min.x) min.x = p->x;<br />

if (p->y < min.y) min.y = p->y;<br />

if (p->x > max.x) max.x = p->x;<br />

if (p->y > max.y) max.y = p->y;<br />

}<br />

}<br />

// Die max-Werte werden um 1 erhöht und die min-Werte<br />

// um 1 vermindert, damit auch die äußersten Polygone<br />

// sicher in das neue Datenvolumen übernommen werden.<br />

max.x++;<br />

max.y++;<br />

min.x--;<br />

min.y--;<br />

for (int i = 0; i < pics->Count; i++)<br />

{<br />

POINT point, helpPoint;<br />

pic = (Picture*)pics->Items[i];<br />

// Neues Bild erstellen; Bildpunkte mit -1 initialisieren;<br />

// Threshold und Palette zuweisen<br />

sub_pic = new Picture(max.x-min.x, max.y-min.y, -1);<br />

sub_pic->SetThreshold(pic->GetThreshold());<br />

sub_pic->SetPalette(pic->GetPalette());


74 ANHANG A. QUELLCODEBEISPIELE<br />

}<br />

// Scan-Line Verfahren initialisieren<br />

PolygonFill *polFill = new PolygonFill(pic);<br />

polFill->Init();<br />

// Das Polygon mit dem Scan-Line Verfahren durchlaufen<br />

// und die Bildpunkte in das neue Bild schreiben<br />

polFill->GetNextPoint(point);<br />

while (point.y != -1)<br />

{<br />

helpPoint.x = point.x - min.x;<br />

helpPoint.y = point.y - min.y;<br />

sub_pic->SetIndexForPixel(pic->GetIndexFromPixel(point), helpPoint);<br />

polFill->GetNextPoint(point);<br />

}<br />

// neues Bild dem neuen Datenvolumen zuweisen<br />

subVolume->Add(sub_pic);<br />

}<br />

return true;<br />

A.4 Kantenschwellwert<br />

Der Kantenschellwert wird für die Berechnung der genauen Punktposition benötigt. Dazu<br />

werden die beiden Farbwerte der Eckpunkte der Kanten benötigt und ein Schwellwertbereich.<br />

unsigned char VolumeData::GetEdgeThreshold(unsigned char color1,<br />

unsigned char color2,<br />

Threshold * thr)<br />

{<br />

if (color1 > thr->GetLowerBound())<br />

{<br />

if (color2 > thr->GetLowerBound()) return thr->GetUpperBound();<br />

else return thr->GetLowerBound();<br />

}<br />

else return thr->GetLowerBound();<br />

}


Anhang B<br />

Screenshots<br />

Abbildung B.1: Unterer Schwellwert<br />

75


76 ANHANG B. SCREENSHOTS<br />

Abbildung B.2: Unterer und oberer Schwellwert


Abbildung B.3: Oberer Schwellwert<br />

77


78 ANHANG B. SCREENSHOTS


Anhang C<br />

Glossar<br />

A<br />

Aequatorialebene: Ebene durch den Bulbusäquator<br />

axial: In Richtung einer Achse; In dieser Arbeit beteutet axial immer entlang der Augenachse,<br />

welche die Verbindungslinie zwischen vorderem und hinterem Augapfelpol<br />

darstellt.<br />

B<br />

Bulbus: (Augapfel) Er ist annähernd kugelförmig und liegt geschützt in der Orbita. Er<br />

besteht <strong>aus</strong> sklera (Lederhaut), choroidea (Aderhaut) und retina (Netzhaut).<br />

Bulbusäquator: Der größte gedachte, senkrecht auf der Augenachse stehende Umfangskreis<br />

des Augapfels in der Frontalebene<br />

C<br />

coronal: Parallel zur Frontalebene (Ebene entlang der Körperlängsachse senkrecht zur Sagittalebene).<br />

D<br />

DICOM: Digital Imaging and Communications in Medicine; Im DICOM-Format werden<br />

neben den digitalen Bildern auch eine Fülle von bildbeschreibenden Daten (wie z. B.<br />

Informationen zum Patienten, zur Untersuchung etc.) abgespeichert und es ist somit<br />

das optimale Bildformat für medizinische Anwendungen.<br />

DXF: Das ASCII Drawing Interchange Files-Format (DXF) wurde von der Firma Autodesk<br />

entwickelt, um in das wohl verbreitetste PC-CAD-Programm, Auto-CAD, die Grafiken<br />

anderer Programme einlesen zu können. DXF ist ein reines ASCII-Text-Format und<br />

lässt sich mit jedem Editor herstellen und auch verändern.<br />

79


80 ANHANG C. GLOSSAR<br />

E<br />

extraokuläre <strong>Augenmuskeln</strong>: (Äußere <strong>Augenmuskeln</strong>) Sie sind für die Bewegung des<br />

Augapfels verantwortlich. Die vier geraden <strong>Augenmuskeln</strong> (musculi recti) und die zwei<br />

schrägen <strong>Augenmuskeln</strong> (musculi obliqui) entspringen in der Augenhöhle und setzen<br />

an der Lederhaut des Augapfels an.<br />

K<br />

kongenital: lat.: angeboren, d.h. bei der Geburt bereits vorhanden und erkennbar<br />

Kontraktion: Die Muskelkontraktion (Zusammenziehung) ist eine durch direkte oder indirekte<br />

Reizung des Muskels <strong>aus</strong>gelöste Verkürzung des Muskels.<br />

M<br />

Magnetresonanztomographie: Abk: <strong>MR</strong>T, <strong>MR</strong>-Tomographie, <strong>MR</strong>; Auch als Kernspintomographie<br />

bekannt; Verfahren zur Erzeugung medizinischer Bilder mithilfe von Magnetfeldern.<br />

Es entstehen Schnittbilder bestimmter Körperregionen, die sich durch<br />

einen besonders hohen Weichteilkontrast <strong>aus</strong>zeichnen.<br />

MATLAB: MATLAB ist ein interaktives Programm für numerische Berechnungen und<br />

für Datenvisualisierung. Zahlreiche Toolboxes erweitern die grundlegenden Funktionen<br />

von MATLAB und bieten verschiedenste Applikationen an.<br />

Motilitätsstörungen: Störung der Beweglichkeit der <strong>Augenmuskeln</strong><br />

musculi obliqui: Schräge <strong>Augenmuskeln</strong><br />

musculi recti: Gerade <strong>Augenmuskeln</strong><br />

musculus obliquus inferior: (m. obl. inf.) unterer schräger Augenmuskel; Wirkungsrichtung:<br />

nach oben und innen<br />

musculus obliquus superior: (m. obl. sup.) oberer schräger Augenmuskel; Wirkungsrichtung:<br />

nach unten und außen<br />

musculus rectus inferior: (m. rect. inf.) unterer gerader Augenmuskel; Wirkungsrichtung:<br />

nach unten<br />

musculus rectus lateralis: (m. rect. lat.) äußerer gerader Augenmuskel; Wirkungsrichtung:<br />

seitwärts nach außen<br />

musculus rectus medialis: (m. rect. med.) innerer gerader Augenmuskel; Wirkungsrichtung:<br />

seitwärts nach innen<br />

musculus rectus superior: (m. rect. sup.) oberer gerader Augenmuskel; Wirkungsrichtung:<br />

nach oben


N<br />

Nystagmus: (Augenzittern) Unwillkürliche, rhythmische Bewegungen des Auges<br />

O<br />

Orbita: (Augenhöhle) Vertiefung in den Schädelknochen. Beinhaltet den Augapfel und<br />

seine Anhangsgebilde (Muskeln, Nerven, Gefäße, Tränenapparat, usw.)<br />

P<br />

Proband: Versuchsperosn, zu Untersuchender<br />

R<br />

Relaxation: Die Muskelrelaxation (Muskelerschlaffung) ist das im Anschluss an die Muskelkontraktion<br />

erfolgende Nachlassen der Muskelverkürzung bis hin zur Ruhelänge.<br />

S<br />

sagittal: Parallel zur Sagittalebene (Ebene entlang der Körperlängsachse streng von hinten<br />

nach vorn)<br />

Schielen: (Strabismus) Eine Störung der Sensomotorik des Sehorgans mit der Unfähigkeit,<br />

die Blicklinien beider Augen auf den gleichen Punkt zu richten<br />

T<br />

Trochlea: Am Stirnbein verankerter Knorpelring, durch den die Sehne des m. obl. sup.<br />

verläuft<br />

81


82 ANHANG C. GLOSSAR


Literatur<br />

[Barré, 2001] S. Barré. Dicom2, A Free Medical Image and DICOM converter (in Englisch). [Website,<br />

http://www.barre.nom.fr/medical/dicom2, zugegriffen am 23. August 2001], 2001.<br />

[Brüder, 2001] Barmherzige Brüder. Konventhospital Barmherzige Brüder Linz, Sehschule. [Website,<br />

http://www.barmherzige-brueder.at/bblinz/abt/seh.htm, zugegriffen am 31. Juli 2001], 2001.<br />

[Brockh<strong>aus</strong>, 1989] Brockh<strong>aus</strong>. Naturwissenschaften und Technik. Brockh<strong>aus</strong>, Mannheim, Sonder<strong>aus</strong>gabe,<br />

1989.<br />

[Brugger, 2000] P.C. Brugger. Der <strong>3D</strong> Anatomie Atlas. Weltbild Verlag GmbH, Augsburg, Deutsche Erst<strong>aus</strong>gabe,<br />

2000.<br />

[Buchberger und Mayr, 2000] M. Buchberger und H. Mayr. <strong>SEE</strong>-<strong>KID</strong>: Software Engineering Environment<br />

for Knowledge-based Interactive Eye Motility Diagnostics (in Englisch). In Proceedings of International<br />

Symposium on Telemedicine, Gothenburg, Sweden, 2000.<br />

[Dössel, 2000] O. Dössel. Bildgebende Verfahren in der Medizin: Von der Technik zur medizinischen Anwendung.<br />

Springer-Verlag Berlin Heidelberg, 2000.<br />

[Günther, 1986] S. Günther. Die modellmäßige Beschreibung der Augenmuskelwirkung. Diplomarbeit, Universität<br />

Hamburg, Universitätskrankenh<strong>aus</strong>-Eppendorf, Abteilung für medizinische Optik, 1986.<br />

[Handels, 2000] H. Handels. Medizinische Bildverarbeitung. B.G. Teubner Stuttgart, Leipzig, 2000.<br />

[Höhne, 2001] K. H. Höhne. Abteilung Informatik und Datenverarbeitung in der Medizin. [Website,<br />

http://www.uke.uni-hamburg.de/idv, zugegriffen am 6. August 2001], 2001.<br />

[Kaiser, 1999] K. Kaiser. Hardwareorientierte Schnittflächendarstellung und interaktive Objektmanipulation<br />

mit OpenGL. Diplomarbeit, Fachbereich Informatik der Universität Hamburg, Juni 1999.<br />

[Kaltofen, 2001] T. Kaltofen. Die Listing’sche Ebene <strong>aus</strong> mathematischer Sicht. Paper, FH-Studiengang<br />

Software Engineering, Hagenberg, 2001.<br />

[Kauffmann et al., 1996] G. Kauffmann, E. Moser, und R. Sauer. Radiologie, Grundlagen der Radiodiagnostik,<br />

Radiotherapie und Nuklearmedizin. Urban und Schwarzenberg Verlag, München, 1996.<br />

[Kaufmann, 1995] H. Kaufmann. Strabismus. Ferdinand Enke Verlag, Stuttgart, zweite, neu bearbeitete und<br />

erweiterte Auflage, 1995.<br />

[Lacher, 2001] M. Lacher. A Volume-Preserving Model for Biomechaically-Based Muscle Volume Deformation<br />

(in Englisch). Diplomarbeit, FH-Studiengang Software Engineering, Hagenberg, 2001.<br />

[Lehmann et al., 1997] T. Lehmann, W. Oberschelp, E. Pelikan, und R. Repges. Bildverarbeitung für die<br />

Medizin. Springer-Verlag, Berlin, Heidelberg, 1997.<br />

[Lehner, 2001] G. Lehner. Augenmuskelwirkung - Ein allgemeiner Abriss. Paper, FH-Studiengang Software<br />

Engineering, Hagenberg, 2001.<br />

[Lorensen und Cline, 1987] W. E. Lorensen und H. E. Cline. Marching Cubes: A High Resolution <strong>3D</strong> Surface<br />

Construction Algorithm (in Englisch). Computer Graphics, 21(4):163–169, 1987.<br />

[Miller und Demer, 1996] J.M. Miller und J.L. Demer. Uses of Biomechanical Modeling (in Englisch). In<br />

Proceedings of CLADE, Buenos Aires, 1996.<br />

[Miller, 1999] J. M. Miller. Gaze Mechanics Simulation (in Englisch). User Manual, Eidactics Visual Biosimulation,<br />

San Francisco, USA, 1999.<br />

83


84 LITERATUR<br />

[Miller, 2001] J. M. Miller. Eidactics Visual Biosimulation (in Englisch). [Website, http://www.eidactics.com,<br />

zugegriffen am 3. August 2001], 2001.<br />

[Morneburg, 1995] H. Morneburg. Bildgebende Systeme für die medizinische Diagnostik. Publicis-MCD-<br />

Verlag, München, 3., wesentlich überarb. und erw. Auflage, 1995.<br />

[Pavladis, 1990] T. Pavladis. Algorithmen zur Grafik und Bildverarbeitung. Verlag Heinz Heise GmbH & Co.<br />

KG, Hannover, 1990.<br />

[Pohl und Eriksdottar, 1991] M. Pohl und H. Eriksdottar. Die wunderbare Welt der Grafikformate. Wolfram’s<br />

Fachverlag, München, 1991.<br />

[Pschyrembel, 1994] Pschyrembel. Klinisches Wörterbuch. Nikol Verlagsgesellschaft mbH, Hamburg, 257.<br />

Auflage, 1994.<br />

[Reisinger, 2001] R. Reisinger. Messmethoden bei Strabismus - am Beispiel des Hess-Diagramms. Paper,<br />

FH-Studiengang Software Engineering, Hagenberg, 2001.<br />

[Roche, 1999] Roche. Lexikon Medizin. Urban und Schwarzenberg Verlag, München, 4., neubearb. und erw.<br />

Auflage, 1999.<br />

[Schäffler und Schmidt, 1998] A. Schäffler und S. Schmidt. Biologie, Anatomie und Physiologie. Urban und<br />

Fischer Verlag, München, 3., erweiterte Auflage, 1998.<br />

[Sedgewick, 1997] R. Sedgewick. Algorithmen in C. Verlag Addison-Wesley, Bonn, 2., unveränderter Nachdruck<br />

Auflage, 1997.<br />

[Tiede, 1999a] M. K. Tiede. <strong>MR</strong>I Tooblox - A MATLAB-based system for manipulation of <strong>MR</strong>I data (in<br />

Englisch). Technical Report, ATR Human Information Processing Laboratories, Kyoto, Japan, 1999.<br />

[Tiede, 1999b] U. Tiede. Realistische <strong>3D</strong>-Visualisierung multiattributierter und multiparametrischer Volumendaten.<br />

Dissertation, Fachbereich Informatik der Universität Hamburg, 1999.<br />

[Vornberger et al., 1997] O. Vornberger, F. M. Thiesing, und F. Lohmeyer. Computergrafik. Vorlesungsunterlagen,<br />

Fachbereich Mathematik/Informatik, Universität Osnabrück, 1997.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!