VisExercises

Exercise #02

Visualisierung Übungsblatt #02


Medical 3D Data: Implicit and Explicit Data



1. Präliminarien:

  • Installieren Sie das Qt-Framework.
  • Installieren Sie das Programm gnuplot (Paket gnuplot-x11).

2. OpenGL:
Übersetzen Sie das Framework und starten Sie das Hauptprogramm mit ./myqtapp -lgl. Dies zeichnet zwei rotierende Dreiecke analog zur CG-Übung #03.

Wireframe

Modifizieren Sie das Modul qlglwindow.cpp, so dass die Kanten eines Einheitswürfels als Wireframe gezeichnet werden (LGL_LINES). Der Urspung des lokalen Koordinatensystems des Würfels soll in dessen Zentrum liegen (Wertebereich: −0.5 bis 0.5).

Dieser Würfel ist für die folgenden Visualisierungsaufgaben die Einheits-Arbeitsbühne.

3. Implizite Daten:

Gnuplot
  • Gegeben sei die Function
$f(x,y)=x^2e^{-x^2}y^2e^{-y^2}$
  • Benutzen Sie gnuplot um die obige Funktion zu plotten:
set isosample 30
splot [-3:3][-3:3] x*x*exp(-x*x)*y*y*exp(-y*y)
  • Visualisieren Sie die folgende implizite Funktion $\vec{f}(\lambda)$ mit OpenGL:
$\vec{f}(\lambda) = (cos\pi\lambda,sin\pi\lambda,\frac13)^T\frac1{1+\lambda}, \lambda\in[1,10]$
  • Implementieren Sie eine Funktion vec3 f(double lambda), die einen 3D Punkt der Parameterkurve berechnet und zurückgibt.
  • Samplen Sie die Kurve in regelmäßigen Abständen im oben angegeben Definitionsbereich.
  • Benutzen Sie Liniensegmente von aufeinanderfolgenden Sample-Punkten, um die Kurve darzustellen (LGL_LINE_STRIP).
  • Optional: Färben Sie die Parameterkurve von Rot nach Blau (lin. Interpolation der Farbe mit normalisiertem $\lambda$ als Interpolationsfaktor).
  • Optional: Lassen Sie die Kurve um die Z-Achse rotieren → hypnotisch!
  • Dokumentieren Sie das Ergebnis mit einem Screenshot.
  • Programmierhilfe:
lglColor(r,g,b);
lglBegin(LGL_LINE_STRIP);
   for (double l=anfang; l<ende; l+=step)
      lglVertex(f(l));
lglEnd();

4. Explizite Daten:
Laden Sie einen 3D Datensatz, d.h. entweder eine DICOM-Serie oder ein PVM-Volumen aus den MedVis-Beispieldaten:

  • Dazu benutzen wir die Funktion readXYZvolume in initializeOpenGL wie folgt:
long long width, height, depth;
unsigned int components;
unsigned char *data =  readXYZvolume("path",
                                     &width, &height, &depth,
                                     &components);
  • Diese Funktion gibt einen Zeiger auf den geladenen Datenblock zurück.
    • Konnte der Datenblock nicht geladen werden, wird der NULL-Zeiger zurückgegeben.
  • Eine zu ladende DICOM-Serie wird als Pfad mit Wildcard * angeben. Als Endungen sind “.dcm” und “.IMA” gebräuchlich.
    • Ein Beispielpfad ist “Angio/*.IMA”
  • Ein zu ladendes PVM-Volumen wird als Dateipfad mit der Endung “.pvm” angeben.
    • Ein Beispielpfad ist “MR-Kiwi.pvm”
  • Der Pfad muss entweder absolut oder relativ zum Verzeichnis sein, in dem Sie Ihr Programm starten. Ansonsten wirden die Daten nicht gefunden und entsprechend ein NULL Zeiger zurückgegeben.
  • Stellen Sie daher als erstes sicher, dass Ihre Serie bzw. Ihr Volumen korrekt geladen wurde. Überprüfen Sie dazu, ob Sie den NULL-Zeiger als Datenblock erhalten haben und brechen Sie in diesem Fall Ihr Programm ab!
  • Andernfalls hat das Laden der Daten funktioniert und der zurückgegebene Datenblock liegt linear im Speicher vor. D.h. die Werte der ersten Zeile der ersten Schicht kommen zu erst, danach die zweite Zeile, die dritte Zeile usw.
  • Die Parameter width, height und depth entsprechen der jeweiligen Dimension des Volumens. Die Gesamtzahl der Voxelwerte ist daher width*height*depth.
  • Die Anzahl der Komponenten components eines jeden Voxels ist 1 für einen Datensatz, der 8-bit Voxelwerte enthält, und 2 für einen Datensatz, der 16-bit Werte in Form von jeweils zwei aufeinanderfolgenden Lo- und Hi-Bytes (LSB) enthält.

5. Quantisierung:
Um mit den Daten einfacher arbeiten zu können, normalisieren wir deren Wertebereich auf 8-bit. Dazu verwenden wir die Funktion normalizeVolume wie folgt:

data = normalizeVolume(data, width, height, depth, components);

6. Histogramm:

VIS-Histogram
  • Berechnen Sie nun das Histogramm Ihres normalisierten 8-bit Datensatzes, indem Sie das Vorkommen der jeweiligen 8-bit Voxelwerte in einer Tabelle der Größe 256 mitzählen.
  • Geben Sie anschließend die Werte der Tabelle aus!
  • Dokumentieren Sie den Skalarwert mit der höchsten Voxelanzahl.


Hausaufgaben:

  1. Funktionsplot:
    Gegeben sei die Funktion $f(x,y)=cos(4\sqrt{x^2+y^2}+atan2(x,y))\frac{1}{0.5+\sqrt{x^2+y^2}}$
    1. Können Sie Sich die Funktion vorstellen? Was für eine Form hat die implizite Parameterfläche vermutlich?
    2. Visualisieren Sie die Funktion mit gnuplot und überprüfen Sie Ihre Vermutung!
  2. Histogrammplot:
    1. Visualisieren Sie das Histogramm Ihres Datensatzes mit OpenGL als Funktionsplot!
    2. Das Histogram soll in einer Seitenfläche des Einheitswürfels zentriert dargestellt werden.

Options: