Java 中的 RGB 到 CIEXYZ
RGB to CIEXYZ in Java
我正在尝试将 RGB 颜色转换为 CIEXYZ 并最终想将它们转换为 CIELAB 但是我遇到了问题java.awt.color.ColorSpace.CS_CIEXYZ 颜色 Space.
使用在线计算器,我得到的值与颜色提供的值不同 Space
代码:
import java.awt.color.ColorSpace;
import java.util.Arrays;
public class CIEXYZ {
private final static float[] RGB = new float[] {255.0f, 255.0f, 255.0f};
private final static ColorSpace CIEXYZ = ColorSpace.getInstance(ColorSpace.CS_CIEXYZ);
public static void main(String[] args) {
System.out.println("RGB: " + Arrays.toString(RGB));
System.out.println("CIEXYZ: " + Arrays.toString(CIEXYZ.fromRGB(RGB)));
}
}
输出:
RGB: [255.0, 255.0, 255.0]
CIEXYZ: [0.95254517, 0.98773193, 0.81500244]
在线计算器:
http://www.easyrgb.com/index.php?X=CALC
XYZ = 95.050 100.000 108.900
有没有我忽略或做错了什么?
您看到的是 Java class 色彩适应 CIE 标准光源 D50.
的结果
使用 Colour,例如在保持 sRGB 色彩空间光源(CIE 标准光源 D65):
import colour
sRGB = np.array([255., 255., 255.])
sRGB /= 255.
# Default conversion from *sRGB* colourspace
# to *CIE XYZ* tristimulus values.
# It should return *CIE Standard Illuminant D65*
# tristimulus values using the above array.
print(colour.sRGB_to_XYZ(sRGB))
[ 0.95042854 1. 1.08890037]
现在进行相同的转换,但在色彩上适应 CIE 标准光源 D50:
# Conversion to *CIE XYZ tristimulus* values but chromatically adapting
# to *CIE Standard Illuminant D50*.
D50 = colour.ILLUMINANTS['cie_2_1931']['D50']
print(colour.sRGB_to_XYZ(sRGB, D50))
[ 0.96421199 1. 0.82518828]
通常光源被归一化为它们的 亮度 这就是为什么 Y 等于 1在我们的计算中,我没有调查为什么 Java class 没有 return 标准化值,但快速检查表明它的计算几乎是正确的:
D50 = colour.ILLUMINANTS['cie_2_1931']['D50']
print(colour.sRGB_to_XYZ(sRGB, D50) * 0.98773193)
Colour : [ 0.95238297 0.98773193 0.81506482]
Java : [ 0.95254517 0.98773193 0.81500244]
我正在尝试将 RGB 颜色转换为 CIEXYZ 并最终想将它们转换为 CIELAB 但是我遇到了问题java.awt.color.ColorSpace.CS_CIEXYZ 颜色 Space.
使用在线计算器,我得到的值与颜色提供的值不同 Space
代码:
import java.awt.color.ColorSpace;
import java.util.Arrays;
public class CIEXYZ {
private final static float[] RGB = new float[] {255.0f, 255.0f, 255.0f};
private final static ColorSpace CIEXYZ = ColorSpace.getInstance(ColorSpace.CS_CIEXYZ);
public static void main(String[] args) {
System.out.println("RGB: " + Arrays.toString(RGB));
System.out.println("CIEXYZ: " + Arrays.toString(CIEXYZ.fromRGB(RGB)));
}
}
输出:
RGB: [255.0, 255.0, 255.0]
CIEXYZ: [0.95254517, 0.98773193, 0.81500244]
在线计算器:
http://www.easyrgb.com/index.php?X=CALC
XYZ = 95.050 100.000 108.900
有没有我忽略或做错了什么?
您看到的是 Java class 色彩适应 CIE 标准光源 D50.
的结果使用 Colour,例如在保持 sRGB 色彩空间光源(CIE 标准光源 D65):
import colour
sRGB = np.array([255., 255., 255.])
sRGB /= 255.
# Default conversion from *sRGB* colourspace
# to *CIE XYZ* tristimulus values.
# It should return *CIE Standard Illuminant D65*
# tristimulus values using the above array.
print(colour.sRGB_to_XYZ(sRGB))
[ 0.95042854 1. 1.08890037]
现在进行相同的转换,但在色彩上适应 CIE 标准光源 D50:
# Conversion to *CIE XYZ tristimulus* values but chromatically adapting
# to *CIE Standard Illuminant D50*.
D50 = colour.ILLUMINANTS['cie_2_1931']['D50']
print(colour.sRGB_to_XYZ(sRGB, D50))
[ 0.96421199 1. 0.82518828]
通常光源被归一化为它们的 亮度 这就是为什么 Y 等于 1在我们的计算中,我没有调查为什么 Java class 没有 return 标准化值,但快速检查表明它的计算几乎是正确的:
D50 = colour.ILLUMINANTS['cie_2_1931']['D50']
print(colour.sRGB_to_XYZ(sRGB, D50) * 0.98773193)
Colour : [ 0.95238297 0.98773193 0.81506482]
Java : [ 0.95254517 0.98773193 0.81500244]