Inhaltsverzeichnis

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:

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 );
        
    }
}

Das Orginal:
Der Krebsnebel zeigt die Überreste einer Supernova (Sternenexplosion). Sie wurde im Jahre 1054 von Chinesen beobachtet.

Das 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.

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);
    }
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.

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.

Orginal BildDie 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.