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]