Umwandlung L*a*b* zu RGB

Neue Frage »

pewode Auf diesen Beitrag antworten »
Umwandlung L*a*b* zu RGB
Hallo Mathematiker,

ich bin gerade auf dieses Forum gestoßen und könnte mir vorstellen, das ihr mir vielleicht helfen könntet. Ich habe vor einiger Zeit mal ein kleines Farbmetrikprogramm geschrieben. Was mir aber immer noch darin fehlt ist eine visualisierung der Farben. Da ich in diesem Programm mit L*a*b* Werten arbeite, meine benutzte Programmiersprache (rapidq) aber nur RGB Werte als Farben darstellen kann muß ich L*a*b* in RGB umwandeln. Auf folgender Seite habe ich Algoithmen gefunden:
http://www.cs.rit.edu/~ncs/color/t_convert.html
Demnach muß ich erst mal CIELAB (L*a*b*) in XYZ umwandeln:

Zitat:

XYZ to CIE L*a*b* (CIELAB) & CIELAB to XYZ

CIE 1976 L*a*b* is based directly on CIE XYZ and is an attampt to linearize the perceptibility of color differences. The non-linear relations for L*, a*, and b* are intended to mimic the logarithmic response of the eye. Coloring information is referred to the color of the white point of the system, subscript n.

L* = 116 * (Y/Yn)1/3 - 16 for Y/Yn > 0.008856
L* = 903.3 * Y/Yn otherwise

a* = 500 * ( f(X/Xn) - f(Y/Yn) )
b* = 200 * ( f(Y/Yn) - f(Z/Zn) )
where f(t) = t1/3 for t > 0.008856
f(t) = 7.787 * t + 16/116 otherwise

Here Xn, Yn and Zn are the tristimulus values of the reference white.
The reverse transformation (for Y/Yn > 0.008856) is

X = Xn * ( P + a* / 500 ) 3
Y = Yn * P 3
Z = Zn * ( P - b* / 200 ) 3
where P = (L* + 16) / 116



Danach muß ich dann mittels Matrixberechnung XYZ in RGB umwandeln:

Zitat:

RGB to XYZ & XYZ to RGB

RGB values in a particular set of primaries can be transformed to and from CIE XYZ via a 3x3 matrix transform. These transforms involve tristimulus values, that is a set of three linear-light components that conform to the CIE color-matching functions. CIE XYZ is a special set of tristimulus values. In XYZ, any color is represented as a set of positive values.

To transform from XYZ to RGB (with D65 white point), the matrix transform used is [3]:

[ R ] [ 3.240479 -1.537150 -0.498535 ] [ X ]
[ G ] = [ -0.969256 1.875992 0.041556 ] * [ Y ]
[ B ] [ 0.055648 -0.204043 1.057311 ] [ Z ].

The range for valid R, G, B values is [0,1]. Note, this matrix has negative coefficients. Some XYZ color may be transformed to RGB values that are negative or greater than one. This means that not all visible colors can be produced using the RGB system.

The inverse transformation matrix is as follows:

[ X ] [ 0.412453 0.357580 0.180423 ] [ R ] **
[ Y ] = [ 0.212671 0.715160 0.072169 ] * [ G ]
[ Z ] [ 0.019334 0.119193 0.950227 ] [ B ].

Da ich nicht besonders viel Ahnung von Mathematik habe, bin ich diese Sache nie angegangen. Wäre aber schon chick wenn mein Farbmetrikprogramm Farben darstellen könnte.


Falls von euch jemand lust hat mir zu helfen würde mich das sehr freuen.

Gruß Peter
Ben Sisko Auf diesen Beitrag antworten »
RE: Umwandlung L*a*b* zu RGB
Hab mal einen neuen Thread aus dem Beitrag erstellt.
SirJective Auf diesen Beitrag antworten »

Welche Schwierigkeit hast du mit dieser Umwandlung, pewode?

Soweit ich sehe, fehlt in dem von dir zitierten Text eine Angabe von Xn,Yn,Zn, ohne die natuerlich die Umwandlung nicht moeglich ist.
pewode Auf diesen Beitrag antworten »

Hallo Sir Jective,

So wie ich das verstanden habe sind Xn,Yn,Zn nötig um den richtigen Weißabgleich zu berücksichtigen. Da es mir weniger um die absolut korrekte Darstellung einer Farbe geht, als vielmehr darum den Unteschied zwischen zwei Farben darzustellen, könnte ich die Berücksichtigung des Weißabgleiches vernachlässigen. Hm, ob ich dies erreichen kann indem ich Xn, Yn, und Zn jeweils auf 1 setze? Dann könnte ich doch folgendes machen, oder?:

X = 1 * (((L* + 16) / 116) + a* / 500 ) 3

Y = 1 *(L* + 16) / 116) 3

Z = 1 * ( (L* + 16) / 116) - b* / 200 ) 3

Was hältst Du davon?
pewode Auf diesen Beitrag antworten »

Hallo,

ich habe jetzt im WWW ein Programm gefunden, das die Umrechnung beherrscht. http://perso.univ-lr.fr/pcourtel/html/cours/dea/Munsell.exe
dadurch konnte ich überprüfen ob ich riichtig liege. Ich habe folgende L* a* b* Werte umgerechnet :

L* 51,57
a* 42,14
b* 22,16

und habe folgende xyz Werte erhalten:

x 0,296
y 0,197
z 0,105

Das Programm gibt folgende xyz Werte an:

x 29,08
y 19,77
z 12,41

hm, x und y haben ja nur eine falsche Kommastelle... da könnte ich ja einfach mit 100 multiplizieren. Aber z liegt doch schon etwas daneben. Da die Farbe optisch nicht sehr weit entfernt ist würde ich gern erst mal gern so weiter machen. Ich müßte als nächstes aber unbedingt wissen wie ich diese Matrix berechne:

[ R ] [ 3.240479 -1.537150 -0.498535 ] [ X ]
[ G ] = [ -0.969256 1.875992 0.041556 ] * [ Y ]
[ B ] [ 0.055648 -0.204043 1.057311 ] [ Z ]


Ich habe keine Ahnung von Matritzenberechnung, bitte erklärt mir was ich da machen muß Hilfe
Irrlicht Auf diesen Beitrag antworten »

Hallo pewode,


ist eine Matrixgleichung und gleichwertig zu diesem Gleichungssystem:

r = 1*x + 2*y + 3*z
g = 4*x + 5*y + 6*z
b = 7*x + 8*y + 9*z

Du kannst also aus den gegebenen x,y,z-Werten direkt r, g und b berechnen.

Lieben Gruss,
Irrlicht
 
 
pewode Auf diesen Beitrag antworten »

Vielen Dank für die Hilfe. damit kan ich wirklich was anfangen :]

Bis zum nächsten Matheproblem dann Wink

Peter
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »