LU Visualisierung - Beispiel 1

Volume Ray-casting

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

Content:

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.

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:

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

Vis-Contest

Referenzen

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