Einleitung

Das erste Beispiel beschäftigt sich mit der Vorverarbeitung volumetrischer Daten. Für die spätere Visualisierung der Daten ist es notwendig, zusätzliche Informationen aus den ursprünglichen Daten abzuleiten. Außerdem wird im ersten Beispiel das Visualization Mapping behandelt, d.h. die Abbildung der vorliegenden Daten auf visuell leicht erfassbare Größen.

Beschreibung

In diesem Beispiel soll im ersten Schritt der Gradient aus den Daten extrahiert werden. Der Gradient beschreibt die Richtung der größten Änderung in den Datenwerten an einer bestimmten Stelle des Volumens. In der Visualisierung wird der Gradient benötigt um später die Visualisierung zu verbessern.
Die Berechnung der Gradienten kann im Allgemeinen auch als ein Filterprozess mittels Faltung gesehen werden. Es wird dabei aber ein spezieller Kernel verwendet welcher den Gradienten extrahiert. Ähnlich wie beim Smoothing gibt es auch beim Extrahieren der Gradienten verschiedene Methoden welche sich durch ihre Komplexität und der Qualität der Ergebnisse unterscheiden. In dieser Übung werden drei verschiedene Methoden behandelt:
  • Rückwärts-Differenzen-Methode
  • Zentral-Differenzen-Methode
  • Sobel Methode
In den einzelnen Aufgaben sollen einzelne Berechnungen für das Extrahieren der Gradienten implementiert werden. Als Ergebnis erhalten wir ein neues Volumen welches in vier Komponenten den Datenwert (evtl. mit Smoothing) und die drei Vektorkomponenten des Gradienten enthält.
Im zweiten Schritt dieses Beispiels sollen die Gradientenwerte auf visuell erfassbare Objekte abgebildet werden. Solche Objekte können beliebige geometrische Objekte sein, anhand deren Form und/oder Farbe die Eigenschaften der Gradienten sichtbar werden. Die folgenden Bilder zeigen, wie das für einen Schädel-Datensatz etwa aussehen könnte:

Plugin

Der Code zum Berechnen der Gradienten (TODO 1/2) befindet sich im Projekt plugin_editor_vislabfilterexercise, in der Datei EditorVislabFilterExcercise.cpp.
Der Code zum Rendern der geometrischen Objekte (TODO 3) befindet sich im Projekt plugin_renderer_vislabglyphexercise, in der Datei RendererVisLabGlyphExercise.cpp (bzw. auch plugin_renderer_vislabglyphexercise.glsl, falls Shaderprogrammierung verwendet wird).

Programmieraufgaben

TODO Beschreibung
1
Gradient mittels Central-Differences
Hier sollen die Gradienten im Volumen mittels der Zentralen-Differenzen-Methode (central difference) berechnet werden. An der jetzigen Stelle für diese Berechnung im Code steht die Berechnung mittels der Rückwärts-Differenzen-Methode (backward difference). Diese soll so erweitert und verändert werden, dass anstatt der Rückwärts-Differenz die Zentral-Differenz für die Berechnung verwendet wird. Die Implementierung erfolgt in der Methode transform in der CentralDifferenceGradientFilter Klasse.
In der Übung ist das Volumen so definiert, dass jedes Voxel 4 Werte enthält. Mittels der Methode Get(int index) kann man auf einen dieser Werte zugreifen. Der Voxelwert mit dem Index 3 entält den (möglicherweise gefilterten) Datenwert. Die Voxelwerte mit den Indices von 0 bis 2 enthalten die drei verschiedenen Gradientenrichtungen (x, y und z). Diese sollen bei dieser Aufgabe neu berechnet werden.
Weitere Informationen zur Berechnung der Zentral-Differenz:
Allgemein (Wikipedia); Eindimensionaler und mehrdimensionaler Fall
2
Gradient mittels Sobel-Filter
Als zweite Methode für die Gradientenberechnung soll ein Sobel-Kernel implementiert werden. Diese Aufgabe soll in der Methode transform der Klasse SobelGradientFilter gelöst werden.
Weitere Informationen über den Sobel Operator:
Sobel Operator (Wikipedia)
3
Darstellung der Gradienten
Nun da wir die Gradienten berechnen konnten geht es darum, diese visuall darzustellen. Dazu gibt es verschiedenen Möglichkeiten, und Sie können selbst entscheiden, wie Sie diese Aufgabe lösen möchten.
In der Referenzlösung wird ein regelmäßiges Grid erzeugt, an dessen Positionen dann Spheres gerendert werden. Die Farbe der Spheres gibt den Dichtewert des Volumens an dieser Stelle an, und die Größe zeigt den Gradientenbetrag. Wieviele Spheres gerendert werden, wird durch den Parameter Glyph Density bestimmt. Der Parameter Glyph Threshold gibt an, wie hoch der Dichtewerte des Volumens an der Stelle sein muss, damit eine Sphere gerendert wird.
Sie können zum Lösen der Aufgabe die Gridpositionen verwenden, diese werden bereits im Code berechnet. Es bleibt dann Ihnen überlassen, welche Objekte Sie zum Darstellen der Glyphen verwenden möchten. Die Objekte müssen folgende zwei Parameter repräsentieren:
- den Gradientenbetrag und
- den Dichtewert des Volumens an der Stelle.
Die Aufgabe kann entweder im C++ Code gelöst werden (Datei RendererVisLabGlyphExercise.cpp), oder Sie können den vorbereiteten Shader dazu verwenden (Datei plugin_renderer_vislabglyphexercise.glsl). Der Shader wird momentan nicht geladen, dazu müssen die entsprechenden Codeteile einkommentiert werden. Weitere Hinweise befinden sich im C++ Code.

User Interface

Folgende GUI-Parameter stehen zur Verfügung:
Name Effekt Zeigt Auswirkungen
Auto-Recompute Wenn diese Option aktiviert ist wird eine Berechnung des gefilterten Volumens nach Änderung eines Parameters automatisch gestartet. Wenn es inaktiv ist, werden keine Berechnungen durchgeführt bis die Option wieder aktiviert wird. Der Fortschritt des Filterprozesses wird am unteren Rand in einer Progress-Bar dargestellt. immer
Gradient Filter Methode welche zur Berechnung der Gradienten verwendet wird. ab TODO 1
Smoothing Filter Methode welche zum Smoothen der Daten verwendet wird. Bei None werden die Eingangsdaten gar nicht geglättet. immer
Gaussian - Sigma Die Standardabweichung für den Gauß-Filter. Diese Option ist nur aktiv wenn Gaussian als Smoothing-Methode ausgewählt ist. immer
Bilateral - Sigma Domain Standardabweichung für die räumliche Domäne beim bilateralen Filtern. immer
Bilateral - Sigma Range Standardabweichung für den Intensitätsbereich beim bilateralen Filtern. immer
Glyph Density Die Anzahl der Glyphen, die gerendert werden soll. Je größer dieser Wert, desto kleiner werden die Glyphen (damit es keine Überlappung gibt). ab TODO 3
Glyph Threshold Der Schwellwert, den die Dichte übersteigen muss, damit ein Glyph angezeigt wird. ab TODO 3

Hinweis

Falls Probleme mit der Performance auftreten:
  • Glyph Density eher gering halten und den Threshold eher hoch.
  • Weiter Hinauszoomen, sodass im Endeffekt wesentlich weniger Pixel berechnet werden müssen.
  • Sollte beim Nachladen des Shaders der Grafikkartentreiber abstürzen, die Reference-Lösung stattdessen aktivieren, das Beispiel kompilieren, und dann erst wieder die Exercise aktivieren.