Volume Rendering in a Nutshell
by Thomas Lidy

Introduction

Bei Volume Rendering handelt es sich – wie der Name schon sagt – um eine Technik zur Darstellung von dreidimensionalen Volumsdaten. Ein Hauptgebiet von Volume Rendering sind zum Beispiel medizinische Anwendungen, in denen ein Computertomograph (CT) dreidimensionale Daten eines Patienten liefert. Volume Rendering wird aber etwa auch für die Darstellung von sogenannten "Isovalue Contour Surfaces" zur Bestimmung der (Elektronen-)Struktur großer Moleküle verwendet.

In anderen Rendering-Techniken, die häufig zum Visualisieren von Daten verwendet werden, wird versucht, geometrische Primitivobjekte auf die Oberflächen der Daten aufzubringen, und diese dann zu rendern. Natürlich müssen diese Oberflächen in den Volumsdaten erst durch bestimmte Algorithmen gefunden werden und das Ergebnis hängt zum Großteil von diesen Algorithmen und der Größe und Position der Primitive ab. Dies ist nicht optimal. Ein weiteres Problem sind binäre Entscheidungen bei der Klassifizierung - entweder eine Oberfläche ist sichtbar, oder nicht – was zu "falschen" Oberflächen oder fehlerhaften "Löchern" führen kann.

Volume Rendering (bzw. Ray Casting) vermeidet diese Probleme von vornherein, da die Daten nicht erst in geometrische Primitive umgewandelt werden. Stattdessen werden alle Datenpunkte (voxels; volume elements) direkt "geshadet" und auf die Bildebene des Betrachters projiziert. Das Fehlen geometrischer Flächen stellt kein Problem dar – im Gegenteil: erst durch diese Methode wird es auch möglich – wie etwa bei medizinischen Anwendungen – flüssige Stoffe und halbtransparentes Gewebe darzustellen.

Ein weiterer Vorteil ist, daß die Classification der Volumsdaten und das Shading getrennt voneinander durchgeführt werden können, was auch aus der Rendering Pipeline ersichtlich ist. Dies bedeutet, daß das Shading Modell von der Classification der Daten unabhängig ist.

Die Rendering Pipeline

Die Ausgangsdaten bestehen aus Werten zu jedem Punkt xi im 3dimensionalen Raum:

xi = (xi, yj, zk), Ausgangsdaten: f0(xi)

Bevor Shading oder Classification durchgeführt wird, müssen die Daten meist noch für die Anwendung entsprechend vorbereitet werden, wie der Schritt Data Preparation in Abb. 1 zeigt. Dies beinhaltet zB. eine Korrektur der Daten, falls sich der Patient bei einem CT-Scan bewegt hat, oder eine Kontrastverbesserung, etc. Danach liegen die präparierten Werte f1(xi) vor. Diese dienen nun als Basis für ein Shading Modell, sowie – in einem separaten Schritt – zur Classification der Werte in Klassen mit verschiedenen Opacities (Durchlässigkeit bzw. Deckkraft der verschiedenen Schichten).


Abbildung 1: Rendering Pipeline

Anschließend erfolgt der Ray Casting Vorgang: Dabei werden vom Ausgangspunkt des Betrachters "Strahlen" in das Daten-Array geworfen, und dabei für jeden Strahl aus den Ergebnisfarbwerten c(xi) (aus dem Shading) und den Opacities a(xi) ein Vektor berechnet. Der Vektor kommt durch Resampling der voxel-Daten an Punkten mit gleichmäßigen Abstand entlang des Strahles und Interpolierung der Farben und Opacities der 8 (räumlich) nächsten voxels zustande. (Der Hintergrund bekommt dabei eine Farbe mit voller Opacity.) Die Farbwerte und Opacities setzen sich also sukzessive in der Reihenfolge back-to-front zusammen und das Ergebnis ist ein einzelner Farbwert für den Strahl und somit für den Bildpunkt ui = (ui, vj). Die Formel für die Zusammensetzung der Farbwerte lautet wie folgt:

Cout(ui) = Cin(ui) (1 – a(xi)) + c(xi)a(xi)

Shading

Für das Shading in der Rendering Pipeline können unterschiedliche Shading Modelle verwendet werden. Ziel des Shadings ist es, aus den Volumsdaten korrekte Farbwerte zu erhalten, die die 3D-Daten als zweidimensionale Abbildung mit räumlichem Eindruck darstellen. Wie bereits erwähnt, läuft das Shading unabhängig von der Berechnung der Opacities ab.

Jedem voxel data wird ein local gradient zugewiesen, um so etwas wie eine "Voxel Normale" zu erhalten. Diese "Normale" wird dann als Ausgangspunkt für ein Standard Shading Modell verwendet, um eine Intensität zu erhalten. Hier wird das Phong Modell verwendet, das eine relativ realistische Darstellung ermöglicht. Das Ergebnis ist ein 3 Komponenten Intensitätsfarbwert für jedes voxel.

c(xi) = cp ka + ( cp/(k1 + k2d(xi)) ) [ kd (N(xi).L) + ks (N(xi).H)n]

Die Parameter sind folgende:
c(xi) = Farbe bei voxel location xi (jeweils R, G und B Werte)
cp = Farbe der parallelen Lichtquelle
ka, kd, ks = Koeffizienten für ambient, diffuse und specular Reflection
k1, k2 = Konstanten für Depth-Cueing
d(xi) = (lotrechter) Abstand von der Bildebene zur voxel location xi
N(xi) = Oberflächen-Normale bei voxel location xi
L = normalisierter Vektor in Richtung Lichtquelle
H = normalisierter Vektor in Richtung maximales Highlight
n = Exponent zur Approximierung des Highlights

Aufgrund der Verwendung von parallelem Licht ist L eine Konstante. Die Oberflächen-Normalen werden durch

berechnet, wobei der gradient vector wie folgt approximiert wird:

Classification

Bei der Klassifizierung der Oberflächen wird den Ausgangs-Volumsdaten ein Opacity-Wert zugeordnet. Im Falle der medizinischen Anwendung erhalten z.B. die unterschiedlichen Gewebestrukturen (wie Knochen, Blutgefäße, Haut) unterschiedliche Opacities um eine für Mediziner geeignete Darstellung zu erhalten, in der sie die Gewebestrukturen, die von Interesse sind, betrachten können.

Wir gehen bei der Beschreibung des Algorithmus von einem vereinfachten anatomischen Modell, erhalten durch einen CT-Scan, aus. Wir nehmen an, daß die verschiedenen Gewebearten jeweils CT-Werte haben, die in einen kleinen Bereich um einen bestimmten Wert fallen. Weiters nehmen wir an, daß ein Gewebe maximal an 2 unterschiedliche andere Gewebearten angrenzt. Außerdem wird angenommen, daß bei einer Sortierung der Gewebestrukturen nach ihrem CT-Wert angrenzende Gewebearten auch angrenzende CT-Nummern haben.
Bei Einhaltung dieser Kriterien kann jeder Gewebeart einfach ein Opacity-Wert zugewiesen werden. Mit einer stückweise linearen Abbildung wird jedem voxel Wert fvn eine Opacity avn zugeweisen, dem voxel Wert fvn+1 die Opacity avn+1, usw. und dazwischen liegende voxels erhalten dazwischen liegende (interpolierte) Opacity-Werte. Auf diese Weise erhalten alle voxels eine Opacity verschieden von null und tragen zum endgültigen Bild bei. Das heißt, daß auch extrem dünne Gewebestrukturen im fertigen Bild noch sichtbar sind.

Durch die übereinanderliegende Darstellung von mehreren halbtransparenten Gewebeschichten (Haut, Blutgefäße, etc.) kann eine sehr verständliche Darstellung eines CT-Scans gegeben werden. Beim Volume Rendering sollten daher vor allem die Oberflächen der Ränder der Gewebeschichten hervorgehoben werden (während die inneren Schichten eine geringere Opacity erhalten). Dies wird durch Skalierung der zuvor berechneten Opacity-Werte um die Magnitude des lokalen gradient vector erreicht. (Für die Berechnung des gradient vectors siehe Abschnitt "Shading"):

Zusätzliche Informationen

Details zum Volume Rendering Algorithmus sowie Beispielbilder können in [1] gefunden werden. Hier wird auch beschrieben, wie die Bildqualität des Ergebnisses durch Blurring und Supersampling verbessert werden kann. In letzterem Fall werden entweder vor dem Ray Casting oder bereits bei der Data Preparation zusäztliche Sample-Werte zu den vorhandenen Werten interpoliert. Dies bedeutet natürlich erhöhten Rechenaufwand, verbessert aber die Genauigkeit beim Shading und der Classification und erhöht somit die Darstellungsqualität.
Optimierungen zum Ray Casting können u.a. auch in [2] gefunden werden. Weitere Informationen zur Volume Visualization sind in [4] zu finden. Für Details zum Phong Shading Modell siehe [3].

Quellenangaben, Literaturhinweise:

  1. Marc Levoy, "Volume Rendering – Display of Surfaces from Volume Data", May 1988
  2. John Pawasauskas, "Volume Visualization With Ray Casting", Feb. 1997
    http://www.cs.wpi.edu/~matt/courses/cs563/talks/powwie/p1/ray-cast.htm
  3. Hearn, Baker, "Computer Graphics – C version", 2nd edition, 1997, Chapter 14
  4. A.R. Smith, "Volume Graphics and Volume Visualization: A Tutorial", Pixar Inc, 1987

Thomas Lidy – Okt. 2001 – Vienna University of Technology - 9825862