Eines der wichtigsten Instrumente zur Wahrnehmung unserer Umgebung ist das Auge. Es liefert eine enorme Fülle von Informationen und stellt (noch) unsere meist einzige Möglichkeit dar, mit einem Rechner zu arbeiten. Darum sollte man gerade bei der Gestaltung von Benutzeroberflächen diesen speziellen Aspekt der Mensch-Maschine-Kommunikation nie unterschätzen. Fehler in diesem Bereich führen meist zu verringerter Akzeptanz seitens des Benutzers bzw. gesenkter Effizienz des Systems.
Als Beispiel sollen hier nur die Ermüdung des Auges oder das Nachlassen der Konzentration genannt werden, die eintreten, wenn eine falsche Farbverwendung das Auge ermüdet oder Informationen geschickt versteckt, anstatt sie hervorzuheben. Um derartige Fehler vermeiden zu helfen, habe ich in Tabelle 1 einige Richtlinien gesammelt, die bei der Verwendung von Farben zu beachten sind.
Unter Licht verstehen wir bekannterweise Wellen aus einem ganz bestimmten Bereich des elektromagnetischen Spektrums, nämlich dem von 380 nm bis 780 nm (1 nm = 1 Nanometer = 1 milliardstel Meter). Dieses Fenster nennen wir das Farbspektrum, es erstreckt sich von langwelligem Rot bis zu kurzwelligem Violett und überstreicht dabei alle Regenbogenfarben in eben dieser Reihenfolge.
Wahrzunehmendes Licht muß von einer Lichtquelle (mit charakteristischem Spektrum) ausgestrahlt werden und entweder direkt oder auf dem Umweg über die reflektierenden Oberflächen eines oder mehrerer Objekte (mit charakteristischen Absorptionsspektren) unser Auge treffen, wo es von der Linse gebündelt und auf die Netzhaut projiziert wird. Dort wird es von lichtempfindlichen Rezeptoren in neuronale Aktivitäten umgesetzt und an das Gehirn weitergeleitet.
Dummerweise führt die Linse keine Farbkorrektur durch, d.h. sie bündelt unterschiedliche Wellenlängen unterschiedlich stark, so daß zu gegebener Zeit immer nur eine Wellenlänge scharf zu sehen ist. Bei sehr reinen Farben führt dies zu Ermüdungserscheinungen des Auges, da es ständig refokussiert, um jede Farbe scharf zu sehen. Glücklicherweise nimmt dieser Effekt bei nachlassender Reinheit der Farben wieder ab. Die eigentlichen Lichtsensoren sind helligkeitsempfindliche Stäbchen sowie farbempfindliche Zäpfchen, die zu diesem Zweck genau eines von drei verschiedenen Fotopigmenten tragen. Der Einfachheit halber werden diese Pigmente häufig nach der Farbe benannt, bei der sie am empfindlichsten sind, nämlich Blau, Grün und Rot (eigentlich Gelb, aber Rot hat sich nun mal eingebürgert).
Eine monochrome Wellenlänge ruft ein ganz bestimmtes Verhältnis der neuronalen Aktivitäten dieser Pigmente hervor, aus dem das Gehirn die Farbe bestimmt. Die Eigenschaft, daß genau dieses Verhältnis nicht unbedingt durch eine einzige Wellenlänge, sondern möglicherweise auch durch ein Gemisch verschiedener Wellenlängen hervorgerufen wird, wird bei der technischen Reproduktion ausgenutzt (additive Farbmischung).
Die eigentliche Farbempfindung läßt sich durch mehrere Parameter charakterisieren.
Die „Farbe“ bezeichnet die dominante Wellenlänge des wahrgenommenen Spektrums. So erstreckt sich z.B. das Spektrum einer reifen Tornate über den ganzen sichtbaren Bereich, hat aber bei 640 nm sein Maxi mum, so daß die Tomate rot erscheint. Existiert eine solche dominante Wellenlänge, spricht man von chromatischer Wahrnehmung. Andernfalls sind alle Wellenlängen des Spektrums gleich stark vertreten, und wir sprechen von achromatischer Wahrnehmung. Statt einer Farbe gibt es dann eine „Graustufe“ zwischen Schwarz und Weiß, die den Anteil des reflektierten Lichts angibt. Dieser Anteil ist unabhängig von der Intensität des Lichts, die deswegen durch den Parameter „Helligkeit“ angegeben wird. Als letztes bleibt noch die „Sättigung“ oder „Reinheit“ der Farbe. Sie ist abhängig von der Anzahl der an der Wahrnehmung beteiligten Wellenlängen: Je breiter der Bereich ist, umso ungesättigter oder ausgewaschener erscheint die Farbe.
Durch diese Parametrisierung wird ein Zusammenhang zwischen physikalischen und psychologischen Variablen hergestellt, der jedoch in den meisten Fällen äußerst unregelmäßig und außerdem auch noch subjektiv ist. Probleme bei der rechnerinternen Darstellung und Benutzung sind damit vorprogrammiert. Ein kleines aber interessantes Beispiel soll das verdeutlichen:
Der Mensch kann in etwa 350.000 Farben unterscheiden. Ein sogenanntes True-Color-System benutzt aber im allgemeinen 24 Bit zur Darstellung einer Farbe, also 8 Bit pro Primärfarbe; 19 Bit würden jedoch rechnerisch mehr als ausreichen. Das kommt daher, daß je nach dargestellter Farbe eine Primärfarbe um bis zu 20 oder 30 Schritte verändert werden muß, um eine andere Farbe zu erzeugen. Andererseits gibt es aber auch Farben, bei denen bereits ein Schritt zu einer Veränderung führt.
Grundlage jeder (mir bekannten) technischen Farbreproduktion sind das additive und das subtraktive Farbmodell. Beide nutzen jene bereits angesprochene Eigenschaft, daß eine Farbe durch eine Kombination verschiedener anderer Farben erzeugt werden kann. Meist werden dafür drei Grund- oder Primärfarben benutzt, obwohl es zw ei oder mehr als drei auch tun würden. Mit Hilfe dieser Primärfarben können dann ganze Farbpaletten erzeugt werden, die einen großen Teil (aber nicht alle) der wahrnehmbaren Farben beinhalten.
Bei der additiven Farbmischung geht man von Schwarz aus und mischt die Primärfarben mit derartigen Intensitäten hinzu, daß die sich daraus ergebende Mischung, sprich Addition aller vorhandenen Wellen, mit dem gewünschten Spektrum übereinstimmt. Dieses Prinzip wird vor allem in Kathodenstrahlröhren, also Monitoren, Bildschirmen und Fernsehern verwendet.
Bei allen nichtleuchtenden Objekten, wie Farbkopien oder Druckerzeugnissen, muß dabei ein kleiner Umweg eingeschlagen werden. Hier kommt die subtraktive Farbmischung zum Zuge. Ausgehend von der Annahme, daß weißes Licht das Objekt beleuchtet (was meistens der Fall ist), werden Farben aufgetragen, die gerade die unerwünschten Wellenlängen aus dem Spektrum entfernen. Hat man also z.B. die Farben Cyan und Gelb gemischt, wird vorwiegend Grün reflektiert, da die anderen Wellenlängen von mindestens einer der beiden Farben absorbiert worden sind.
Die direkte Umsetzung dieser beiden Prinzipien sind das RGB-Modell für die additive und das CMY-Modell für die subtraktive Farbmischung. Beide Modelle benutzen drei Primärfarben, nämlich Rot, Grün und Blau bzw. Cyan, Magenta und Gelb. Eine Farbe wird durch ein Tripel (R,G,B) bzw. (C,M,Y) charakterisiert, wobei R,G,B bzw. C,M,Y zwischen 0 und 1 liegen und den Anteil der jeweiligen Primärfarbe angeben. Beide Modelle sind im Einheitswürfel (Abbildung 1 bzw. 2) darstellbar, wobei die Verbindungsstrecke von Schwarz und Weiß die Grauskala bildet. Ein kontinuierlicher Übergang mit n Farbstufen zwischen zwei beliebigen Farben läßt sich erreichen, indem man beide Punkte durch eine Strecke verbindet und in n+1 gleich lange Stücke unterteilt. Allerdings sind beide Modelle bezüglich der Wahrnehmung nicht gleichförmig, wie oben bereits am Beispiel eines 24-Bit-Systems beschrieben wurde. Man beachte, daß alle internen Modelle zur Darstellung von Farbe im Endeffekt doch auf eines dieser beiden Modelle zurückgreifen, um eine Farbe auszugeben. Die Umrechnung zwischen beiden Modellen ist übrigens denkbar einfach, man braucht lediglich den Wert des einen Modells vom Einheitsvektor abzuziehen, um den Wert des anderen Modells zu erhalten. Also:
(R,G,B) = (1,1,1) - (C,M,Y) = (1-C,1-M,1-Y) und
(C,M,Y) = (1,1,1) - (R,G,B) = (1-R,1-G,1-B)
Alternative Farbmodelle wurden deshalb entwickelt, um eine möglichst komfortable Auswahl einer Farbe zu ermöglichen. Ausgangspunkt waren dafür vor allem intuitive Methoden, nach denen z.B. ein Maler seine Farben mischt. Die Vorgehensweise ist dabei folgende: Zuerst wird eine reine Farbe ausgewählt, die anschließend durch Hinzumischen von Schwarz in ihrer Helligkeit und von Weiß in ihrer Reinheit vermindert wird.
Das HSV-Modell benutzt die drei Parameter Farbe (hue), Sättigung (saturation) und Helligkeit (value). Die Farbe wird als Winkel zwischen 0° und 360° angegeben, wobei 0° der Farbe Rot entspricht. Komplementärfarben liegen somit 180° auseinander. Die Sättigung gibt das Verhältnis von tatsächlicher zu maximaler Reinheit an und liegt damit zwischen 0 und 1. Letzteres gilt auch für die Helligkeit, so daß Schwarz der 0 und Weiß der 1 entspricht. Die Darstellung (Abbildung 3) entsteht, indem man den RGB-Einheitswürfel entlang der Grauskala projiziert und das dabei entstandene Sechseck als Basis einer Pyramide benutzt. Die Grauskala liegt offensichtlich genau an der vertikalen Achse V (bei S=0). Farben an der Basis haben die höchste Helligkeit (V=1), die reinsten Farben (V=S=1) unterscheiden sich nur im Farbwinkel. Die Farbauswahl geschieht wie oben beschrieben, wobei das Hinzumischen von Schwarz einer Reduktion von V und das Hinzumischen von Weiß einer Reduktion von S entspricht. Allerdings hat dieses System den Nachteil, daß Helligkeitsänderungen eine Änderung der Sättigung bewirken und Farbübergänge keine Strecken mehr sind. Die Umrechnung ins RGB-System kann Listing 1 entnommen werden.
Das HLS-Modell ist dem HSV-Modell sehr ähnlich. Es benutzt auch die Parameter Farbe (hue), Helligkeit (lightness) und Sättigung (saturation) mit gleichen Wertebereichen, allerdings entspricht der Farbwinkel 0° der Farbe Blau, und die maximale Sättigung liegt bei L=0.5 (siehe Abbildung 4). Die Darstellung des HLS-Systems als Doppelkegel entsteht aus der Pyramide des HSV-Systems durch Hochziehen des Weiß-Punktes. Aufgrund seiner Entstehung hat das HLS-Modell auch alle Eigenschaften des HSV-Modells geerbt. Die Umrechnung ins RGB-System kann wiederum Listing 1 entnommen werden.
Ein ganz anderer Weg der Farbauswahl wurde beim CNS-Modell eingeschlagen. CNS steht dabei für Colour Naming System. Dieses Modell erlaubt dem Benutzer, die gewünschte Farbe in seiner natürlichen Sprache zu beschreiben. Auch hier sind die grundlegenden Parameter die Farbe, die Sättigung und die Helligkeit, die durch einen zusammengesetzten Ausdruck wie „sehr dunkles, gemäßigtes Grün“ beschrieben werden.
Die Helligkeit kann die Werte „sehr dunkel“, „dunkel“, „mittel“, „hell“ und „sehr hell“, die Sättigung die Werte „gräulich“, „gemäßigt“, „stark“ und „lebendig“ annehmen. Für die achromatische Skala stehen die Grautöne „Schwarz“, „sehr dunkles Grau“, „Dunkelgrau“, „Grau“, „Hellgrau“, „sehr helles Grau“ und „Weiß“, für die chromatische Skala die Farbtöne „Violett“, „Blau“, „Grün“, „Gelb“, „Braun“, „Orange“ und „Rot“ zur Verfügung. Da sieben Farbtöne aber nicht ausreichen, wurden außerdem halbe und viertel Farbtöne eingeführt. Halbe Farbtöne entstehen durch Zusammensetzen zweier Farben z.B. „Rot-Orange“, viertel Farbtöne entstehen durch Anhängen des Suffixes „-lich“ z.B. „Rötlich-Orange“. Abbildung 5 zeigt die CNS-Farbnamen auf dem HLS-Farbenkreis, wobei allerdings Braun fehlt, da es als dunkles, gräuliches Orange dargestellt werden kann. Auf diese Weise sind etwa 630 Farben darstellbar.
Als letztes Farbmodell will ich hier noch das Munsell-System erwähnen, das eingeführt wurde, um Farbe, Helligkeit und Sättigung so zu skalieren, daß der Unterschied in der Wahrnehmung in jeder Dimension in gleiche Schritte aufgeteilt ist.
was bei keinem der bisher vorgestellten Modelle der Fall ist. Offenbar müssen zu diesem Zweck die Eigenschaften des menschlichen visuellen Systems in das Munsell-System eingehen. Dementsprechend erfolgt die Definition dieses Systems durch Veröffentlichung von Tabellen, die Schnitten durch den dreidimensionalen Körper entsprechen, der aufgrund seiner Definition einem ziemlich verzerrten Fußball ähnelt. Eine Implementation auf einem Rechner würde also im wesentlichen aus einer umfangreichen Tabellensammlung bestehen.
Für all jene, deren Interesse an einem solchen Artikel im wesentlichen daraus besteht, praktisch Nutzbares für die tägliche Sitzung am heimischen Rechner zu erfahren, habe ich wie bereits erwähnt in Tabelle 1 einige Richtlinien gesammelt, die man bei der Verwendung von Farbe in eigenen Programmen tunlichst beachten sollte. Des weiteren finden sich in Listing 1 einige Routinen zum Umrechnen zwischen den einzelnen Farbmodellen, die, so hoffe ich, zum Verständnis ausreichend dokumentiert sind. Da das RGB-Modell mit Einheitskoordinaten rechnet, das VDI aber Werte zwischen 0 und 1000 verwendet, habe ich außerdem noch zwei Routinen zum Umrechnen zwischen beiden Varianten spendiert.
Literatur:
Fellner, Wolf-Dietrich. Computer Graphik: BI-Wiss. Verlag, 1988.
' ***********************************************
' Umrechenroutinen fur die Farbmodelle
' geschrieben in GFA-BASIC 3.5
' (c) 1992 MAXON Computer
' ***********************************************
PROCEDURE rgb_nach_vdi(r,g,b, VAR rot%, gruen%, blau%)
'
' Transformation: RGB --> VDI-RGB
'
' Eingabe:
'
' r,g,b - die Koordinaten der Farbe
' im RGB-Einheitswurfel
' r,g,b + [0,1]
'
' Ausgabe:
'
' rot,gruen,blau - die Farbintensitäten
' fürs VDI
' rot,gruen,blau + {0,1,...,1000}
'
rot%=ROUND(1000*r)
gruen%=ROUND(1000*g)
blau%=ROUND(1000*b)
RETURN
'
PROCEDURE vdi_nach_rgb(rot%,gruen%,blau%,VAR r,g,b)
'
' Transformation: VDI-RGB —> RGB
'
' Eingabe:
'
' rot,gruen,blau - die Farbintensitäten
' fürs VDI
'
' rot,gruen,blau + {0,1, ...,1000}
'
' Ausgabe:
'
' r,g,b - die Koordinaten der Farbe
' im RGB-Einheitswürfel
' r,g,b + [0,1]
'
r=rot%/1000
g=gruen%/1000
b=blau%/1000
RETURN
'
'
PROCEDURE rgb_nach_cmy(r,g,b,VAR c,m, y)
'
' Transformation: RGB CMY
'
' Eingabe:
'
' r,g,b - die Koordinaten der Farbe
' im RGB-Einheitswürfel
' r,g,b + [0,1]
'
' Ausgabe:
'
' c,m,y - die entsprechenden Koordinaten
' im CMY-Einheitswürfel
' c,m,y + [0,1]
'
c=1-r
m=1-g
y=1-b
RETURN
'
PROCEDURE cmy_nach_rgb(c,m,y,VAR r,g,b)
'
' Transformation: CMY --> RGB
'
' Eingabe:
'
' c,m,y - die Koordinaten der Farbe
' im CMY-Einheitswürfel
' c,m,y + [0,1]
'
' Ausgabe:
'
' i,g,b - die entsprechenden Koordinaten
' im RGB-Einheitswürfel
' r,g,b + [0,1]
'
r=1-c
g=1-m
b=1-y
RETURN
'
PROCEDURE rgb_nach_hsv(r,g,b,VAR h,s,v)
'
' Transformation: RGB --> HSV
'
' Eingabe:
'
' r,g,b - die Koordinaten der Farbe
' im RGB-Einheitswürfel
' r,g,b + [0,1]
'
' Ausgabe:
'
' h,s,v - die entsprechenden Werte
' im HSV-Modell
' h + [0,360] und s,v + [0,1]
'
' Beachte: Bei s = 0 ist h nicht definiert!
'
LOCAL max_wert,min_wert,diff
'
max_wert=MAX(r,g,b)
min_wert=MIN(r,g,b)
' ! Helligkeit...
v=max_wert
' ! Sättigung...
diff=max_wert-min_wert
IF v=0
s=0 ! schwarz
ELSE
s=diff/max_wert
ENDIF
' ! Farbe...
IF s>0
IF max_wert=r ! max = r:
IF min_wert=g
h=5+(r-b)/diff ! h + [+5,+6]
ELSE
h=1-(r-g)/diff ! h + [0,+1]
ENDIF
ELSE IF max_wert=g ! max = g:
IF min_wert=b
h=1+(g-r)/diff ! h + [+1,+2]
ELSE
h=3-(g-b)/diff ! h + [+2,+3]
ENDIF
ELSE ! max = b:
IF min_wert=r
h=3+(b-g)/diff ! h + [+3,+4]
ELSE
h=5-(b-r)/diff ! h + [+4,+5]
ENDIF
ENDIF
MUL h,60 ! h auf 360 Grad erweitern
ENDIF
RETURN
'
PROCEDURE hsv_nach_rgb(h,s,v,VAR r,g,b)
'
' Transformation: HSV —> RGB
'
' Eingabe:
'
' h,s,v - die Werte der Farbe
' im HSV-Modell
' h + [0,360] und s,v + [0,1]
'
' Ausgabe:
'
' r,g,b - die entsprechenden Koordinaten
' im RGB-Einheitswürfel
' r,g,b + [0,1]
'
LOCAL t1,t2,t3,fract,i%
'
IF s=0 ! schwarz..weiß
r=v
g=v
b=v
ELSE
h=h/60 ! Betrachte 6 Kreisabschnitte
i%=TRUNC(h) ! Nummer des Kreisabschnittes
fract=h-i% ! fract + ]-1,+1[
t1=v*(1-s)
t2=v*(1-(s*fract))
t3=v*(1-(s*(1-fract)))
SELECT i%
CASE 0 ! rot..gelb
r=v ! r dominiert
g=t3
b=t1
CASE 1 ! gelb..grün
r=t2
g=v ! g dominiert
b=t1
CASE 2 ! grün..cyan
r=t1
g=v ! g dominiert
b=t3
CASE 3 ! cyan..blau
r=t1
g=t2
b=v ! b dominiert
CASE 4 ! blau..magenta
r=t3
g=t1
b=v ! b dominiert
CASE 5 ! magenta..rot
r=v ! r dominiert
g=t1
b=t2
ENDSELECT
ENDIF
RETURN
PROCEDURE rgb_nach_hls (r,g,b, VAR h,l,s)
'
' Transformation: RGB --> HLS
'
' Eingabe:
'
' r,g,b - die Koordinaten der Farbe
' im RGB-Einheitswürfel
' r,g,b + [0,1]
'
' Ausgabe:
'
' h,l,s - die entsprechenden Werte
' im HLS-Modell
' h + [0,360] und l,s + [0,1]
'
' Beachte: Bei s = 0 ist h nicht definiert!
'
LOCAL max_wert,min_wert,diff
'
max_wert=MAX(r,g,b)
min_wert=MIN(r,g,b)
' ! Helligkeit...
l=(max_wert+min_wert)/2
' ! Sättigung...
diff=max_wert-min_wert
IF ABS(diff)<1.0E-07
s=0 ! grau
ELSE
IF l<=0.5
s=diff/(max_wert+min_wert)
ELSE
s=diff/(2-max_wert-min_wert)
ENDIF
ENDIF
'
' ! Farbe...
IF s>0
IF max_wert=r ! max = r:
IF min_wert=g ! min = g:
h=1+(r-b)/diff ! h + [+1,+2]
ELSE ! min = b:
h=3-(r-g)/diff ! h + [+2,+3]
ENDIF
ELSE IF max_wert=g ! max = g:
IF min_wert=b ! min = b:
h=3+(g-r)/diff ! h + [+3,+4]
ELSE ! min = r:
h=5-(r-b)/diff ! h + [+4,+5]
ENDIF
ELSE ! max = b:
IF min_wert=r ! min = r:
h=5+(b-g)/diff ! h + [+5,4-6]
ELSE ! min = g:
h=1-(b-r)/diff ! h + [0,+1]
ENDIF
ENDIF
MUL h,60 ! h auf 360 Grad erweitern
ENDIF
RETURN
'
FUNCTION rgb(q1,q2,farbe)
IF farbe>360
SUB farbe,360
ENDIF
IF farbe<60 ! blau..magenta
return=q1+(q2-q1)*farbe/60
ELSE IF farbe<180 ! magenta..gelb
RETURN q2
ELSE IF farbe<240 ! gelb..grün
RETURN q1+(q2-q1)*(240-farbe)/60
ELSE ! grün..blau
RETURN q1
ENDIF
ENDFUNC
'
PROCEDURE hls_nach_rgb(h,l,s,VAR r,g,b)
'
' Transformation: HLS —> RGB
'
' Eingabe:
'
' h,l,s - die Werte der Farbe
' im HLS-Modell
' h + [0,360] und l,s + [0,1]
'
' Ausgabe:
'
' r,g,b - die entsprechenden Koordinaten
' im RGB-Einheitswürfel
' r,g,b + [0,1]
'
LOCAL t1,t2
'
IF l<=0.5
p2=l+l*s
ELSE
p2=l+(1-l)*s
ENDIF
p1=2*l-p2
'
IF s=0 ! schwarz..weiß
r=l
g=l
b=l
ELSE
r=FN rgb(p1,p2,h)
g=FN rgb(p1,p2,h+240)
b=FN rgb(p1,p2,h+120)
ENDIF
RETURN