Dieser Abschnitt behandelt die Umwandlung von Farbbildern im RGB-System in Graubilder. Graubilder wiederum können dann in Binärbilder umgewandelt werden.
Die Umwandlung von Farbbildern in Graubilder erfolgt mit folgender Vorschrift:
mit
r = Rotanteil (0-255)
g = Grünanteil (0-255)
b = Blauanteil (0.255)
y ist der Grauwert der auch als Luminanz bezeichnet wird.
Das folgende Programm lädt ein Bild und berechnet die Luminanz (den Grauwert) an der Stelle x=5, y=4.
import java.awt.Color; import de.informatics4kids.Picture; import de.informatics4kids.PictureViewer; public class Luminanz { public static void main(String[] args) { Picture pic = new Picture(); pic.open("/home/student/katze.jpg"); // Farbwert holen Color alt = pic.getColor(4, 3); int y = (int) (0.3 * alt.getRed() + 0.59 * alt.getGreen() + 0.11 * alt .getBlue()); // neuen Farbwert erstellen und setzen Color grau = new Color(y, y, y); pic.setColor(4,3, grau); System.out.println("Luminanz=" + y ); } }
Die Werte für 30% Rot-, 59% Grün- und 11% Blauanteil, die auch von Gimp verwendet werden um Graubilder zu erzeugen, haben ihre Begründung letztendlich in der Psychophysik (z.B. Weber-Fechner-Gesetz). Beispielsweise nimmt das menschliche Auge grün heller wahr als rot und rot wiederum heller als blau. Die Ursprünge der Formel liegen u.a. in der Fernsehtechnik, denn bei der Darstellung von Farb- und Schwarz/Weiß-Bildern wurde sie früh benötigt.
Ein Graubild enthält noch viele verschiedene Grauanteile. Wenn man lediglich zwei verschiedene Farbwerte (schwarz/weiß) verwendet, bekommt man ein Binärbild. Dabei ist erst einmal nicht klar definiert, ab wann ein Grauwert nun schwarz oder weiß werden soll. Oft muss ein Schwellenwert c experimentell gefunden werden, um gute Ergebnisse zu erhalten.
Das folgende Programm lädt ein Graubild und berechnet den Farbwert (schwarz oder weiß) für einen Pixel an der Stelle x=5, y=4.d.h. die Bildkoordinaten sind (4,3).
import java.awt.Color; import de.informatics4kids.Picture; public class Main { public static void main(String[] args) { // testbild.jpg öffnen Picture pic = new Picture(); pic.open("/home/student/Bilder/testbild.jpg"); // Farbe beziehen Color color = pic.getColor(4,3); // Grauwert berechnen - alle Farbwerte sind gleich! int g = color.getRed(); // BInärwert berechnen int binarvalue; if (g <= 150) binarvalue = 0; else binarvalue = 255; // Binärwert in neue Farbe einfügen Color binarcolor = new Color(binarvalue, binarvalue, binarvalue); }
In der Java-Bibliothek existieren zwei Methoden - brighter() und darker() - mit deren Hilfe ein Farbwert heller beziehungsweise dunkler gesetzt werden kann.
Da für diese Methoden der Quellcode eingesehen werden kann, können wir unmittelbar nachvollziehen, was im Detail geschieht.
public Color brighter() { return new Color(Math.min((int)(getRed() *(1/FACTOR)), 255), Math.min((int)(getGreen()*(1/FACTOR)), 255), Math.min((int)(getBlue() *(1/FACTOR)), 255)); } public Color darker() { return new Color(Math.max((int)(getRed() *FACTOR), 0), Math.max((int)(getGreen()*FACTOR), 0), Math.max((int)(getBlue() *FACTOR), 0)); } |
Codebeispiel aus der Java-Bibliothek. Die Konstante FACTOR hat dabei den Wert 0.7. |
Das folgende Programm lädt ein Bild und setzt den Bildpunkt an der Stelle x=5, y=4 ein wenig „brighter“.
import java.awt.Color; import de.informatics4kids.Picture; import de.informatics4kids.PictureViewer; public class Main { public static void main(String[] args) { Picture pic = new Picture(); pic.open("/home/student/katze.jpg"); Color alt = pic.getColor(4, 3); Color neu = alt.brighter(); pic.setColor(4,3, neu); } }
Durchläuft man alle Bildpunkte (Pixel) kann man auf diese Weise Bilder aufhellen b.z.w. verdunkeln.
Orginal Bild | Die Java-Methode brighter angewandt auf das Bild. | Die Java-Methode darker angewandt auf das Bild. |
Wer tiefer einsteigen will, dem sei das Buch Java Insel (Kapitel 'Farben') empfohlen. Dort wird auch erklärt, wie man echte Helligkeitsänderungen erzeugt.