Volume Rendering

Display of Surfaces from Volume Data

Allgemein

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. 

Realisierung

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,....).

Programmbeschreibung

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, ...)

Menü File

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.

Menü View

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!)

Menü Options & Help

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.

Beispielbilder

Knochen und Haut/Muskel
(Ansicht von links oben)
Knochen und Zähne
(Ansicht von rechts unten)
Knochen und Haut/Muskel
(Ansicht von rechts)

Download

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