6 Verarbeitung von Farbe
Farbmodell
Der Zwecke eines Farbmodells ist die Spezifikation von Farben auf eine
standardisierte Art und Weise. Im Prinzip ist ein Farbmodell die Spezifikation
eines Koordinatensystems, in dem eine Farbe durch einen Punkt repräsentiert
wird.
Gebräuchliche Farbmodelle:
- Hardware-orientiert (Bildschirm, Drucker)
- Anwendungs-orientiert (Farbmischen)
RGB-Modell
Jede Farbe wird als additive Mischung der drei Grundfarben Rot, Grün und Blau
definiert.
Ein digitales RGB-Farbbild (Vollfarbbild) besitzt für jeden Bildpunkt drei
Werte, üblicherweise im Bereich von 0 bis 255.
Ein Nachteil des RGB-Farbmodells besteht darin, dass das Mischen von Farben
schwierig ist.
HSI-Modell (ähnlich: HLS-
oder HSV-Modell)
orientiert sich an der Vorgehensweise beim Mischen von Farben in der bildenden
Kunst
Hue: Farbton
Reiner Grundfarbton Zuordnung der Grundfarben zum Wertebereich [0,360]
Saturation: Sättigung
Weißanteil, der die Reinheit einer Farbe beeinflusst Wertebereich: [0,1]
Intensität: Helligkeit
Schwarzanteil, der die Helligkeit beeinflusst Wertebereich: [0,1]
RGB zu Grauwerten
Berechnung
I = 0.3 * Irot + 0.59 * Igrün + 0.11 * Iblau
Die Formel berücksichtigt die
unterschiedliche Empfindlichkeit des Auges für verschiedene Farben (abgeleitet
aus dem Farbmodell von NTSC).
Optimierung auf Geschwindigkeit im Rechner um milisec
I = 0.25 * Irot + 0.5 * Igrün + 0.25 * Iblau
I = Irot>>2 + Igrün>>1 + Iblau>>2
Wenn sie mit BMP Arbeiten wie es meisten für dem Bildschirm gemacht wird
einfach die Palette erst auf 8Bit und dann die Grauwertberechnung, es Spielt
dann keine Rolle wie groß das Bild ist.
Farbreduktion
Aufgabe:
Umwandlung eines gegebenen Farbbildes mit RGB-Werten in ein Farbbild mit
Farbtabelle
Bei einem Farbbild mit Farbtabelle enthält jeder Bildpunkt statt der RGB-Werte
nur einen Index in ein eindimensionales Feld (die Farbtabelle), das die
RGB-Werte enthält.
Beispiel:
Ein RGB-Bild mit 1 Byte pro Farbkanal und 512 x 512 Bildpunkten belegt 512 x 512
x 3 Byte = 768 kByte.
Ein Bild mit einer Farbtabelle mit 256 Einträgen belegt 512 x 512 x 1 Byte = 256
kByte für das Bild und 256 * 3 Byte für die Farbtabelle.
Vorgehensweise
Auswahl einer Farbtabelle
Zuordnung der Farben des Originalbildes zu den Farben der Farbtabelle
Farb-Transformationen
entsprechen den Punktoperationen bei Grauwertbildern
Der Farbwert eines Bildpunktes im Ergebnisbild ist nur abhängig vom Farbwert des
entsprechenden Bildpunktes im Originalbild.
Kontrastverstärkung
Korrektur einer Überbelichtung
Korrektur einer Unterbelichtung
Histogrammglättung
In einem Grauwertbild ist jedem Bildpunkt ein Wert zugeordnet.
Für diese Werte lässt sich leicht ein Histogramm berechnen.
In einem RGB-Farbbild sind jedem Bildpunkt drei Werte zugeordnet.
Die Berechnung und Manipulation eines dreidimensionalen Histogramms ist
aufwendig.
Idee:
Berechnung eines Histogramms für jede der drei Farbkomponenten R, G und B
Manipulation der einzelnen Histogramme Berechnung der neuen Farbwerte
Problem:
Die getrennte Manipulation der Farbkomponenten R, G und B hat deutliche
Farbverschiebungen zur Folge.
Prinzip
Das HSI-Farbmodell ist ideal, um Operationen zur Bildverbesserung durchzuführen,
da die Helligkeitsinformation von den Farbinformationen entkoppelt ist. Daher
können alle für Grauwertbilder vorgestellten Punkt- und lokalen Operationen auch
für Farbbilder eingesetzt werden.
Vorgehensweise
1.Umwandlung des RGB-Bildes in ein HSI-Bild
2.Bearbeitung der I-Komponente wie ein Grauwertbild
3.Umwandlung des HSI-Bildes in ein RGB-Bild
Bewertung
Da die Histogrammglättung dazu führt, dass das Bild deutlich heller wird,
erscheinen auch die Farben etwas anders als im Originalbild.
Obwohl die Farbe und Sättigung unverändert, erscheinen die Farben somit heller.
//RGB zu Grauwert
void getGrauWert(double *rgb) {
double& R = rgb[0];
double& G = rgb[1];
double& B = rgb[2];
R = R*0.3+G*0.59+B*0.11;
//0.3 * Irot + 0.59 * Igrün + 0.11 * Iblau
G = R;
B = R;
}
}
#include <stdio.h>
#include <math.h>
#define PI 3,141592653589793238
void
rgb2hsi(double *hsi, double *rgb) {
double& R = rgb[0];
double& G = rgb[1];
double& B = rgb[2];
double& H = hsi[0];
double& S = hsi[1];
double& I = hsi[2];
double min = R;
if (G < min) min = G;
if (B < min) min = B;
I = (R+G+B)/3.0;
S = 1 - min/I;
if (S == 0.0) {
H = 0.0;
} else {
H = ((R-G)+(R-B))/2.0;
H = H/sqrt((R-G)*(R-G) + (R-B)*(G-B));
H = acos(H);
if (B > G) {
H = 2*PI - H;
}
H = H/(2*PI);
}
}
void
hsi2rgb(double* rgb, double* hsi) {
double& R = rgb[0];
double& G = rgb[1];
double& B = rgb[2];
double& H = hsi[0];
double& S = hsi[1];
double& I = hsi[2];
double r;
double g;
double b;
if (H < 1.0/3.0) {
b = (1-S)/3;
r = (1+S*cos(2*PI*H)/cos(PI/3-2*PI*H))/3.0;
g = 1 - (b + r);
} else if (H < 2.0/3.0) {
H = H - 1.0/3.0;
r = (1-S)/3;
g = (1+S*cos(2*PI*H)/cos(PI/3-2*PI*H))/3.0;
b = 1 - (r+g);
} else {
H = H - 2.0/3.0;
g = (1-S)/3;
b = (1+S*cos(2*PI*H)/cos(PI/3-2*PI*H))/3.0;
r = 1 - (g+b);
}
R = I * r * 3;
G = I * g * 3;
B = I * b * 3;
}