Volumsvisualisierung
Die Volumsvisualisierung stellt eine der drei fundamentalen Säulen der wissenschaftlichen Visualisierung dar. Vor allem durch die immer leistungsfähiger und schneller werdende Hardware gewinnt sie zunehmends in der Echtzeit-Visualisierung medizinischer Datensätze an Bedeutung. Im Bereich der Medizin ist es dem Arzt somit unmittelbar nach der Erhebung der volumetrischen Patientendaten möglich, diese in einer visuellen und interaktiven Art auszuwerten. Die Erhebung der Daten erfolgt dabei meist mittels computed tomography oder magnet resonanz tomography.
Unsere Aufgabe war es deshalb im Rahmen der Laborübung zu Visualisierung (WS 2007/08) eine entsprechende Anwendung zur Volumsvisualisierung zu erstellen. Hauptziel hierbei war vor allem die Anwendung von einschlägigen Verfahren der Computergraphik, welche sich in der Praxis bereits zur Volumsvisualisierung sehr gut geschlagen haben.
Implementiert wurden deshalb sowohl 2D, als auch 3D Verfahren zur Visualisierung der mittels CT gewonnenen und somit auf einem regelmäßigen Grid aufgetragenen Patientendaten.
-
Slicing
Verfahren im 2D-Raum. Hierbei werden die Dichtedaten (3D) schichtenweise durchgegangen und farbcodiert (Farbcodes können über eine Transferfunktion festgelegt werden) angezeigt. Dies ist ein schon alt bewehrtes Verfahren, bei dem der Arzt praktisch die Röntgenbilder der einzelnen Schichtaufnahmen „durchblättert“.
-
ray casting
Hierunter versteht man ein leistungsfähiges Verfahren zur Rekonstruktion von Volumsdaten in 3D-Modelle. Für viele Zwecke ist dies eine effizientere Darstellungsform, da der allgemeine Zusammenhang (Focus+Context Prinzip) erhalten bleibt. Meist ist der Arzt nicht direkt an den einzelnen Schichtbildern interessiert, sondern an der Darstellung und selektiven Hervorhebung von Gewebeschichten. Hierfür ist Ray-Casting ein ideales Werkzeug!
Im nachfolgenden finden Sie eine Beschreibung/Dokumentation der von uns entwickelten Anwendung.
User Interface
Unser Ziel war es die Benutzeroberfläche (Abbildung 1) so spontan und intuitiv wie möglich zu halten. Deshalb haben wir uns entschieden nur die am häufigsten benötigten Steuerelemente im Hauptinterface zu platzieren. Alle erweiterten und funktionsspezifischen Einstellungsmöglichkeiten haben wir daher in eigene Sub-Fenster ausgegliedert.
Abbildung 1 zeigt unser Hauptinterface. Der obere Bereich dient hierbei rein als Anzeigefläche für die gerenderten volumetrischen Daten. Im unteren Bereich des Fensters befinden sich die Navigations- und Einstellungsmöglichkeiten, durch die eine einfache und intuitive Bedienung möglich gemacht werden soll.
(Abbildung 1)
Standardmäßig startet unsere Anwendung im bereits oben beschriebenen Slicing-Modus. Hierbei kann der
Benutzer die Volumsdaten mit dem Translations-Steuerelement „a“ schichtenweise durchiterieren. Weiters
lassen sich für den Slicing-Modus wichtige Parameter wie Slicinggeschwindigkeit „b“ und Slicingrichtung
„c“ über das Benutzerinterface verändern.
Slicinggeschwindigkeit: Die Slicinggeschwindigkeit legt dabei fest, wie schnell
durch die einzelnen Schichten (Röntgenbilder) navigiert werden soll. Sprich hiermit kann die Sensibilität
des Translations-Steuerelementes „a“ beeinflußt werden.
Slicingrichtung: Diese legt die Seite fest, von welcher aus orthogonal durch
die Volumsdaten navigiert werden soll.
Eine weitere wichtige Einstellungsmöglichkeit ist die verwendete Interpolationsart („d“). Hierbei können folgende Einstellungen getroffen werden:
-
Nearest Neighbour
Hier erfolgt praktisch die einfachste Art der Interpolation. Sie zieht für einen Dichtewert die nächstliegende Farbcodierung heran. Dadurch entstehen harte Übergänge zwischen den einzelnen Regionen. Abbildung 2 zeigt ein Beispielbild für Nearest Neighbour Interpolation.
(Abbildung 2) -
Lineare Interpolation
Die Lineare Interpolation hingegen schafft kontinuierliche Übergänge zwischen den einzelnen Regionen. Ein Dichtewert wird dabei mit einer linearen Gewichtung der beiden nächstliegenden Farbwerte der Transferfunktion farbkodiert. Abbildung 3 zeigt ein Beispielbild für Lineare Interpolation.
(Abbildung 3) -
Gradientenbild
Das Gradientenbild ist eher wenig aussagekräftig und hebt (nur im 2D wirklich gut ersichtlich) die Übergänge zwischen den einzelnen Dichtewerten hervor. Abbildung 4 zeigt Slicing mit dem Gradientenbild.
(Abbildung 4)
Wie bereits erwähnt, haben wir sämtliche erweiterten funktionsspezifischen Einstellungsmöglichkeiten in speziellen Dialogen zusammengefaßt. Somit gibt es ein eigene Einstellungsdialoge für:
-
Transferfunktion
Sämtliche Einstellungen der Transferfunktion lassen sich über den Transferfunktionsdialog ändern. Dieser öffnet sich durch Betätigung der Schaltfläche Transfer Func. („e“) im Hauptinterface. Wie in Abbildung 5 ersichtlich befindet sich im oberen Teil des Transferfunktionsdialoges ein Histogramm des aktuell geladenen Volumsdatensatzes, mit dessen Hilfe das Auffinden von Gewebetypen für spezifischen Dichtewerten erleichtert werden soll. Durch einfaches Klicken im Histogramm mit der linken Maustaste können neue Stützstellen für die Transferfunktion definiert werden. Standardmäßig besitzt die neu eingefügt Stützstelle eine schwarze Farbcodierung. Möchte man die Farbzuordnungen ändern, so muß man lediglich die Maus über den jeweiligen Punk im Histogramm bewegen, um ihn als „aktiv“ zu markieren. Im unteren Abschnitt des Transferfunktionsdialoges läßt sich nun die Farbzuordnung der „aktiven“ Stützstelle ändern. Abbildung 4 zeigt eine Illustration des Transferfunktionsdialoges:
(Abbildung 5) -
Beleuchtung
Im Beleuchtungsdialog lassen sich sämtliche für die Standardlichtquelle relevanten Einstellungen ändern. Unser Konzept beruht darauf, dass unsere gerenderte „Szene“ von einer Lichtquelle bestrahlt wird, dessen ausgestrahltes Licht sich aus den folgenden Komponenten zusammensetzt:
Ambient Light: konstante Hintergrundbeleuchtung (diese ist überall auf dem Objekt gleichmäßig stark).
Diffuse Light: Simuliert das durch die Position der Lichtquelle abhängige Shading. Dadurch werden Unebenheiten der Oberfläche für den Betrachter sichtbar. Hierdurch werden die einzelnen geometrischen Feinstrukturen auf einer homogenen Oberfläche, wie z.B. am Schädelknochen, hervorgehoben.
Specular Light: Hier wird der Glanz (Glanzpunkt) der Oberfläche simuliert! Weiters kann den Cosinusexponent für die breite des Lichtkegels einstellen
Außerdem läßt sich im Beleuchtungsdialog die Position der Lichtquelle leicht verändern.
(Abbildung 6)
Bevor wir nun zu den für das RayCasting wichtigen Einstellungen vordringen, wollen wir beschreiben wie man überhaupt einen Datensatz in die Anwendung laden kann. Hierfür kann man entweder das Programm direkt mittels Angabe eines Parameters, welcher den Dateinamen spezifiziert, starten oder den Datensatz aus der Benutzeroberfläche laden.
Übergabeparameter: Der mittels folgendem Übergabeparameter spezifizierte Datensatz, wird sofort beim Start der Anwendung geladen.
-datafile "URL"
Datensatz über Benutzeroberfläche laden: Hierfür muss sich der zu ladende Datensatz im Unterordner „./dat/“, welcher im selben Verzeichnis wie die Ausführbare Datei liegen muß, befinden. Sämtliche Datensätze aus diesem Verzeichnis, lassen sich jederzeit über die Combobox („f“) in das Programm laden.
Wie kommt man nun zu einer schönen dreidimensionalen Visualisierung der angegebenen Volumsdaten? Ganz einfach, man muß lediglich den Programm-Modus, mittels der Kontrollbox „enable volume rendering“ („g“) von Slicing auf auf Volume-Rendering ändern. In diesem Modus kann man nun folgende RayCasting spezifischen Parameter festlegen (bzw. zeigt erst jetzt eine Änderung dieser Parameter „h-i“ Wirkung):
-
step ray casting
dieser Parameter legt die Anzahl der Samples pro Lichtstrahl, welcher von einem Pixel aus durch die Szene geschossen wird, fest.
-
rotate
Dies ist wohl eines der für Volume-Rendering wichtigsten Steuerelemente. Durch Drehen des Rotate-Balles, kann der geladene Datensatz gedreht werden.
-
render type
Unter der Optionsgruppe Render-Type ("h"), kann vom Benutzer die für den aktuellen Verwendungszweck relevante Ray-Casting Variante ausgewählt werden. Hierfür kann er aus folgenden Optionen wählen:
- Compositing: Die in der Transferfunktion festgelegten Farbwerte, werden ihrer Opacity entsprechend aufakkumuliert.
- ISO-Surfaces: Diese Option entspricht praktisch dem first hit Prinzip. Es wird jene ISO-Oberfläche gerendert, welche dem (in "i") definierten ISO-Wert widerspiegelt. Nähere Einstellungsmöglichkeiten hierzu können unter der im Folgenden beschriebenen Option (iso value) vorgenommen werden.
- maximum intensity: Es werden jene Farbwerte gerendert, welche das Maximum der vorkommenden Gewebsdichte widerspiegeln.
-
iso value
Diese Option dient der näheren Konfiguration für Ray-Casting von ISO-Surfaces. Hier kann festgelegt werden, welche Dichtewerte zur Extrahierung der ISO-Oberflächen herangezogen werden.