Beitrag
von KaoTai » Di Nov 03, 2009 11:31 pm
Den Farben-Raum kannst Du dir als dreidimensionalen Raum vorstellen.
Das RGB-Koordinaten-System entspricht darin den üblichen x-y-z-Koordinaten, also mit senkrecht aufeinander stehenden Achsen.
Du kannst aber die Punkte in diesem Raum (also die Farbwerte) auch in einem anderen Koordinaten-System beschreiben.
Der Farbraum YUV, wie er beim Fernsehen verwendet wird, ist z.B. gegenüber den RGB-Achsen verdreht und schiefwinklig.
Unsere "menschliche" Auffassung von Farben (z.B. blasses Hellblau) entspricht dem Farbraum HSI.
Dabei gibt I die Intensität also Helligkeit an, S die Saturation bzw. Sättigung und H den Hue also den Farbton.
"blasses Hellblau" bedeutet somit: Hoher I-Wert weil "hell", geringer S-Wert weil "blass", H-Wert in Richtung "blau"
Das entspricht im Farbraum einem System von 3-dim Zylinderkoordinaten.
Die Zylinderachse entspricht der Helligkeit und liegt etwa in Richtung der Raumdiagonalen des RGB-System.
Auf dieser Achse liegen alle Grauwerte.
Der Radius, also Abstand von der Achse, ergibt die Farbsättigung.
Der Polwinkel um die Achse entspricht dem Farbton.
Man könnte also eine Änderung der Farbsättigung so programmieren:
Transformiere den Farbwert vom karthesischen RGB-System in die Zylinderkoordinaten HSI.
Je nach dem ob Du die Sättigung erhöhen oder verringer willst, muß man nun nur den S-Wert, also den Abstand von der Zylinderachse vergrößern oder verkleinern - H und I bleiben unverändert.
Und zuletzt transformiert man H S' I wieder zurück in das RGB-System.
In der Praxis wird man sowas aber wohl als Lookup-Table programmieren - wenn man das sonst mit 12 Millionen Pixeln machen wolltel würde der Rechenaufwand doch recht groß.
Wenn das Bild anstatt RGB im Farbraum YUV vorliegt geht es einfacher:
Hier entspricht Y der Helligkeit und U und V sind Farbdifferenzen.
Eine Farbe mit U und V gleich null ist ein Grauton.
D.h. hier müßte man zum Ändern der Sättigung nur U und V mit dem jeweils gleichen Faktor skalieren.