Farbe und Kanäle
Bis jetzt war das Foto grau. Ein Farbbild braucht drei Zahlen je Bildpunkt – für Rot, Grün und Blau. Statt eines Gitters hast du also drei, alle gleich groß, und dieselbe Stelle steht in allen dreien für denselben Bildpunkt.
Die drei Kanäle einzeln
Drei Gitter derselben Größe beschreiben ein Farbbild:
r[zeile][spalte] |
der Rotanteil dieses Bildpunkts, 0 bis 255 |
g[zeile][spalte] |
der Grünanteil |
b[zeile][spalte] |
der Blauanteil |
Alle drei auf 0 ergibt Schwarz, alle drei auf 255 ergibt Weiß. Sind alle drei gleich, ist der Bildpunkt grau – genau das war das Bild der letzten beiden Seiten.
Das leere Gitter nichts zeigt nebenbei etwas Nützliches: new int[72][96] ist
nicht leer, sondern mit Nullen gefüllt. Java legt jedes frische Zahlenfeld
so an.
Aufgabe 1: Graustufen selbst rechnen
Bisher hat foto.graustufen() die Umrechnung für dich erledigt. Jetzt machst
du sie selbst.
a) Die naheliegende Vorschrift ist der Durchschnitt der drei Kanäle.
Schreibe grauEinfach und vergleiche das Ergebnis mit foto.graustufen().
b) Das Auge sieht Grün heller als Blau. Deshalb rechnet man üblicherweise
grau = (rot * 30 + grün * 59 + blau * 11) / 100
Schreibe grauGewichtet und stelle beide nebeneinander. Wo siehst du einen
Unterschied – und warum gerade dort?
Tipp: Drei Gitter, eine Schleife
Du brauchst keine drei Schleifenpaare. Zeile und Spalte gelten für alle drei Gitter gleichzeitig:
neu[zeile][spalte] = (pRot[zeile][spalte] + pGruen[zeile][spalte]
+ pBlau[zeile][spalte]) / 3;
Aufgabe 2: Kanäle vertauschen und Sepia
a) Zeige das Foto einmal mit vertauschten Kanälen: Rot an die Stelle von Blau, Blau an die Stelle von Rot. Wie viele Zeilen Code brauchst du dafür? (Die Antwort ist überraschend kurz.)
b) Sepia ist der Braunton alter Fotografien. Man erhält ihn, indem man zuerst Graustufen berechnet und die drei Kanäle dann unterschiedlich stark wieder anhebt – Rot am stärksten, Blau am schwächsten. Probiere
rot = grau * 110 / 100
grün = grau * 95 / 100
blau = grau * 75 / 100
Vergiss das Begrenzen nach oben nicht.
c) Baue dir daraus einen Regler: Schreibe farbstich(int[][] pGrau, int pRot, int pGruen, int pBlau), dem du die drei Prozentzahlen übergibst. Welche
Zahlen ergeben einen kalten, blaustichigen Look?
Tipp zu a)
Du musst kein einziges Gitter umrechnen. Sieh dir an, in welcher Reihenfolge
leinwand.zeige seine drei Parameter erwartet.
Zum Weiterdenken
Ein Grünfilter für Videokonferenzen soll alle Bildpunkte finden, die „grün genug" sind, um durch einen Hintergrund ersetzt zu werden.
a) Eine erste Idee wäre g[zeile][spalte] > 150. Warum reicht das nicht?
Denk an eine hell beleuchtete weiße Wand.
b) Formuliere eine bessere Bedingung, die Grün nicht absolut, sondern im Verhältnis zu Rot und Blau prüft.
c) Setze sie um: Zeige das Foto und färbe jeden Bildpunkt, der die Bedingung erfüllt, kräftig magenta ein. Am Foto mit der LED wirst du kaum etwas finden – genau das ist ein brauchbares Ergebnis.