Im Rahmen der Übung Visualisierung soll als erstes Beispiel ein ray casting Algorithmus implementiert werden. Ray casting zählt zu den direct volume rendering Verfahren, d.h., es wird ein Bild aus einem Volumsdatensatz generiert ohne geometrische Zwischenprimitive zu erzeugen. Dazu werden Blickstrahlen durch jedes Pixel in der Bildebene geschickt, die, wenn sie das Volumen durchdringen, festlegen, was man durch den jeweiligen Pixel sieht. Die Zuordnung von Dichtewerten zu Farbe und "Nichtdurchsichtigkeit" (opacity) wird mittels Transferfunktion festgelegt. Der verwendete Algorithmus wird im Paper "Display of Surfaces from Volume Data" von Marc Levoy allgemein beschrieben.
Nach der Beschreibung des Algorithmus sollte eigentlich eine Unmenge an Daten
gleichzeitig im Speicher gehalten werden. Die Rohdatenmenge benötigt ca.
15MB, zusätzlich braucht man noch einmal ca. den zweifachen Platzbedarf für die
klassifizierten Daten (Farbe und Opacity). Um Speicher zu sparen, und um
die Rechenzeit auf ein erträgliches Maß herabzusetzen, habe ich mehrere
Maßnahmen getroffen.
Die Rohdaten werden beim Einlesen sofort von 12 Bit auf 8 Bit
heruntergerechnet. Dies halbiert den Speicherplatzbedarf, verschlechtert aber
auch die resultierende Bildqualität.
Weiters wird nicht das gesamte Datenvolumen auf einmal klassifiziert, sondern
dies geschieht erst bei Bedarf, wenn der Blickstrahl durch das Volumen geschickt
wird. Dazu werden zuerst für jeden Abtastpunk auf dem Blickstrahl die
ursprünglichen Datenwerte in einem Array gespeichert. Da diese Abtastpunkte in
den seltensten Fällen genau auf den Zellgrenzen liegen, wird jeder Datenwert
durch trilineare Interpolation der acht angrenzenden Datenpunkte berechnet. Diese
interpolierten Daten werden im Anschluß durch die mit den Transferfunktionen
festgelegten Farben und "Undurchsichtigkeiten" klassifiziert und
wieder gespeichert. Diese Daten werden, wie im Paper beschrieben, aufsummiert
und ergeben damit eine resultierende Farbe die am Bildschirm gezeichnet wird.
Dieser Ansatz unterscheidet sich in der von Levoy beschriebenen Methode. Dort
werden zuerst die Rohdaten klassifiziert und im Anschluß erst interpoliert
und aufsummiert.
Die Drehung des Datenvolumens wurde folgendermaßen realisiert. Es gibt sechs
Trivialansichten, Normal auf jede Seite des Datenwürfels. Durch horizontale und
vertikale Drehung um +/- 45 Grad dieser Trivialansichten kann der Datensatz
(theoretisch) aus jeder Richtung betrachtet werden. Abhängig von diesen beiden
Winkeln ergeben sich die Schrittweiten dx, dy und dz, die den Abstand zwischen
zwei Abtastpunkten festlegen. In der aktuellen Version der Implementierung ist
eine Drehung nur für die Ansicht von vorne möglich. Die restlichen Ansichten
ergeben sich einfach durch Austausch der Koordinaten beim Auslesen der Rohdaten
(und Anpassen der Abbruchbedingungen, testen, debuggen,....).
Abb. 1 zeigt einen Screenshot des Programms mit
einem bereits berechneten Bild. Die Einstellungsmöglichkeiten sind in
dieser stark verkleinerten Ansicht nicht besonders gut sichtbar und werden
im folgenden noch genauer beschrieben. Das Programm stellt neben der
geforderten Funktionalität auch noch einige weitere Funktionen wie
Schichtansicht, MIP und Histogramm zur Verfügung.
Statusleiste: Am unteren Bildschirmrand wird die aktuelle Cursorposition und der R, G und B Wert des aktuellen Pixel auf der Zeichenfläche angezeigt. Weiters gibt es dort eine Fortschrittsanzeige, die bei aufwändigeren Berechnungen angezeigt wird. |
Abb. 1 |
Im rechten Bildschirmbereich findet man, nach Gruppen gegliedert,
verschiedene Einstellungsmöglichkeiten, auf die bei der Beschreibung der
Funktionen noch genauer eingegangen wird.
Für die Schichtansicht gibt es keinen eigenen Menüpunkt. Die Tiefe wird
über den großen Schieberegler neben der Zeichenfläche eingestellt. Die
aktuelle Tiefe wird neben dem Regler in einem Textfeld angezeigt. Die
Schichtansicht ist abhängig von der gewählten Ansicht (Front, Bottom, Right,
...)
Exit: Programm beenden.
Open: Öffnet eine Volumsdatendatei (*.dat) oder
Klassifikationseinstellungen* (*.clf). Die Dimensionen des Datensatzes werden
rechts oben im Einstellungsbereich angezeigt.
Save As: Speichert das aktuelle Bild als Bitmap oder
Klassifikationseinstellungen*.
* Um Einstellungen dauerhaft zu speichern, können die im Bereich "Classification" gemachten Einstellungen auch auf Festplatte gespeichert werden. Dies ist ein Textfile und kann mit jedem Editor auch nachträglich geändert werden.
Classify: Dadurch wird ein Bild mit den im Bereich "Classification"
gemachten Einstellungen eingefärbt. Diese Funktion dient hauptsächlich zum
Finden von geeigneten Transferfunktionen in der Schichtansicht.
MIP: Erstellt eine MIP des Datensatzes, abhängig von der gewählten Ansicht
(Front, Bottom, Right).
Rendering fast: Volume rendering mit aktiven! Klassifikationen in der
gewählten Blickrichtung. Eine Drehung des Datensatzes ist hier nicht möglich.
Diese Funktion dient zum Testen von Klassifikationseinstellung. Da bei den
Trivialansichten keine trilineare Interpolation nötig ist, ist diese Funktion
um einiges schneller.
Rendering slow: Zusätzlich kann ein horizontaler und vertikaler
Verdrehwinkel, ausgehend von einer Trivialansicht, angegeben werden. Die
Einstellungen werden sowohl numerisch als auch grafisch angezeigt. Eine schnelle
Rückstellung auf Null erfolgt durch Anklicken des Würfels bei der
Blickrichtungseinstellung. Eine Berechnung kann durch Drücken der Stop-Taste
unterbrochen werden.
Histogram: Zeigt ein Fenster mit der Grauwertwerteilung des
Volumendatensatzes.
Refresh: Sollte die Grafik durch andere überlappende Fenster gelöscht
werden, dann kann damit das Bild wieder hergestellt werden (Achtung:
Funktioniert erst nach dem Speichern!)
Background: Damit kann die Hintergrundfarbe für das Volume rendering
eingestellt werden.
About: Infos zum Programm, Anzeige des freien physikalischen Speichers.
Das Programm wurde so weit wie möglich allgemein gehalten, es sollte daher auch mit anderen Datensätzen funktionieren. Eine Einschränkung ergibt sich durch die maximale Größe des Datensatzes auf 184x256x170.
Knochen und Haut/Muskel (Ansicht von links oben) |
Knochen und Zähne (Ansicht von rechts unten) |
Knochen und Haut/Muskel (Ansicht von rechts) |
vr.zip (222 kB, für Windows9x, NT)
Video1.mpg (389 kB, MPEG-Videosequenz)
Video2.mpg (140 kB, MPEG-Videosequenz)
Bei Fragen und Anregungen: Gilbert Müller-Guttenbrunn