LU Visualisierung - Beispiel 1

Volume Ray-casting

Eduard Gröller, Andrej Varchola, Martin Ilcik,
Tutor: Thomas Mühlbacher (send mail)

Beispielbilder

Die Beispielbilder in Abbildung 1 sind mittels Ray-casting im Rahmen der VisLU entstanden.

Abbildung 1: Beispiele für Ray-casting Resultate. Von links nach rechts wurden die Datensätze "Lobster", "XMasTree" und "Skewed Head" verwendet.

Andere Beispiele für Bilder die mittels Ray-casting erzeugt wurden können bei den Ergebnissen der bisherigen Laborübungen gefunden werden.

Einleitung

Es soll ein Programm entwickelt werden, das Bilder aus Volumsdaten mittels Ray-casting berechnet. Die VisLU ist auf Volumsdaten beschränkt, die auf kartesischen dreidimensionalen Gittern gegeben sind. Diese Gitter werden zum Beispiel bei der Computertomographie erzeugt. Daher sind diese Daten und die dazugehörigen Visualisierungsmethoden ein wichtiger Bestandteil der modernen Medizin und werden im klinischen Alltag zur Diagnose, Operationsplanung u.ä. eingesetzt.
Ray-casting ist ein gebräuchliches Verfahren um ein Bild aus einem Volumsdatensatz zu berechnen ohne geometrische Primitive (Polygone, Trianglemeshes, etc.) aus den Volumsdaten zu generieren (solche Verfahren werden direct volume rendering Verfahren genannt). Um ein Bild mittels Ray-casting zu erzeugen wird pro Pixel ein Blickstrahl (ray) durch die Bildebene geworfen (casting). In Abbildung 2 ist die Idee von Ray-casting illustriert. Der Blickstrahl wird mit dem Volumen geschnitten. Das Gitter hat an den Voxelpositionen Informationen gespeichert (den Dichte-Wert). Entlang des Blickstrahls wird an diskreten Samplepositionen die Dichte ausgewertet (interpoliert) und mittels einer Transferfunktion in Farben und Transparenzwerte übersetzt. Jedes Sample hat also entsprechend der Transferfunktion eine Farbe und eine Transparenz. Der Gradient der (im Volumen gespeicherten) Dichtewerte wird verwendet um die Farbe zu schattieren. Die schattierten Farben (und die jeweils zugehörige Transparenzinformation) wird dann entsprechend der Compositing-Formel zu der endgültigen Pixelfarbe gemischt.
Der genaue Algorithmus ist im Paper "Display of Surfaces from Volume Data" von Marc Levoy [1] beschrieben.

Abbildung 2: Illustration von Volume Ray-casting. Ein Blickstrahl wird in das Volumen geworfen um die Farbe eines Pixels zu berechnen. Das Volumen wird an aufeinanderfolgenden Samplepositionen abgetastet.

Aufgabenstellung

Das Beispiel wird in zwei Phasen implementiert. Die erste Phase endet mit dem 1.Zwischengespräch, die zweite Phase mit der 1.Abgabe.
  • In der ersten Phase soll ein graphisches user interface (GUI) erstellt werden, das alle nötigen Komponenten enthält um die Parameter der Algorithmen einstellen zu können (auch die Transferfunktion soll schon einstellbar sein!). Weiters soll die Funktionalität, die einzelnen Schichten des Volumsdatensatzes in den drei Hauptrichtungen darstellen zu können, implementiert werden.

    Die Mindestanforderungen die das Programm bei der Zwischenabgabe erfüllen muss sind
    • GUI
    • Slicing entlang der drei Hauptachsen
    • Interaktive Transferfunktionen

  • In der zweiten Phase soll ein Ray-casting Algorithmus (wie er z.B. im Paper "Display of Surfaces from Volume Data" von Marc Levoy [1] beschrieben wird implementiert werden.

    Mindestanforderungen für die Endabgabe
    • Raycasting
    • Interaktive Einstellung der Blickrichtung
    • Halb transparente äußere Schicht (z.B. Haut) und undurchsichtigen innere Schicht (z.B. Knochen) sind zu erkennen.
    • Gradienten werden berechnet und für die Schattierung verwendet.
    • Resultatbilder für mindestens zwei verschiedene Datensätze sind vorhanden und reproduzierbar.

    "Extended Feature Set"
    • Maximum Intensity Projection
    • Progressive Refinement (für eine höhere Frame-Rate bei der Interaktion mit dem Volumen)
    • Adaptive Step Size (angepasst an die Opacity)
    • Pre- vs. Post-Shading (zeige Unterschied in der Qualität)
    • Perspective vs. Orthogonal Projection
    • Clipping plane (schneidet einen Teil des Volumens weg)
    • Advanced gradient computation (Berechnung des Gradienten mit komplexerer Methode als der Zentrale-Differenzen-Methode)
    • Pre-Integrated Volume Rendering

  • Bei der Abgabe werden Fragen gestellt, die das Verständnis der implementierten Techniken überprüfen. Nicht alle Fragestellungen werden im Paper behandelt. Es werden aber aussschließlich Fragen gestellt die in der Vorlesung behandelt wurden.
    Beispiele für mögliche Fragen sind:
    • Was sind die einzelnen Schritte beim Ray-casting um die endgültige Farbe eines Blickstrahls zu berechnen?
    • Wie wurden diese Schritte implementiert?
    • Wozu muss man die Dichtewerte interpolieren?
    • Wie werden die Dichtewerte interpoliert?

  • Zur Dokumentation des Programms sollen folgende Dateien und Dokumente erstellt werden:
    • Kompilierte Binaries
    • Quellcode + Dokumentation (z.B. Doxygen)
    • Eine Dokumentation des Programms in HTML. Um anderen Leuten die Möglichkeit zu geben das Programm auszuprobieren, soll ein Link auf das Programm zum downloaden enthalten sein.
    • Ein Bild mit möglichst hoher Auflösung für den Vis-Contest (s.u.)

Programmgerüst

Wir stellen ein einfaches Programmgerüst zur Verfügung das den Einstieg in das Programmieren erleichtern soll. Das vorliegende Programmgerüst ist in C++ mit Visual Studio erstellt und auch nur unter Windows getestet. Wir möchten noch einmal ausdrücklich darauf hinweisen, dass die Programmiersprache und das Betriebssystem frei gewählt werden können, wir den Beispielcode aber nur für die oben genannte Konfiguration zur Verfügung stellen.
Falls sie Visual Studio nicht besitzen können sie auch das kostenlos erhältliche Microsoft Visual C++ 2005 Express Edition verwenden. Bitte folgen sie dazu genau den Installationsanweisungen auf der zugehöringen Seite.

Das Programmgerüst zur VisLU kann hier heruntergeladen werden!

Zum Installieren gehen sie wie folgt vor:
  • Installieren sie Visual Studio 2005 (oder Microsoft Visual C++ 2005 Express Edition).
  • Entpacken sie das Programmgerüst zur VisLU.
  • Führen sie die darin enthaltene Datei projectsettings.bat aus (dadurch wird eine Projectsettings-Datei für ihren Computer erstellt).
  • Öffnen sie das Solution File (VisLuFramework.sln).
  • Kompilieren und ausführen.

Volums-Datensätze

Es sollen mindestens zwei der folgenden Datensätze verwendet werden um Ergebnisbilder zu erzeugen!
Alle Datensätze liegen in dem einfachen dat-Format vor. Die Dateien bestehen aus einem 6 Byte Header gefolgt von den eigentlichen Daten. Die ersten zwei Byte des Headers geben an wie groß das Volumen in x-Richtung ist, die folgenden zwei Byte geben an wie groß es in y-Richtung ist und die nächsten zwei Byte geben die Größe der z-Dimension an.
Die eigentlichen Daten sind als 16 Bit pro Datenwert gespeichert wobei nur 12 Bit in Verwendung sind. Eine Funktion zum Laden eines Datensatzes sieht konzeptionell also zum Beispiel so aus:

load(String filename)
{
File fp = openfile(filename);
Byte2 sizeX, sizeY, sizeZ;

sizeX = readfile(sizeof(Byte2),fp);
sizeY = readfile(sizeof(Byte2),fp);
sizeZ = readfile(sizeof(Byte2),fp);

UnsignedShort data[sizeX][sizeY][sizeZ];

for(Integer z=0; z < sizeZ; z++)
{
//open the file
//declare variables for header information
//read header



//allocate memory for data

//iterate over the volume
for(Integer y=0; y < sizeY; y++)
{
for(Integer x=0; x < sizeX; x++)
{
data[x][y][z] = readfile(sizeof(Byte2),fp); //fill data structure
}
}
}
}

Achtung!!! Abhängig vom Prozessor bzw. von der Programmiersprache muß u.U. die Byte-Order vertauscht werden! z.B. mit:
#define SWAP_16(s) ( ((s) >> 8) | ((s) << 8) )

Folgende Datensätze stehen für die VisLU zur Verfügung:

Hidden-feature Datensatz Der SkewedHead-Datensatz wurde etwas modifiziert um ein paar Features darin zu verstecken.
Stag Beetle (ca. 1MB) CT-scan von einem Hirschkäfer. Volumengröße: x=277, y=277, z=164 Voxels. Mehr Informationen über den stagbeetle und Datensätze in anderen Auflösungen kann man auf der Stagbeetle Homepage finden.
Lobster (ca. 100KB) CT-scan von einem Hummer. Der Lobster Datensatz hat folgende Größe: x=120, y=120, z=34. Auf Grund seiner geringen Größe eignet sich der Lobster Datensatz sehr gut zum Testen!
Skewed Head (ca. 9MB) Der CT-scan eines menschlichen Kopfes. Der Datensatz hat folgende Größe: x=184 y=256 z=170
XMasTree (ca. 10MB) CT-scan von einem geschmückten Weihnachtsbaum. Die Größe des Volumens ist x=256 y=256 z=249. XMasTree Datensätze in höherer Auflösung sowie mehr Informationen über den XMasTree kann man auf der XMasTree Homepage finden.
Christmas Present (ca. 10MB) CT-scan von einem Weihnachtsgeschenk. Die Größe des Volumens ist x=246 y=246 z=221. Das Innere des Weihnachtsgeschenks darf mit geeigneten Volumerenderings ausnahmsweise auch schon vor Weihnachten angeschaut werden.
Hurricane Isabel (ca. 4MB) Simulation des Hurricane Isabel. Erstellt wurde dieser Datensatz durch eine Simulation am National Center for Atmospheric Research. Insgesamt umfasst er ca 60GB an Daten die über 48 Zeitschritte hinweg den Hurricane Isabel aus dem Jahr 2003 in mehreren Attributen (Windrichting, Luftfeuchtigkeit, Temperatur, Druck und vielen mehr) darstellen. Der Datensatz der in der VisLU verwendet wird zeigt nur einen Zeitschritt und besitzt nur ein Attribut, das wie ein Dichtewert verwendet werden kann.


Die Datensätze dürfen im Rahmen der VisLU verwendet werden aber nicht weiter gegeben werden!

Abgabe

  • Kompilierte Binaries
  • Der Quellcode + Dokumentation (Doxygen)
  • Eine Dokumentation des Programms in HTML. Um anderen Leuten die Möglichkeit zu geben das Programm auszuprobieren, soll ein Link auf das Programm zum downloaden enthalten sein
  • Ein Bild mit möglichst hoher Auflösung für Vis-Contest (s.u.)

Vis-Contest

  • Bei der Präsentation des 1. Beispiels wird das schönste Bild gewählt und der/die Gewinner mit einem Preis belohnt.

Referenzen

[1] Marc Levoy, "Display of Surfaces from Volume Data", IEEE Computer Graphics and Applications, Vol. 8(3), pp. 29-37, Feb.1987