====== Farbbild - Graubild - Binärbild ======
Dieser Abschnitt behandelt die Umwandlung von Farbbildern im RGB-System in Graubilder. Graubilder wiederum können dann in Binärbilder umgewandelt werden.
===== Umwandlung von Farbbildern im RGB-System in Graubilder =====
Die Umwandlung von Farbbildern in Graubilder erfolgt mit folgender Vorschrift:
* **Luminanz: ** **y** = 0.3 · r + 0.59 · g + 0.11 · b
mit\\
r = Rotanteil (0-255)\\
g = Grünanteil (0-255)\\
b = Blauanteil (0.255)\\
**y** ist der Grauwert der auch als **Luminanz** bezeichnet wird.
==== Beispiel ====
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 );
}
}
|{{ :inf:java:krebsnebel_color.png?300 |}}|{{ :inf:java:krebsnebel_grey.png?300 |}} |
|**Das Orginal:**\\
Der Krebsnebel zeigt die Überreste einer Supernova (Sternenexplosion). Sie wurde im Jahre 1054 von Chinesen beobachtet. |D**as Graubild:**\\ Hier wurde für jeden Pixel anhand der oben gegebenen Vorschrift die Luminanz berechnet und in einem neuen Bild abgespeichert.|
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.
===== Umwandlung von Graubildern in Binärbilder =====
== Der Schwellenwert c ==
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.
* Alle Grauwerte unterhalb des Schwellenwerts werden schwarz.
* Diejenigen Grauwerte, die größer oder gleich dem Schwellenwert sind, werden weiß.
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).
==== Beispiel ====
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);
}
|{{:inf:java:krebsnebel_grey.png?200|}} |{{:inf:java:krebsnebel_binar2.png?200|}}|{{ :inf:java:krebsnebel_binar.png?200|}}|
|Das Orginal Graubild.|Binärbild mit Schwellenwert c=50. Der Schwellenwert ist nicht ideal, da viele Details im Bildinneren verlorengehen.|Binärbild mit Schwellenwert c=180|
===== Ein wenig 'brighter'... =====
In der Java-Bibliothek existieren zwei Methoden - **brighter()** und **darker()** - mit deren Hilfe ein Farbwert heller beziehungsweise dunkler gesetzt werden kann.
* Color brighter() liefert einen helleren Farbton zurück.
* Color darker() liefert einen dunkleren Farbton zurück.
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.|
==== Beispiel ====
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//.
| {{ :inf:java:hund_normal.png?200 |}}|{{ :inf:java:hund_brighter.png?200 |}} | {{ :inf:java:hund_darker.png?200 |}}|
|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.