Inhaltsverzeichnis
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.
Pixelzahl eines Bildes
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:
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 Abbildung, bei der jeder Bildpunkt aus der Menge M des Bildbereiches einen Farbwert zugewiesen bekommt.
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( 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)
Color-Objekt
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 |
FSG-Bibliothek: Laden & Anzeigen eines Bildes
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(); } }
Rot-, Grün-, und Blaubilder
Aus dem obigen Bild lässt 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.
Histogramme
Das Bild des roten Hundes besteht lediglich aus roten Farbwerten. Mit der Java Methode getRed() lässt 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.
Ein Histogramm h eines Bildes b ist eine Abbildung von der Menge W des Farbbereichs 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.
- W: Farbbereich
- [0,1] Zahlenintervall von 0 bis 1.
mit $$h(g)=\frac{\text{Menge aller Pixel mit dem Farbwert g}}{\text{Gesamtpixelzahl des Bildes}}$$