Digitale Bildverarbeitung

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