Digital Signal Processing Reference
In-Depth Information
12.3
Colorimetrische
Farbr aume
36
// class
Lab_ColorSpace
(continued)
37
38
// CIELab → XYZ
Programm 12.11
Implementierung der Klasse
Lab ColorSpace
zur Reprasenta-
tion des L
∗
a
∗
b
∗
-Farbraums (
Fort-
setzung
). Die Konvertierung vom
L
∗
a
∗
b
∗
-Farbraum nach CIEXYZ
(Gl. 12.51) ist durch die Methode
toCIEXYZ()
und die zugehorige
Hilfsfunktion
f2()
realisiert. Die
Methoden
fromRGB()
und
toRGB()
fuhren die Konvertierung von L
∗
a
∗
b
∗
nach sRGB in 2 Schritten uber den
CIEXYZ-Farbraum durch.
public float[] toCIEXYZ(float[] Lab) {
39
double yy = ( Lab[0] + 16 ) / 116;
40
float X = (float) (Xref * f2(Lab[1] / 500 + yy));
41
float Y = (float) (Yref * f2(yy));
42
float Z = (float) (Zref * f2(yy - Lab[2] / 200));
43
return new float[] {X,Y,Z};
44
}
45
46
47
double f2 (double c) {
double c3 = Math.pow(c, 3.0);
48
if (c3 > 0.008856)
49
return c3;
50
else
51
return (c - 16.0 / 116) / 7.787;
52
}
53
54
55
// sRGB → CIELab
public float[] fromRGB(float[] sRGB) {
56
ColorSpace sRGBcs = ColorSpace.getInstance(CS_sRGB);
57
float[] XYZ = sRGBcs.toCIEXYZ(sRGB);
58
return this.fromCIEXYZ(XYZ);
59
}
60
61
62
// CIELab → sRGB
public float[] toRGB(float[] Lab) {
63
float[] XYZ = this.toCIEXYZ(Lab);
64
ColorSpace sRGBcs = ColorSpace.getInstance(CS_CIEXYZ);
65
return sRGBcs.fromCIEXYZ(XYZ);
66
}
67
68
69
}
// end of class
Lab_ColorSpace
Mit diesen Profildaten kann ein Farbraumobjekt erzeugt werden,
mit dem aus den Bilddaten des Scanners entsprechende Farbwerte in
CIEXYZ oder sRGB umgerechnet werden, wie folgendes Beispiel zeigt:
1
ICC_ColorSpace scannerCS =
2
new ICC_ColorSpace(ICC_ProfileRGB.getInstance("scanner.icc"
));
3
float[] RGBColor = scannerCS.toRGB(scannerColor);
4
float[] XYZColor = scannerCS.toCIEXYZ(scannerColor);
Genauso kann naturlich uber den durch das ICC-Profil definierten Far-
braum ein sRGB-Pixel in den Farbraum des Scanners oder des Monitors
umgerechnet werden.