VisExercises

VIS Exercise #02

Visualisierung ├ťbungsblatt #02


Medical 3D Data: Implicit and Explicit Data



1. Pr├Ąliminarien:

  • Installieren Sie das VIS 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;
int msb;

unsigned char *data =  readXYZvolume("path",
                                     &width, &height, &depth,
                                     &components,
                                     &msb);
  • 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, msb);

6. Histogramm:

VIS-Histogram
  • Wir berechnen 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: