LU Visualisierung WS 2005/2006 Beispiel 1
Volumensvisualisierung
Alexander Haberl 9402830
Helmut Zirknitzer 9820845
1. Aufgabenstellung und Überblick
Die erste Aufgabe war ein Programm zu entwickeln, das es ermöglicht aus Volumendatensätzen, mit Hilfe eines Raycasting Algorithmus Volumensvisualisierungen zu erzeugen. Als Vorlage diente das Paper "Display of Surfaces from Volume Data" von Marc Levoy.
Beim Raycasting wird durch jeden Pixel auf der Bildebene ein Strahl geschickt, der dann die Volumsdaten durchdringt und mit Hilfe von unterschiedlichen Algorithmen (First Hit, Compositing, MIP,…) den einzelnen Dichtewerten im Datensatz Farb- und Opazitätswerte zuordnet. Die Wahl der Programmiersprache und Implementierungsdetails blieben dabei vollständig den Studenten überlassen.
Wir haben unser Programm in C++ entwickelt, als IDE diente Microsoft Visual Studio 2003, das GUI wurde mit Qt 4.0.1 von Trolltech realisiert.
2. Programmfeatures
Abb. 1: Das GUI vor dem Öffnen eines Datensatzes
Abbildung 1. zeigt einen Screenshot des GUI. Nachdem das Programm gestartet wurde, kann man über das File-Menü einen Datensatz laden. Je nach Größe des Datensatzes kann das bis zu einer Minute dauern, da nach dem Laden der Dichtewerte auch noch für jedes Voxel ein Gradient berechnet und in einem Array gespeichert wird. Diese Gradienten werden als Normalvektoren für das Phong-Shading verwendet. Standardmäßig befindet sich das Programm nach dem Laden eines Datensatzes im Slice-Modus. In diesem Modus können Slices in den 3 Hauptrichtungen dargestellt werden. Die Slicedarstellung wurde mit Hilfe einer 3D-Textur in OpenGL realisiert. Mit den Radiobuttons am linken Rand des GUI wird die Achse (X,Y oder Z) ausgewählt, mit dem darunter liegenden Slider können die einzelnen Slices ausgewählt werden. Abbildung 2 zeigt ein Beispiel für eine Slicedarstellung.
Abb. 2: Ein Slice in Z-Richtung aus dem Lobster Datensatz
Wenn man den Slice-Modus deaktiviert befindet man sich im Raycasting Modus. Abb.3 zeigt das GUI im Raycasting-Modus.
Abb. 3: Das GUI im Raycasting–Modus
Im linken unteren Bereich des GUI befinden sich vier Radio-Buttons mit denen die Raycasting Methode ausgewählt wird:
· First Hit: Der erste Wert der von dem Strahl getroffen wird und über dem Threshold liegt wird dargestellt.
· Average: Es wird aus allen Dichtewerten die der Strahl trifft ein Durchschnitt berechnet. Diese Bilder ähneln Röntgenbildern.
· MIP: Maximum Intensity Projection; die Dichte mit dem höchsten Wert wird dargestellt, wird in der Medizin verwendet, um Blutgefäße die vorher mit Kontrastmittel versehen wurden, darzustellen.
· Compositing: Mit Hilfe einer Transferfunktion werden den Dichtewerten Opazität- und Farbwerte zugeordnet.
Rechts daneben befinden sich die Optionen für den Raycaster. Durch Klicken auf den Render-Button wird in einem separaten, frei skalierbaren Fenster das Bild dargestellt. Es ist auch möglich, die Step-Size (wie oft die Werte entlang des Strahls ausgewertet werden) sowie die Anzahl der Strahlen (je mehr Strahlen durch den Datensatz geschickt werden, desto höher ist die Auflösung des Bildes) einzustellen. Mit den drei Spin-Boxen darunter kann man den Datensatz um die drei Hauptachsen (X, Y und Z) rotieren. Die letzte Spinbox erlaubt es, den Threshold (ab welchen Dichtewert die Daten ausgewertet werden) einzustellen.
In der Mitte des GUI befindet sich das Histogramm, das die Häufigkeit von einzelnen Dichtewerten graphisch darstellt. Die Länge der Balken gibt die Anzahl der Dichtewerte an, die Position auf der X-Achse den Dichtewert, links liegt 0 und rechts 4095 (der höchste Wert in den Datensätzen, da nur 12 Bit pro Wert verwendet werden). Mit dem „Current Color“ Button, kann man nun eine Farbe auswählen und durch einen Klick mit der linken Maustaste im Histogramm einen bunten Punkt setzen. Es ist möglich, bis zu drei solcher Punkte zu setzen, die dann eine Transferfunktion wie folgt bestimmen: die Position des Punktes auf der X-Achse gibt den Dichtewert an, der die jeweilige Farbe bekommen soll, während die Position des Punktes auf der Y-Achse die Opazität des Dichtewertes bestimmt. Dabei liegt eine Opazität von 1 (total undurchsichtig) am oberen Rand des Histogramms und eine Opazität von 0 (total durchsichtig) am unteren Rand. Alle Werte die zwischen zwei Punkten liegen werden hinsichtlich ihrer Farbe und Opazität interpoliert. Mit Hilfe des „Delete Points“ Buttons können die Punkte wieder gelöscht werden und man kann eine neue Transferfunktion bestimmen.
Rechts vom Histogramm kann man das Phong Shading ein und ausschalten, sowie sämtliche Parameter (Ambient, Diffuse und Specular Anteil sowie die Richtung der Lichtquelle) verändern.
Abb. 4-6 zeigen einige Beispielbilder, die im Raycasting-Modus entstanden sind.
Abb. 4: Lobster mit semitransparenten Gliedmaßen
(Compositing)
Abb.5: Kopf mit semitransparenter Nase (Compositing)
Abb. 6: Kopf mit Phong-Shading (First Hit)
3.Download
Das Programm steht hier zum Download bereit (benötigt Qt 4.0.1!).