Probeklausur 1 - Visual Computing

Übungsklausur (mock exam) zum Kurs "Visual Computing" (HS Darmstadt). Sie ist an Struktur, Themenmix, Schwierigkeit und Punktgewichtung der Original-Klausur WS 2025/2026 angelehnt, enthält aber ausschliesslich neue Aufgaben. Alle Lösungen sind ausklappbar mit vollem Rechenweg, Begründung und Kapitelbezug. Zum Vergleich mit dem Original: Klausur WS2025 (Lösungen).

Hinweise zur Klausur: Dauer 90 Minuten. Hilfsmittel: ein nicht-programmierbarer Taschenrechner und ein beschriebenes DIN-A4-Blatt. Insgesamt 100 Punkte.


1. Aufgabe: RGB und HSV Farbmodelle (13 Punkte)

Teil a (6 P): Rechnen Sie die folgenden drei Farben aus dem RGB-Modell (Wertebereich [0,1][0,1]) in das HSV-Modell um. Geben Sie jeweils VV (Value), SS (Saturation) und HH (Hue) an und zeigen Sie den Rechenweg.

Farbe(R,G,B)(R, G, B)
Farbe 1(1,0, 1,0, 0,0)(1{,}0,\ 1{,}0,\ 0{,}0)
Farbe 2(0,5, 0,5, 0,5)(0{,}5,\ 0{,}5,\ 0{,}5)
Farbe 3(0,2, 0,2, 1,0)(0{,}2,\ 0{,}2,\ 1{,}0)

Teil b (7 P): Eine Grafik zeigt auf weissem Hintergrund drei gefüllte Quadrate: links Rot (1,0,0)(1,0,0), mittig Gelb (1,1,0)(1,1,0), rechts Blau (0,0,1)(0,0,1). Die Grafik wird einmal in ihre RGB-Kanäle und einmal in ihre HSV-Kanäle zerlegt (je drei Graustufenbilder, Leseregel: weiss = Maximalwert, schwarz = Minimalwert). Vervollständigen Sie beide Tabellen mit den Kanalwerten und begründen Sie, an welchem Kanal man RGB von HSV am schnellsten unterscheidet.

Lösung anzeigen

Teil a - Umrechnung RGB nach HSV. Formeln (Kapitel 10): V=max(r,g,b)V = \max(r,g,b),   S=1min(r,g,b)max(r,g,b)\;S = 1 - \dfrac{\min(r,g,b)}{\max(r,g,b)},   H\;H = Farbwinkel auf dem Farbkreis (00^\circ Rot, 6060^\circ Gelb, 120120^\circ Grün, 180180^\circ Cyan, 240240^\circ Blau, 300300^\circ Magenta).

Farbe 1 (1,0, 1,0, 0,0)(1{,}0,\ 1{,}0,\ 0{,}0) - Gelb:

  • V=max(1,0, 1,0, 0,0)=1,0V = \max(1{,}0,\ 1{,}0,\ 0{,}0) = 1{,}0
  • min=0,0S=10,01,0=1,0\min = 0{,}0 \Rightarrow S = 1 - \dfrac{0{,}0}{1{,}0} = 1{,}0
  • Rot und Grün sind maximal, Blau ist null: reines Gelb, also H=60H = 60^\circ.
  • Ergebnis: [60, 1,0, 1,0]HSV[60^\circ,\ 1{,}0,\ 1{,}0]_{\text{HSV}}

Farbe 2 (0,5, 0,5, 0,5)(0{,}5,\ 0{,}5,\ 0{,}5) - Grauton:

  • V=0,5V = 0{,}5
  • min=max=0,5S=10,50,5=0\min = \max = 0{,}5 \Rightarrow S = 1 - \dfrac{0{,}5}{0{,}5} = 0
  • Wegen S=0S = 0 ist HH undefiniert (unbunt).
  • Ergebnis: [undef, 0, 0,5]HSV[\text{undef},\ 0,\ 0{,}5]_{\text{HSV}}

Farbe 3 (0,2, 0,2, 1,0)(0{,}2,\ 0{,}2,\ 1{,}0) - entsättigtes Blau:

  • V=max=1,0V = \max = 1{,}0
  • min=0,2S=10,21,0=0,8\min = 0{,}2 \Rightarrow S = 1 - \dfrac{0{,}2}{1{,}0} = 0{,}8
  • Blau ist maximal, Rot und Grün gleich (kein Anteil Richtung Cyan oder Magenta): H=240H = 240^\circ.
  • Ergebnis: [240, 0,8, 1,0]HSV[240^\circ,\ 0{,}8,\ 1{,}0]_{\text{HSV}}

Teil b - Kanalzerlegung.

RGB-Kanäle (weiss = 1, schwarz = 0):

RegionRGB
Hintergrund (weiss)111
Rot100
Gelb110
Blau001

HSV-Kanäle:

RegionHSV
Hintergrund (weiss)undef (0)01
Rot00^\circ11
Gelb6060^\circ11
Blau240240^\circ11

Begründung (schnellste Unterscheidung): Entscheidend ist der Hintergrund (Weiss). In RGB ist Weiss in jedem Kanal der Maximalwert, also haben alle drei RGB-Kanalbilder einen hellen Hintergrund. In HSV gilt für Weiss V=1V = 1 (weiss), aber S=0S = 0 (schwarz) und HH undefiniert (schwarz dargestellt). Die HSV-Zerlegung zeigt also einen Kanal (V) mit weissem Hintergrund und zwei (H, S) mit schwarzem Hintergrund. Sind alle drei Hintergründe hell, liegt RGB vor; sind zwei dunkel, liegt HSV vor.

Kapitelbezug: Kapitel 10: Farbräume.

Typischer Fehler: VV als Mittelwert der drei Kanäle berechnen. VV ist das Maximum max(r,g,b)\max(r,g,b), nicht der Durchschnitt. Ausserdem SS und VV vertauschen: Bei voll gesättigten Farben ist V=1V = 1 und S=1S = 1, bei einem Grauton dagegen S=0S = 0 und VV = der gemeinsame Grauwert.


2. Aufgabe: OpenGL Shader (19 Punkte)

Gegeben ist das folgende Shader-Paar:

// Vertex Shader
#version 330
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec3 vertex_normal;
layout(location = 2) in vec2 vertex_uv;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projMatrix;
out vec2 uvVS;
void main() {
    gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1.0);
    uvVS = vertex_uv;
}
// Fragment Shader
#version 330
in vec2 uvVS;
out vec4 color;
uniform vec3 baseColor;
void main() {
    color = vec4(baseColor * uvVS.x, 1.0);
}

a (3 P): Worauf verweist der index in layout(location = index)? Welche drei Attribute werden hier gebunden? b (3 P): Was ist eine uniform Variable und welche Zugriffsrechte hat sie im Shader? c (3 P): Erklären Sie den Unterschied zwischen in und out. Was passiert mit einem out-Wert des Vertex-Shaders auf dem Weg zum Fragment-Shader? d (4 P): Erklären Sie die Zeile gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1.0);. In welcher Reihenfolge wirken die Matrizen, und wozu dient das 1.0? e (3 P): Erklären Sie die Parameter von gluLookAt(ax,ay,az, bx,by,bz, cx,cy,cz). f (3 P): Was bewirken glEnable(GL_DEPTH_TEST), glDepthFunc(GL_LESS) und glClearDepth(1.0)?

Lösung anzeigen

a) Der index gibt die Vertex-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: 00 = Position (vertex), 11 = Normale (vertex_normal), 22 = Texturkoordinate (vertex_uv).

b) Eine uniform Variable ist eine globale, für alle Vertices bzw. Fragmente eines Draw-Calls konstante Eingabe, die von der Anwendung (CPU) per glUniform* / glUniformMatrix*fv gesetzt und per Variablenname adressiert wird. Im Shader ist sie READ-ONLY. Verwendung z.B. für Transformationsmatrizen (modelMatrix, viewMatrix, projMatrix), Lichtparameter oder hier die baseColor.

c) in ist eine Eingabevariable (READ-ONLY): im Vertex-Shader die Vertex-Attribute, im Fragment-Shader die Ausgabe der vorherigen Stufe. out ist eine Ausgabevariable (READ/WRITE), die an die nächste Pipeline-Stufe weitergereicht wird. Ein out-Wert des Vertex-Shaders (hier uvVS) wird bei der Rasterisierung automatisch über das Primitiv interpoliert, bevor er als in im Fragment-Shader ankommt. Kopplung erfolgt über gleichen Namen und gleichen Typ in beiden Shadern.

d) Die Matrizen werden bei Spaltenvektoren von rechts nach links angewendet:

gl_Position=PVM(vertex, 1.0)\texttt{gl\_Position} = \mathbf{P} \cdot \mathbf{V} \cdot \mathbf{M} \cdot (\text{vertex},\ 1.0)

Zuerst bringt die Model-Matrix M\mathbf{M} den Vertex aus dem lokalen ins Weltkoordinatensystem, dann die View-Matrix V\mathbf{V} ins Kamerakoordinatensystem, dann die Projektions-Matrix P\mathbf{P} in den Clip-Raum. Das 1.0 homogenisiert die 3D-Position zu einem vec4 mit w=1,0w = 1{,}0; nur so lassen sich Translationen (in der letzten Spalte der 4×44\times4-Matrizen) überhaupt ausführen. Ein Richtungsvektor bekäme stattdessen w=0w = 0.

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)

  1. glEnable(GL_DEPTH_TEST) schaltet den Tiefentest (z-Buffer-Test) ein.
  2. glDepthFunc(GL_LESS) legt fest, dass ein Fragment nur gezeichnet wird, wenn sein Tiefenwert kleiner (also näher an der Kamera) ist als der bereits gespeicherte.
  3. glClearDepth(1.0) setzt den Wert, mit dem der Tiefenpuffer beim Löschen gefüllt wird (1,01{,}0 = maximale, weiteste Entfernung), damit jedes reale Fragment den Test zunächst besteht.

Kapitelbezug: Kapitel 6: Shaderprogrammierung, Kapitel 7: Kameras, Kapitel 8: Rendering-Pipeline.

Tipp: uniform (konstant pro Draw-Call, per Name adressiert) klar von in-Vertex-Attributen (variieren pro Vertex, per location-Index adressiert) trennen. Und: der Fragment-Output ist erst nach Tiefentest und Blending das finale Pixel.


3. Aufgabe: Affine Transformationen (16 Punkte)

Teil a (6 P): Eine 2D-Szene "Roboterkopf" soll aus zwei Basiselementen aufgebaut werden: Kreis (Einheitskreis, Radius 11, Zentrum Ursprung) und Dreieck (Basis von 1-1 bis 11 auf der x-Achse, Spitze bei (0,1)(0,1)). Zielszene:

  • Kopf: ein Kreis mit Radius 22, Zentrum im Ursprung.
  • Linkes Auge: ein Kreis mit Radius 0,30{,}3, Zentrum bei (0,7, 0,5)(-0{,}7,\ 0{,}5).
  • Nase: ein Dreieck, um 180180^\circ gedreht (Spitze zeigt nach unten), unverändert gross, Zentrum bei (0, 0,2)(0,\ -0{,}2).

Geben Sie für jedes der drei Blätter die nötigen Transformationen samt Parametern an. Erläutern Sie kurz die Vererbung im Szenegraphen.

Teil b (10 P): Ein Punkt P=(3, 1)P = (3,\ 1) soll erst um 9090^\circ gegen den Uhrzeigersinn um den Ursprung gedreht und danach um t=(3, 1)\vec{t} = (3,\ -1) verschoben werden.

  1. Stellen Sie die Rotationsmatrix RR und die Translationsmatrix TT in homogenen Koordinaten (3×33\times3) auf.
  2. Berechnen Sie die kombinierte Matrix M=TRM = T \cdot R und wenden Sie sie auf PP an (Probe).
  3. Zeigen Sie an derselben Rechnung, dass die umgekehrte Reihenfolge RTR \cdot T ein anderes Ergebnis liefert (Nicht-Kommutativität).
Lösung anzeigen

Teil a - Transformationen pro Blatt (Basiselemente sind Einheitskreis und Standarddreieck):

  • Kopf: Einheitskreis (r=1r=1) auf r=2r=2 vergrössern, Zentrum bleibt im Ursprung -> Skalierung(2, 2)(2,\ 2).
  • Linkes Auge: Einheitskreis auf r=0,3r=0{,}3 verkleinern und an die Position schieben -> Skalierung(0,3, 0,3)(0{,}3,\ 0{,}3), dann Translation(0,7, 0,5)(-0{,}7,\ 0{,}5). Reihenfolge beachten: erst skalieren (um den Ursprung), dann verschieben, sonst wird der Abstand zum Ursprung mitskaliert.
  • Nase: Standarddreieck um 180180^\circ drehen (Spitze zeigt danach nach unten) -> Rotation(180)(180^\circ), dann Translation(0, 0,2)(0,\ -0{,}2). Die Grösse bleibt unverändert (keine Skalierung).

Vererbung: Im Szenegraphen erben Kind-Objekte die Transformationen ihres Elternknotens. Eine Transformation, die auf alle Teile wirken soll (z.B. den ganzen Kopf drehen), notiert man einmal am Elternknoten Roboterkopf; sie wird mit den blattspezifischen Transformationen zur akkumulierten Matrix verkettet. Bei Spaltenvektoren steht die Wurzel-Transformation dabei ganz links (wirkt als äusserste, zuletzt angewandte Transformation).

Teil b - homogene Transformation.

1. Matrizen aufstellen. Für φ=90\varphi = 90^\circ gilt cos90=0\cos 90^\circ = 0, sin90=1\sin 90^\circ = 1:

R=(cosφsinφ0sinφcosφ0001)=(010100001),T=(103011001)R = \begin{pmatrix} \cos\varphi & -\sin\varphi & 0 \\ \sin\varphi & \cos\varphi & 0 \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix}, \qquad T = \begin{pmatrix} 1 & 0 & 3 \\ 0 & 1 & -1 \\ 0 & 0 & 1 \end{pmatrix}

2. Kombinierte Matrix M=TRM = T \cdot R. Zuerst rotieren, dann verschieben, also steht RR rechts (direkt am Punkt):

M=TR=(103011001)(010100001)=(013101001)M = T \cdot R = \begin{pmatrix} 1 & 0 & 3 \\ 0 & 1 & -1 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} 0 & -1 & 3 \\ 1 & 0 & -1 \\ 0 & 0 & 1 \end{pmatrix}

Anwendung auf P=(3, 1, 1)T\vec{P} = (3,\ 1,\ 1)^T:

MP=(013101001)(311)=(0311+3113+01111)=(221)M\,\vec{P} = \begin{pmatrix} 0 & -1 & 3 \\ 1 & 0 & -1 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 3 \\ 1 \\ 1 \end{pmatrix} = \begin{pmatrix} 0\cdot3 - 1\cdot1 + 3\cdot1 \\ 1\cdot3 + 0\cdot1 - 1\cdot1 \\ 1 \end{pmatrix} = \begin{pmatrix} 2 \\ 2 \\ 1 \end{pmatrix}

Also P=(2, 2)P' = (2,\ 2).

Probe (schrittweise): Rotation zuerst: (3,1)(3,1) um 9090^\circ CCW ergibt (y,x)=(1, 3)(-y, x) = (-1,\ 3). Dann Translation +(3,1)+(3,-1): (1+3, 31)=(2, 2)(-1+3,\ 3-1) = (2,\ 2) ✓ - stimmt mit MPM\,\vec{P} überein.

3. Umgekehrte Reihenfolge RTR \cdot T:

RT=(010100001)(103011001)=(011103001)R \cdot T = \begin{pmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 3 \\ 0 & 1 & -1 \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} 0 & -1 & 1 \\ 1 & 0 & 3 \\ 0 & 0 & 1 \end{pmatrix} (RT)P=(011103001)(311)=(1+13+31)=(061)(R\cdot T)\,\vec{P} = \begin{pmatrix} 0 & -1 & 1 \\ 1 & 0 & 3 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 3 \\ 1 \\ 1 \end{pmatrix} = \begin{pmatrix} -1 + 1 \\ 3 + 3 \\ 1 \end{pmatrix} = \begin{pmatrix} 0 \\ 6 \\ 1 \end{pmatrix}

Also P=(0, 6)(2, 2)P'' = (0,\ 6) \neq (2,\ 2). Die Matrixmultiplikation ist nicht kommutativ: TRRTT\cdot R \neq R\cdot T.

Kapitelbezug: Kapitel 5: Transformationen (homogene Koordinaten, Rotationsmatrix, Szenegraph, Nicht-Kommutativität).

Typischer Fehler: Die zuerst anzuwendende Transformation links statt rechts notieren. Bei Spaltenvektoren steht die erste Transformation direkt am Punkt, also ganz rechts. Ausserdem: Skalierung und Rotation wirken nur relativ zum Ursprung, deshalb beim Auge erst skalieren, dann verschieben.


4. Aufgabe: Beleuchtung nach Phong (16 Punkte)

An einem Oberflächenpunkt PP steht eine Punktlichtquelle, eine Kamera blickt auf PP. Alle Material- und Lichtkonstanten sind zunächst 11, gerechnet wird auf einer Skala 00 bis 11.

Teil a (4 P): Nennen Sie die vier für das Phong-Reflexionsmodell nötigen (normierten) Vektoren an PP und geben Sie an, zwischen welchen Vektoren die Winkel α\alpha und β\beta gemessen werden.

Teil b (6 P): Berechnen Sie die Helligkeit der diffusen und der spekularen Reflexion an PP für α=60\alpha = 60^\circ, β=30\beta = 30^\circ und Glanzexponent k=8k = 8. Zeigen Sie den Rechenweg.

Teil c (6 P): Nun mit realistischen Konstanten: diffuses Material Md=0,8M_d = 0{,}8, spekulares Material Ms=1,0M_s = 1{,}0, Lichtfarbe Li=1,0L_i = 1{,}0, globales Ambient La=0,1L_a = 0{,}1. Berechnen Sie die Gesamthelligkeit an PP mit der vollständigen Phong-Formel (einkanalig). Was bewirkt ein grösserer Exponent kk?

Lösung anzeigen

Teil a - benötigte Vektoren (alle normiert) an PP:

  • N\vec{N} = Normale der Oberfläche.
  • L\vec{L} = Lichtvektor, zeigt von PP zur Lichtquelle.
  • R\vec{R} = Reflexionsvektor, Spiegelung von L\vec{L} an N\vec{N}.
  • V\vec{V} = Sicht-/Blickvektor, zeigt von PP zur Kamera.

Winkel: α\alpha liegt zwischen N\vec{N} und L\vec{L} (steuert die diffuse Reflexion, cosα=NL\cos\alpha = \vec{N}\circ\vec{L}); β\beta liegt zwischen R\vec{R} und V\vec{V} (steuert die spekulare Reflexion, cosβ=RV\cos\beta = \vec{R}\circ\vec{V}).

Teil b - diffuse und spekulare Helligkeit (Konstanten =1= 1):

Diffuse Reflexion (Lambert):

Idiff=cosα=cos60=0,5I_{diff} = \cos\alpha = \cos 60^\circ = \mathbf{0{,}5}

Spekulare Reflexion (Phong):

Ispec=coskβ=cos8(30)I_{spec} = \cos^{k}\beta = \cos^{8}(30^\circ)

Rechenweg: cos30=320,8660\cos 30^\circ = \dfrac{\sqrt{3}}{2} \approx 0{,}8660, also cos230=34=0,75\cos^2 30^\circ = \dfrac{3}{4} = 0{,}75. Damit

cos8(30)=(cos230)4=(34)4=812560,316\cos^{8}(30^\circ) = \left(\cos^2 30^\circ\right)^{4} = \left(\tfrac{3}{4}\right)^{4} = \frac{81}{256} \approx \mathbf{0{,}316}

Teil c - vollständige Phong-Formel (einkanalig, eine Lichtquelle):

I=MdLa+(Mdcosα+Mscoskβ)LiI = M_d \cdot L_a + \left(M_d \cdot \cos\alpha + M_s \cdot \cos^{k}\beta\right)\cdot L_i

Einsetzen mit cosα=0,5\cos\alpha = 0{,}5 und cos8β=0,316\cos^{8}\beta = 0{,}316:

I=0,80,1+(0,80,5+1,00,316)1,0I = 0{,}8 \cdot 0{,}1 + \left(0{,}8 \cdot 0{,}5 + 1{,}0 \cdot 0{,}316\right)\cdot 1{,}0 I=0,08+(0,4+0,316)=0,08+0,716=0,796I = 0{,}08 + \left(0{,}4 + 0{,}316\right) = 0{,}08 + 0{,}716 = \mathbf{0{,}796}

Die Gesamthelligkeit an PP beträgt also rund 0,800{,}80 (ambienter Sockel 0,080{,}08, diffus 0,400{,}40, spekular 0,3160{,}316).

Wirkung von kk: Ein grösserer Glanzexponent kk macht das spekulare Glanzlicht kleiner und härter (schärferer, konzentrierterer Glanzpunkt), weil coskβ\cos^{k}\beta mit steigendem kk ausserhalb von β=0\beta = 0 schneller gegen null fällt. Kleines kk ergibt ein grosses, weiches Highlight.

Kapitelbezug: Kapitel 9: Visualisierungstechniken (Phong-Reflexionsmodell).

Typischer Fehler: α\alpha und β\beta vertauschen (α\alpha misst N\vec{N} zu L\vec{L}, β\beta misst R\vec{R} zu V\vec{V}) oder den Exponenten kk fälschlich auf den diffusen Term anwenden. kk gehört ausschliesslich zum spekularen Term. Ausserdem: der ambiente Term MdLaM_d\cdot L_a steht ausserhalb der Summe und hat keinen cos\cos-Faktor.


5. Aufgabe: Farbinterpolation im Dreieck (10 Punkte)

Ein Dreieck hat die Vertices v1=(0,0)v_1 = (0,0) mit Farbe Rot [1,0,0][1,0,0], v2=(6,0)v_2 = (6,0) mit Farbe Grün [0,1,0][0,1,0] und v3=(0,6)v_3 = (0,6) mit Farbe Blau [0,0,1][0,0,1]. Gesucht ist der interpolierte RGB-Farbwert im Punkt p=(2, 1)p = (2,\ 1).

Teil 1 (4 P): Beschreiben Sie das Vorgehen (baryzentrische Interpolation). Teil 2 (6 P): Berechnen Sie den Farbwert nachvollziehbar. Führen Sie die Probe w1+w2+w3=1w_1 + w_2 + w_3 = 1 durch.

Lösung anzeigen

Teil 1 - Vorgehen. Innerhalb eines Dreiecks werden die Vertexfarben über baryzentrische Gewichte (barycentric weights = Flächenverhältnisse) interpoliert. Für jeden Vertex ist das Gewicht der Anteil der gegenüberliegenden Teildreiecksfläche an der Gesamtfläche:

wi=AiAges,w1+w2+w3=1w_i = \frac{A_i}{A_{ges}}, \qquad w_1 + w_2 + w_3 = 1

Der Farbwert ist dann die gewichtete Summe c(p)=w1c1+w2c2+w3c3\vec{c}(p) = w_1\,\vec{c}_1 + w_2\,\vec{c}_2 + w_3\,\vec{c}_3. Die Dreiecksfläche berechnet man mit

A=12xa(ybyc)+xb(ycya)+xc(yayb).A = \tfrac12\,\bigl|x_a(y_b - y_c) + x_b(y_c - y_a) + x_c(y_a - y_b)\bigr|.

Teil 2 - Rechnung.

Gesamtfläche mit v1=(0,0)v_1=(0,0), v2=(6,0)v_2=(6,0), v3=(0,6)v_3=(0,6):

Ages=120(06)+6(60)+0(00)=1236=18A_{ges} = \tfrac12\,|\,0(0-6) + 6(6-0) + 0(0-0)\,| = \tfrac12 \cdot 36 = 18
  • A1=(p,v2,v3)A_1 = \triangle(p, v_2, v_3) mit p=(2,1)p=(2,1): 122(06)+6(61)+0(10)=1212+30=1218=9w1=918=12\tfrac12\,|\,2(0-6) + 6(6-1) + 0(1-0)\,| = \tfrac12\,|-12 + 30| = \tfrac12\cdot 18 = 9 \Rightarrow w_1 = \dfrac{9}{18} = \dfrac12
  • A2=(v1,p,v3)A_2 = \triangle(v_1, p, v_3): 120(16)+2(60)+0(01)=1212=6w2=618=13\tfrac12\,|\,0(1-6) + 2(6-0) + 0(0-1)\,| = \tfrac12\cdot 12 = 6 \Rightarrow w_2 = \dfrac{6}{18} = \dfrac13
  • A3=(v1,v2,p)A_3 = \triangle(v_1, v_2, p): 120(01)+6(10)+2(00)=126=3w3=318=16\tfrac12\,|\,0(0-1) + 6(1-0) + 2(0-0)\,| = \tfrac12\cdot 6 = 3 \Rightarrow w_3 = \dfrac{3}{18} = \dfrac16

Probe: 12+13+16=36+26+16=66=1\dfrac12 + \dfrac13 + \dfrac16 = \dfrac{3}{6} + \dfrac{2}{6} + \dfrac{1}{6} = \dfrac{6}{6} = 1

Farbwert:

c(p)=12[1,0,0]+13[0,1,0]+16[0,0,1]=[12, 13, 16][0,50, 0,33, 0,17]\vec{c}(p) = \tfrac12[1,0,0] + \tfrac13[0,1,0] + \tfrac16[0,0,1] = \left[\tfrac12,\ \tfrac13,\ \tfrac16\right] \approx [0{,}50,\ 0{,}33,\ 0{,}17]

Der Punkt liegt am nächsten an v1v_1 (Rot), daher überwiegt der Rotanteil.

Kapitelbezug: Kapitel 8: Rendering-Pipeline (lineare Farbinterpolation im Dreieck).

Tipp: Immer die Probe wi=1\sum w_i = 1 machen. Das Gewicht wiw_i gehört zur gegenüberliegenden Teilfläche AiA_i (nicht zu der Teilfläche, die den Vertex viv_i enthält). Liegt pp nahe an viv_i, muss wiw_i gross sein.


6. Aufgabe: Bildverarbeitung, lokale Operatoren (16 Punkte)

a (4 P): Erklären Sie den Unterschied zwischen dem Mittelwertoperator (Faltung) und dem Medianoperator (Rangordnung). Warum erhält der Median Kanten besser und entfernt Salz-und-Pfeffer-Rauschen wirksamer?

b (6 P): Wenden Sie den Laplace-Operator auf die folgende Rastergrafik an. Der Kernel lässt sich nur auf die inneren Pixel anwenden; geben Sie die Ergebnismatrix mit Rechenweg an.

10101010
10902010
10209010
10101010

c (6 P): Berechnen Sie den Median für das folgende 3×33\times3-Fenster und vergleichen Sie ihn mit dem Mittelwert. Was zeigt das Beispiel?

525554
5325056
545553
Lösung anzeigen

a - Mittelwert vs. Median. Der Mittelwertoperator (mean filter) ist eine lineare Faltung: er bildet den gewichteten Durchschnitt der Nachbarschaft. Dadurch kann er neue, im Original nicht vorhandene Grauwerte erzeugen, verwischt Kanten und ist empfindlich gegenüber Ausreissern (ein einzelner extremer Wert zieht den Durchschnitt mit). Der Medianoperator ist ein nichtlinearer Rangordnungsoperator: er sortiert die überdeckten Werte und wählt den mittleren. Er erzeugt keine neuen Grauwerte, erhält Kanten (der Mehrheitswert auf jeder Kantenseite bleibt erhalten) und entfernt Impuls-/Salz-und-Pfeffer-Rauschen wirksam, weil ein einzelner Ausreisser beim Sortieren an den Rand (g0g_0 oder g8g_8) wandert und daher nie als Median g4g_4 ausgewählt wird.

b - Laplace-Operator.

FL=(010141010),g(i,j)=4g(i,j)gobenguntenglinksgrechtsF_L = \begin{pmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{pmatrix}, \qquad g'(i,j) = 4\,g(i,j) - g_{\text{oben}} - g_{\text{unten}} - g_{\text{links}} - g_{\text{rechts}}

(Hinweis: Vorzeichen abhängig von der Kernel-Orientierung; hier wird das Zentrum mit 44 gewichtet, die 4 direkten Nachbarn mit 1-1, das Zentrum ist also 4ggNachbarn4\,g - \sum g_{\text{Nachbarn}}.) Bei einem 3×33\times3-Kernel auf einem 4×44\times4-Bild bleiben die 2×22\times2 inneren Pixel:

  • Pixel (1,1)=90(1,1) = 90: 49010201020=36060=3004\cdot90 - 10 - 20 - 10 - 20 = 360 - 60 = \mathbf{300}
  • Pixel (1,2)=20(1,2) = 20: 42010909010=80200=1204\cdot20 - 10 - 90 - 90 - 10 = 80 - 200 = \mathbf{-120}
  • Pixel (2,1)=20(2,1) = 20: 42090101090=80200=1204\cdot20 - 90 - 10 - 10 - 90 = 80 - 200 = \mathbf{-120}
  • Pixel (2,2)=90(2,2) = 90: 49020102010=36060=3004\cdot90 - 20 - 10 - 20 - 10 = 360 - 60 = \mathbf{300}

(Nachbarn jeweils oben/unten/links/rechts; z.B. für (1,1)=90(1,1)=90: oben 1010, unten 2020, links 1010, rechts 2020.)

Ergebnis=(300120120300)\text{Ergebnis} = \begin{pmatrix} 300 & -120 \\ -120 & 300 \end{pmatrix}

Die grossen Beträge markieren die starken lokalen Grauwertsprünge um die beiden hellen 9090-Pixel.

c - Median vs. Mittelwert.

Die 9 Werte sortiert: 52, 53, 53, 54, 54, 55, 55, 56, 25052,\ 53,\ 53,\ 54,\ 54,\ 55,\ 55,\ 56,\ 250.

Der Median ist der 5. Wert (g4g_4): 54\mathbf{54}.

Der Mittelwert ist

52+55+54+53+250+56+54+55+539=682975,8\frac{52+55+54+53+250+56+54+55+53}{9} = \frac{682}{9} \approx 75{,}8

Aussage: Das Störpixel 250250 (Impulsrauschen) zieht den Mittelwert stark nach oben (76\approx 76, obwohl fast alle Nachbarn um 5454 liegen), während der Median mit 5454 dem tatsächlichen lokalen Grauwert entspricht und den Ausreisser vollständig ignoriert. Der Median ist hier klar überlegen.

Kapitelbezug: Kapitel 12: Bildverarbeitung - Lokale Operatoren.

Typischer Fehler: Beim Median den Durchschnitt statt des sortierten Mittelwerts bilden - der Median ist der Rang g4g_4, keine Rechnung. Beim Laplace das Randproblem übersehen: ein 3×33\times3-Kernel ohne Randbehandlung liefert aus einem 4×44\times4-Bild eine 2×22\times2-Ergebnismatrix.


7. Aufgabe (Zusatz): Grauwerttransformation und Projektion (10 Punkte)

Nach einer Faltung liegen die Pixelwerte im Intervall [4, 8][-4,\ 8]. Gesucht sind lineare Grauwerttransformationen der Form g(i,j)=e(i,j)mult+addg'(i,j) = e(i,j)\cdot \text{mult} + \text{add}.

a (4 P): Bilden Sie [4, 8][-4,\ 8] auf den Grauwertbereich [0, 60][0,\ 60] ab. Wie verändert sich das Histogramm? b (4 P): Bilden Sie [4, 8][-4,\ 8] auf [4, 10][4,\ 10] ab. Ist das Ergebnis kontrastreicher oder kontrastärmer? Begründung. c (2 P): Nennen Sie die Parameter von glm::perspective(a, b, c, d).

Lösung anzeigen

Allgemein: mult=gmaxgminemaxemin\text{mult} = \dfrac{g'_{max} - g'_{min}}{e_{max} - e_{min}}; add\text{add} so wählen, dass emine_{min} auf gming'_{min} fällt (bekannten Punkt einsetzen und auflösen).

a) [4, 8][0, 60][-4,\ 8] \to [0,\ 60]:

mult=6008(4)=6012=5,add=05(4)=20\text{mult} = \frac{60 - 0}{8 - (-4)} = \frac{60}{12} = 5, \qquad \text{add} = 0 - 5\cdot(-4) = 20 g=5e+20\boxed{g' = 5\,e + 20}

Probe: 45(4)+20=0-4 \mapsto 5\cdot(-4)+20 = 0 ✓,   858+20=60\;8 \mapsto 5\cdot8+20 = 60 ✓.

Histogramm: Wegen mult=5>1\text{mult} = 5 > 1 wird der Wertebereich gespreizt (gestreckt). Die Balkenform bleibt erhalten, es entstehen aber Lücken (Kammform), weil benachbarte ganzzahlige Eingabewerte auf um 55 auseinanderliegende Ausgabewerte abgebildet werden. Der Kontrast steigt.

b) [4, 8][4, 10][-4,\ 8] \to [4,\ 10]:

mult=1048(4)=612=0,5,add=40,5(4)=4+2=6\text{mult} = \frac{10 - 4}{8 - (-4)} = \frac{6}{12} = 0{,}5, \qquad \text{add} = 4 - 0{,}5\cdot(-4) = 4 + 2 = 6 g=0,5e+6\boxed{g' = 0{,}5\,e + 6}

Probe: 40,5(4)+6=4-4 \mapsto 0{,}5\cdot(-4)+6 = 4 ✓,   80,58+6=10\;8 \mapsto 0{,}5\cdot8+6 = 10 ✓.

Kontrast: Wegen mult=0,5<1\text{mult} = 0{,}5 < 1 wird der Wertebereich gestaucht, das Ergebnis ist kontrastärmer (die Grauwertspanne schrumpft von 1212 auf 66).

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: add falsch bestimmen. Sichere Methode: mult\text{mult} aus den Intervallbreiten berechnen, dann einen bekannten Punkt (z.B. emine_{min}) einsetzen und nach add auflösen. Faustregel: mult>1\text{mult} > 1 spreizt (mehr Kontrast), mult<1\text{mult} < 1 staucht (weniger Kontrast).


Original-Klausur WS2025 (Lösungen) · Kapitelübersicht