Klausur WS 2025/2026 - Lösungen
Vollständig gelöste Original-Altklausur "Visual Computing" (HS Darmstadt, Frömmer & Hergenröther, WS 2025/2026). Aufgabenstellungen sind originalgetreu wiedergegeben, die Lösungen ausklappbar mit Rechenweg, Begründung und Kapitelbezug. Original-PDF unter Originaldateien.
Hinweise zur Klausur: 90 Minuten, erlaubt sind ein nicht-programmierbarer Taschenrechner und ein beschriebenes DIN-A4-Blatt.
Hinweis (Unstimmigkeiten in der Original-Klausur): In der Klausur gibt es zwei Aufgaben mit der Nummer "4" (Beleuchtung nach Phong und Bilineare Interpolation). Außerdem tragen die Bilder in Aufgabe 1 oben links die Beschriftung "CMYK", obwohl die Aufgabe RGB und HSV behandelt (die dargestellten Farben Gelb/Magenta/Cyan sind zwar die CMY-Primaerfarben, zerlegt werden die Bilder aber nach RGB bzw. HSV). Diese Punkte sind unten jeweils gekennzeichnet.
1. Aufgabe: RGB und HSV Farbmodelle (13 %)
Drei überlappende Farbkreise (oben Gelb, unten links Magenta, unten rechts Cyan) auf weißem Hintergrund, einmal in den RGB- und einmal in den HSV-Farbraum zerlegt. Je drei Grauwertbilder gehören zusammen. Tipp: Weiß = Maximalwert, Schwarz = Minimalwert.

Teil a (4 %): Entscheiden Sie begründet, welche Bildreihe zu welchem Farbraum passt. Teil b (9 %): Ordnen Sie jedem Bild (Reihen A/B, Spalten a-c) den entsprechenden Farbkanal zu. Begründen Sie.
Lösung anzeigen
Vorüberlegung - die Farben als RGB-Tripel (Überlappung wirkt subtraktiv, weil die Sekundärfarben Rot/Grün/Blau und in der Mitte Schwarz entstehen):
| Region | Farbe | (R, G, B) |
|---|---|---|
| Hintergrund | Weiß | (1, 1, 1) |
| oben | Gelb | (1, 1, 0) |
| unten links | Magenta | (1, 0, 1) |
| unten rechts | Cyan | (0, 1, 1) |
| Gelb ∩ Magenta | Rot | (1, 0, 0) |
| Gelb ∩ Cyan | Grün | (0, 1, 0) |
| Magenta ∩ Cyan | Blau | (0, 0, 1) |
| Mitte (alle drei) | Schwarz | (0, 0, 0) |
Teil a: Reihe B = RGB, Reihe A = HSV.
Entscheidend ist der Hintergrund (Weiß). In RGB ist Weiß in jedem Kanal der Maximalwert, also sind in einer RGB-Zerlegung alle drei Kanalbilder mit weißem Hintergrund. Genau das zeigt Reihe B (alle drei mit hellem Hintergrund) -> RGB.
In HSV gilt für Weiß: V = 1 (max, weiß), S = 0 (min, schwarz), H undefiniert (als 0 dargestellt, schwarz). Die drei HSV-Kanalbilder haben also unterschiedliche Hintergründe: einer weiß (V), zwei schwarz (S und H). Genau das zeigt Reihe A (ein Bild mit weißem, zwei mit schwarzem Hintergrund) -> HSV.
Teil b: Zuordnung der Kanäle
Reihe B (RGB): Ein Kanal ist dort dunkel, wo seine Komponente 0 ist.
- B a) = Grün (G): dunkel bei Magenta (unten links), da Magenta G = 0.
- B b) = Blau (B): dunkel bei Gelb (oben), da Gelb B = 0.
- B c) = Rot (R): dunkel bei Cyan (unten rechts), da Cyan R = 0.
Reihe A (HSV):
- A a) = Value (V) = max(R,G,B): überall 1 (weiß), nur die Mitte (Schwarz) ist 0 -> weißes Bild mit dunklem Zentrum.
- A c) = Saturation (S): Hintergrund (Weiß) und Mitte (Schwarz) sind unbunt -> S = 0 (schwarz); alle bunten Kreise sind voll gesättigt -> S = 1 (weiß). Also schwarzer Hintergrund mit gleichmäßig weißen Kreisen.
- A b) = Hue (H): die bunten Regionen haben verschiedene Farbtöne (Winkel auf dem Farbkreis) -> unterschiedliche Grauwerte; unbunte Regionen (Weiß, Schwarz) haben undefinierten Farbton.
Kapitelbezug: Kapitel 10: Farbräume, Kapitel 3: Farben und Primitive.
Typischer Fehler: V mit einem der bunten Kanäle verwechseln. Merke: Bei diesen voll gesättigten Farben ist V fast überall 1, es "verschwindet" nur die schwarze Mitte.
Hinweis (Unstimmigkeit): Die "CMYK"-Beschriftung in den Bildern ist irreführend - die Zerlegung erfolgt nach RGB bzw. HSV, nicht nach CMYK. Vermutlich ein Rest aus einer Bilddatei.
2. Aufgabe: OpenGL Shader (19 %)
// Vertex Shader
#version 330
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec3 vertex_normal;
layout(location = 2) in vec3 vertex_color;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projMatrix;
out vec3 colorVS;
void main() {
gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1.0);
colorVS = vertex_color;
}
// Fragment Shader
#version 330
in vec3 colorVS;
out vec4 color;
void main() {
color = vec4(colorVS, 1.0);
}
a (3 %): Worauf verweisen die layout(location = index) Einträge?
b (3 %): Was ist eine uniform Variable, wozu wird sie verwendet?
c (3 %): Wozu wird der Variablentyp out verwendet?
d (10 %): Lückentext ausfüllen.
e (3 %): Parameter von gluLookAt(ax,ay,az, bx,by,bz, cx,cy,cz).
f (3 %): Wirkung von glEnable(GL_DEPTH_TEST), glDepthFunc(GL_LESS), glClearDepth(1.0).
Lösung anzeigen
a) Der index in layout(location = index) gibt die Attribut-Position (Vertex Attribute Index) an, aus der das Attribut im VAO/VBO gelesen wird. Er entspricht dem index in glVertexAttribPointer(index, ...) bzw. glEnableVertexAttribArray(index). Hier: 0 = Position, 1 = Normale, 2 = Farbe.
b) Eine uniform Variable ist eine globale, für alle Vertices/Fragmente eines Draw-Calls konstante, nur lesbare Eingabe, die von der CPU-Seite mit glUniform* / glUniformMatrix*fv gesetzt wird. Verwendung z.B. für Transformationsmatrizen (Model/View/Projection), Lichtparameter, Zeit.
c) out deklariert eine Ausgabevariable, die an die nächste Pipeline-Stufe weitergereicht wird (Vertex-Shader out -> Fragment-Shader in). Die Werte werden bei der Rasterisierung über das Primitiv interpoliert (hier: die Vertexfarbe wird über das Dreieck interpoliert).
d) Lückentext: Der Vertex-Shader bekommt zusätzlich drei vier-dimensionale (4x4-) Matrizen, die die Modell-Transformationen sowie die View- und die Projektions-Matrix enthalten. Er berechnet die finale Vertex-Position und gibt außerdem die Farbe des Vertex weiter. Der Fragment-Shader wandelt einen Farbwert von einem 3-dimensionalen in einen 4-dimensionalen Vektor um, indem der Farbe ein Alpha-Wert hinzugefügt wird. Am Ende gibt er die finale Farbe des Fragments weiter.
e) gluLookAt definiert die View-Matrix über drei Vektoren:
- a = Augpunkt / Kameraposition (eye) - wo die Kamera steht.
- b = Blickpunkt / Zielpunkt (center) - wohin die Kamera schaut.
- c = Up-Vektor (up) - welche Richtung "oben" ist.
f)
glEnable(GL_DEPTH_TEST)schaltet den Tiefentest (z-Buffer-Test) ein.glDepthFunc(GL_LESS)legt fest, dass ein Fragment nur gezeichnet wird, wenn sein Tiefenwert kleiner (näher) als der gespeicherte ist.glClearDepth(1.0)setzt den Wert, mit dem der Tiefenpuffer beim Löschen gefüllt wird (1.0 = maximale/weiteste Entfernung).
Kapitelbezug: Kapitel 6: Shaderprogrammierung, Kapitel 7: Kameras, Kapitel 8: Rendering-Pipeline.
3. Aufgabe: Affine Transformationen (16 %)

Teil a (10 %): Tragen Sie in den Szenegraphen die nötigen Transformationen samt Parametern ein. Basiselemente: Kreis (Einheitskreis, r = 1) und Dreieck (Basis -1..1, Spitze (0,1)). Skalierung (1., 1.) ist unzulässig (keine Wirkung).
Lösung anzeigen
Die 2D-Szene besteht aus: großem Kreis (Radius 2, Zentrum Ursprung), kleinem Kreis (Radius 1, Zentrum (0,3)) und einem Dreieck oben links (gedreht).
- Großer Kreis: Einheitskreis (r=1) auf r=2 -> Skalierung(2, 2).
- Kleiner Kreis: Einheitskreis nach (0,3) -> Translation(0, 3).
- Dreieck: Spitze zeigt nach links statt nach oben -> Rotation(90°) (gegen den Uhrzeigersinn), zusätzlich Skalierung (Vergrößerung) und Translation an die Position oben links (ca. x = -3).
Da alle Blätter die Transformationen des Elternknotens Figur erben, werden gemeinsame Transformationen einmal oben im Baum notiert und wirken auf alle Kinder.
Hinweis (Figur-Interpretation): Die exakte Zuordnung "welche Transformation auf welchen Strich" hängt von der genauen Verdrahtung des gedruckten Graphen ab. Trage pro Strich genau eine wirksame Transformation ein und beachte den Tipp der Aufgabe: im Szenegraph werden die Transformationen von unten (Blatt) nach oben (Wurzel) ausgewertet, d.h. die zuletzt (weiter oben) eingetragene Transformation wirkt als äußerste. Die oben genannten Transformationen (Skalierung 2, Translation (0,3), Rotation 90° + Skalierung + Translation für das Dreieck) sind die inhaltlich notwendigen.
Kapitelbezug: Kapitel 5: Transformationen (Szenegraph, Vererbung, Reihenfolge).
Teil b (6 %): Wie lautet die Transformation M in homogenen Koordinaten zwischen Szene und Figur, die zur rotierten Szene führt? Probe für P'(3, 5).

Lösung anzeigen
Vorgehen (homogene 2D-Transformation): Eine 2D-Transformation in homogenen Koordinaten ist eine 3x3-Matrix
Man liest aus dem Vergleich "Ausgangsszene -> rotierte Szene" den Drehwinkel (und ggf. die Verschiebung ) ab und wendet auf einen Punkt an: (mit ).
Probe: Für einen bekannten Punkt setzt man ein und prüft, ob herauskommt. Beispiel für eine reine Rotation um 90° ():
D.h. der Urbildpunkt von P'(3,5) waere (5, -3). Enthält M zusätzlich eine Translation, ergänzt man entsprechend.
Hinweis (Unstimmigkeit / Lesbarkeit): Der genaue Drehwinkel und die Verschiebung lassen sich nur aus den beiden Szenenbildern exakt ablesen. Der Rechenweg (homogene Matrix aufstellen, Punkt einsetzen, Probe) ist wie oben; setze die aus deiner Vorlesungsversion abgelesenen Werte für , , ein. Wichtig ist die Herleitung und die Probe, nicht ein auswendig gelernter Zahlenwert.
Kapitelbezug: Kapitel 5: Transformationen (homogene Koordinaten, Rotationsmatrix, Probe).
4. Aufgabe: Beleuchtung nach Phong (16 %)

Teil a (6 %): Zeichnen Sie alle für das Phong-Reflexionsmodell nötigen Vektoren sowie die Winkel und am Punkt P ein. Teil b (4 %): Stellen Sie die Gleichung für die Helligkeit der diffusen und der spekularen Reflexion an P auf einer Skala 0 bis 1 auf. Mit (diffus) und (spekular), Exponent .
Lösung anzeigen
Teil a - benötigte Vektoren (alle normiert) am Punkt P:
- = Normale der Oberfläche (senkrecht nach oben).
- = Lichtvektor von P zur Lichtquelle.
- = Reflexionsvektor von an (gespiegelt).
- = Blickvektor von P zur Kamera.
- = Winkel zwischen und (für die diffuse Reflexion).
- = Winkel zwischen und (für die spekulare Reflexion).
Teil b - Gleichungen und Rechnung (mit Material-/Lichtkonstanten = 1, Skala 0..1):
Diffuse Reflexion (Lambert):
Spekulare Reflexion (Phong):
Rechenweg spekular: ; .
Kapitelbezug: Kapitel 9: Visualisierungstechniken (Phong-Modell).
Typischer Fehler: und vertauschen ( misst N zu L, misst R zu V) oder den Exponenten auf den diffusen Term anwenden. Der Exponent gehört nur zur spekularen Reflexion und macht das Glanzlicht schärfer (großes = kleiner, harter Glanzpunkt).
4. Aufgabe: Bilineare Interpolation (10 %)
Hinweis (Unstimmigkeit): Diese Aufgabe ist in der Klausur ebenfalls mit "4." nummeriert (siehe oben).

Dreieck mit Vertexfarben , , . Gesucht: RGB-Farbwert im Punkt .
Teil 1 (4 %): Beschreiben Sie das Vorgehen. Teil 2 (6 %): Berechnen Sie den Farbwert nachvollziehbar.
Lösung anzeigen
Vorgehen: Innerhalb eines Dreiecks interpoliert man die Vertexwerte über baryzentrische Gewichte (Flächenverhältnisse). Für jeden Vertex ist das Gewicht der Anteil der gegenüberliegenden Teildreiecksfläche an der Gesamtfläche:
Die Farbe ist dann . Alternativ interpoliert man zuerst entlang zweier Kanten linear und dann quer dazu (daher "bilinear").
Rechnung (Pixelkoordinaten aus dem Raster abgelesen: , , , ):
Gesamtfläche .
Probe: ✓.
Also überwiegend Blau mit Rotanteil (p liegt nahe an und ).
Hinweis (Lesbarkeit): Die genauen Pixelkoordinaten müssen aus dem Raster abgelesen werden; oben stehende Werte sind eine sorgfältige Ablesung. Entscheidend für die Punkte ist der nachvollziehbare Rechenweg (baryzentrische Gewichte, Summe = 1, gewichtete Farbmischung).
Kapitelbezug: Kapitel 8: Rendering-Pipeline (lineare Farbinterpolation im Dreieck).
5. Aufgabe: Bildverarbeitung, lokale Operatoren (14 %)
a (4 %): Warum muss die Größe von Faltungskerneln aus ungeraden Zahlen (3x3, 5x5, ...) bestehen? b (2 %): Was bewirkt ? c (4 %): Was bewirkt ein Mittelwertoperator? Geben Sie einen Mittelwertoperator an, der sich nur auf horizontale Kanten auswirkt und keine weitere Grauwerttransformation braucht. d (4 %): Unterschied Mittelwert- vs. Median-Rangfolgeoperator?
Lösung anzeigen
a) Ein ungerader Kernel (3x3, 5x5, ...) hat ein eindeutiges Zentrum. Nur so kann das Ergebnis genau einem Ausgangspixel zugeordnet werden, und der Kernel ist symmetrisch um dieses Zentrum (kein halbpixel-Versatz).
b) berechnet die Differenz zwischen dem rechten oberen Nachbarn und dem Zentralpixel ( oben rechts, in der Mitte). Das ist ein Differenz-/Kantenoperator (erste Ableitung) in diagonaler Richtung: konstante Flächen ergeben 0, an Kanten (Grauwertsprüngen) in dieser Richtung entstehen Ausschläge. Er hebt also diagonale Kanten hervor.
c) Ein Mittelwertoperator (Tiefpass) glättet/verwischt das Bild und reduziert Rauschen, macht aber Kanten unschärfer. Ein Mittelwertoperator, der nur auf horizontale Kanten wirkt (also vertikal glättet) und dessen Gewichtssumme 1 ist (keine weitere Grauwerttransformation nötig):
Er mittelt entlang der Spalte (vertikal) und verwischt damit nur Grauwertänderungen in vertikaler Richtung, also horizontale Kanten. Die Summe der Koeffizienten ist .
d) Der Mittelwertoperator (Faltung, linear) bildet einen gewichteten Durchschnitt und kann dadurch neue, im Original nicht vorhandene Grauwerte erzeugen; er ist empfindlich gegenüber Ausreißern. Der Median (Rangfolgeoperator, nichtlinear) wählt den mittleren Wert der sortierten Nachbarschaft, erzeugt keine neuen Grauwerte, erhält Kanten besser und entfernt Ausreißer (Salz-und-Pfeffer-Rauschen) wirksamer.
Kapitelbezug: Kapitel 12: Bildverarbeitung - Lokale Operatoren.
Teil d (Laplace) (6 %): Wenden Sie den Laplace-Operator auf die Rastergrafik an (Start bei Pixel [1,1], Ergebnismatrix eine Zeile/Spalte kleiner). Rechenweg angeben.

Rastergrafik:
| 50 | 127 | 127 | 200 |
|---|---|---|---|
| 50 | 150 | 150 | 200 |
| 50 | 150 | 150 | 200 |
| 50 | 127 | 127 | 200 |
Lösung anzeigen
Laplace-Operator (4er-Nachbarschaft):
Der Operator lässt sich nur auf die inneren Pixel anwenden (Rand hat keine vollständige Nachbarschaft). Bei einem 3x3-Kernel auf einem 4x4-Bild sind das die 2x2 inneren Pixel:
- Pixel (1,1) = 150:
- Pixel (1,2) = 150:
- Pixel (2,1) = 150:
- Pixel (2,2) = 150:
Die großen Beträge markieren die starken vertikalen Grauwertsprünge (links 50 -> 150, rechts 150 -> 200).
Hinweis (Unstimmigkeit in der Klausur): Die Aufgabe sagt "die Ergebnismatrix wird eine Zeile und Spalte kleiner", also 3x3 aus 4x4. Mit einem 3x3-Kernel ohne Randbehandlung entsteht mathematisch aber eine 2x2-Ergebnismatrix (nicht 3x3); "eine kleiner" gilt nur für einen 2x2-Kernel. Das oben berechnete 2x2-Ergebnis ist die korrekte gültige Faltung. Falls in der Vorlesung eine bestimmte Randbehandlung vorgesehen ist, ändern sich nur die Randwerte.
Teil e (Flood Fill / ZHK) (6 %): Bilden Sie die ZHKs (Zusammenhangskomponenten) per rekursivem Fluten. Links N4-, rechts N8-Nachbarschaft. Nummerieren Sie die Pixel der ZHKs.
Lösung anzeigen
Vorgehen (Flood Fill): Man startet an einem noch nicht markierten Vordergrundpixel, vergibt eine neue Komponentennummer und flutet rekursiv alle über die gewählte Nachbarschaft erreichbaren Vordergrundpixel mit derselben Nummer. Dann nächstes unmarkiertes Pixel = nächste Komponente.
- N4-Nachbarschaft: nur die 4 direkten Nachbarn (oben/unten/links/rechts) zählen als verbunden. Diagonal berührende Pixel sind getrennte Komponenten -> mehr ZHKs.
- N8-Nachbarschaft: zusätzlich die 4 Diagonalnachbarn zählen -> diagonal berührende Pixel verschmelzen -> weniger ZHKs.
Deshalb ergibt dasselbe Bild mit N8 immer gleich viele oder weniger Komponenten als mit N4. Diagonale "Ketten" von Pixeln bilden bei N4 mehrere einzelne Komponenten, bei N8 eine einzige.
Hinweis (Unstimmigkeit in der Klausur): Die Legende ist invertiert beschriftet: das leere (weiße) Kästchen steht laut Legende für "schwarz", das graue Kästchen für "weiß". Die grauen Pixel sind also der Vordergrund (Objekt), der geflutet wird. Beim Lösen die Legende genau beachten und die grauen (= "weißen") Pixel als Vordergrund werten.
Kapitelbezug: Kapitel 12: Bildverarbeitung - Lokale Operatoren (Segmentierung, ZHK, Flood Fill).
6. Aufgabe (Zusatz): Grauwerttransformation & Projektion (10 %)
Nach einer Faltung liegen die Pixelwerte im Intervall . Gesucht sind lineare Transformationen .
a (4 %): Abbildung auf Grauwerte . Wie sieht das Histogramm danach aus?
b (4 %): Abbildung auf . Ist das Ergebnis kontrastreicher oder kontrastärmer? Begründung.
c (2 %): Parameter von glm::perspective(a, b, c, d).
Lösung anzeigen
Allgemein: , und so, dass auf fällt.
a) :
Probe: , ✓. Histogramm: Da , wird der Wertebereich gespreizt (gestreckt). Die Form bleibt gleich, aber es entstehen Lücken zwischen den Balken (Kammform), weil ganzzahlige Eingabewerte auf weiter auseinanderliegende ganzzahlige Ausgabewerte (Vielfache von 3, verschoben) abgebildet werden. Kontrast steigt.
b) :
Probe: , ✓. Kontrast: Wegen wird der Wertebereich gestaucht -> das Ergebnisbild ist kontrastärmer als das Ausgangsbild (die Grauwertspanne wird kleiner).
c) glm::perspective(a, b, c, d):
- a = fovy (vertikaler Öffnungswinkel / field of view in y).
- b = aspect (Seitenverhältnis Breite/Höhe).
- c = zNear (Abstand der nahen Clipping-Ebene).
- d = zFar (Abstand der fernen Clipping-Ebene).
Kapitelbezug: Kapitel 11: Bildbearbeitung - Punktoperatoren (lineare Grauwerttransformation, Histogramm), Kapitel 7: Kameras (perspektivische Projektion).
Typischer Fehler: Bei der Grauwerttransformation
addfalsch bestimmen. Sicher ist die Methode " aus den Intervallbreiten, dann einen bekannten Punkt einsetzen und nachaddauflösen".