Grundlagen der Bildverarbeitung


   
Dieser Abschnitt erklärt Grundbegriffe der digitalen Bildverarbeitung. Vorerst werden nur pixelbasierte Bilder betrachtet. Vektorgrafiken werden nicht behandelt.

Als erste Anwendung werden aus einem gegebenen Farbbild ROT-, GRÜN- und BLAU-Bilder, sowie Histogramme erstellt.
Jedes Bild (z.B. PNG oder JPEG)  besitzt eine bestimmte Breite  (X) und Höhe (Y). Diese beiden Angaben legen die Anzahl der Bildpunkte (Pixel) fest. Alle Bildpunkte zusammen bilden den Bildbereich:

Pixelzahl eines Bildes = Breite · Höhe
oder
Bildbereich M = X 
·  Y

Bildbereich M und Bildpunkte (Pixel).  Der Farbwert w von jedem Pixel kann in einer Tabelle W gespeichert werden. W ist also die Menge aller Farbwerte.



Jeder Bildpunkt besitzt einen Farbwert. Die Menge aller Farbwerte wird mit W bezeichnet.

Ein digitalisiertes Bild (b) ist eine Abildung, bei der jeder Bildpunkt aus der Menge M des Bildbereiches einen Farbwert zugewiesen bekommt.
Definiton: Digitalisiertes Bild:  b: M → W
M ist der Bildbereich
W ist die Menge aller Farbwerte


Das RGB System und Java

  Eine Farbe ist durch ihre Anteile an den drei Grundfarben rot, grün und blau definiert. Dieses sogenannte RGB-System (Rot-Grün-Blau-System)  basiert auf der additiven Farbmischung und ist nur eines von mehreren Farbmodellen, das für unsere Zwecke aber vollkommen ausreicht

Da jede der drei Grundfarben in 256 Stufen (0 - 255) dargestellt werden kann,  lassen sich im RGB System ca. 16,7 Mio.  verschiedene Farben definieren.

   

  • 256 Rotwerte · 256 Grünwerte · 256 Blauwerte   = 16 777 216  ≈ 16.7 Mio. Farben


Für Java gilt nun , dass jeder Bildpunkt ein Objekt (Variable) vom Typ Color ist.
Das folgende Codefragment erzeugt alle Farben die im Bild zu sehen sind:

Color rot = Color(255,0.0);
Color green = Color(0,255.0);
Color blue = Color(0,0,255); 
Color magenta = Color(255,0.255);
Color cyan = Color(0,255,255);
Color gelb = Color(255,255,0);
Color black = Color(0,0,0);
Color white = Color(255,255,255);
Im RGB-System erhält jede Farbe
einen bestimmten Anteil an rot, grün und blau.
 
   

  • Color( int r, int g, int b ) erzeugt ein Color-Objekt mit den Grundfarben rot, grün und blau. Die Werte müssen im Bereich 0 bis 255 liegen. Jeder Farbwert ist also 1 byte = 8 bit groß.
  • Die Methoden: int getRed(), int getGreen(), int getBlue()  liefern jeweils den Rot-, Grün- und Blau-Anteil des Farbobjekts zurück. Jeder Farbwert ist dabei eine Zahl im Bereich von 0 bis 255.
  • Color SCHWARZ = Color(0,0,0)
  • Color WEISS = Color(255,255,255)
Ein Color-Objekt ist 32 bit groß. Das letzte Byte, der α-Wert, ist die Transparenz (Deckkraft).

 Bit: 0-7  Rot-Wert   Wertebereich 0-255 Bit: 8-15   Grün-Wert  Wertebereich 0-255 Bit: 16-23 Blau-Wert Wertebereich 0-255 Bit: 24-31 Transparenz
(Deckkraft)
Aufbau java.awt.Color-Objekt 

Das folgende Programm lädt ein Bild und zeigt es innerhalb eines Fensters an:

import de.informatics4kids.Picture;
import de.informatics4kids.PictureViewer;

public class Viewer {

    public static void main(String[] args) {

        // Bild erstellen und öffnen
        Picture pic = new Picture("/home/student/testbild.jpg");        
        //Viewer verfügbar machen
        PictureViewer viewer = new PictureViewer(pic.getPicture());
        //Bild anzeigen
        viewer.show();
    }
}
 
 
Das Bild aus dem vorherigen Programmbeispiel angezeigt mit der PictureViewer Klasse.  



Rot-, Grün-, und Blaubilder


Aus dem obigen Bild läßt sich ein Rotbild erzeugen, indem von jedem Pixel der Farbwert ermittelt und der Rotanteil bestimmt wird. Anschließend wird der Farbwert des Pixels durch ein Color-Objekt ersetzt, das nur den ermittelten Rotanteil enthält.
Das folgende Programm demonstriert dies Anhand des Pixels an der Position x = 4 und y = 5.
Der erste Pixel hat die Position (0,0) und befindet sich oben links im Bild.
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");
        // leere Kopie erzeugen
        Picture rotBild = new Picture(pic.widthX(), pic.heightY());
        // Farbe auslesen und neu erzeugen
        Color farbe = pic.getColor(3, 4);
       // nur rote Komponente einfügen!
        Color rot = new Color(farbe.getRed(), 0, 0);
        // Farbe setzen
        rotBild.setColor(3, 4, rot);
    }
}


Durchläuft man alle Pixel des Bildes und speichert immer nur eine Farbkomponente ab, erhält man Rot- ,Grün- oder Blaubilder. Auf diese Weise wurden die "bunten Hunde" erzeugt.
Rot- ,Grün- und Blaubilder enthalten jeweils nur einen Farbwert des Orginalbildes.
 

Histogramme

Das Bild des roten Hundes besteht lediglich aus roten Farbwerten.  Mit der Java Methode getRed()  läßt sich der  Farbwert  jedes Bildpunktes (Pixel) auslesen und liefert einen Wert  im Bereich von 0-255.  Wird nun auf der X-Achse die Menge aller möglichen Farbwerte (0-255) und auf der dazugehörigen y-Achse jeweils, wie oft  ein spezieller Farbwert im Bild gefunden wurde, aufgetragen, dann entsteht ein Histogramm.

Histogramm des roten und grünen Hundes.  Auf der y-Achse läßt sich ablesen, wie oft ein einzelner Farbwert  im jeweiligen Bild vorhanden ist. Wenn man alle Werte der Y-Achse durch den größten vorhandenen Wert teilt, dann liegen die Häufigkeiten zwischen 0 und 1. Dies nennt man Normierung.

Ein Histogramm h eines Bildes b ist eine Abbildung von der Menge W des Farbereichs auf das Intervall [0,1].  Derjenige Farbwert  (g), der am häufigsten vorkommt, erhält den Wert 1. Ein Farbwert, der überhaupt nicht vertreten ist, würde den Wert 0 zugewiesen bekommen.
Definition:  Histogramm h
h: W → [0,1]
W: Farbbereich
[0,1] Zahlenintervall von 0 bis 1.
   
mit h(g) = Menge aller Pixel mit dem Farbwert g

Gesamtpixelzahl des Bildes
   


 

Histogramme und Rot-, Grün-, und Blaubilder werden im Aufgabenbereich "Java" behandelt.