Java中将RGB转换为CIEXYZ

4

我正在尝试将RGB颜色转换为CIEXYZ颜色,并最终希望将其转换为CIELAB颜色,但我在java.awt.color.ColorSpace.CS_CIEXYZ颜色空间中遇到了问题。

使用在线计算器时,我得到的值与颜色空间提供的值不同。

代码:

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

我有什么遗漏或做错了吗?


1
我认为,浮点数范围应该是0.0f .. 1.0f。对于整数来说是0 .. 255。 - Joop Eggen
那么我只需要将它们除以255.0f吗? - MicroHat11
2
当程序员谈论颜色时,他们往往会想到:“嗯,RGB,对吧?那很容易。”当你深入探讨这个话题时,你将面临着50年色度学研究的结果(以及一些奇怪的标准和细节)。例如,在计算器网站上,白点是“日光”,不管那是什么意思。ColorSpace 表明XYZ使用D50。在网站上使用它将导致某些值超出范围(Java可能会夹紧它,或者简单地忽略它并返回该值)。 - Marco13
@MicroHat11 是的,尝试将其缩放到1.0或0.99。请注意这是从内存中获取的信息。 - Joop Eggen
@JoopEggen 这并不容易。每个颜色空间都有自己的最小值和最大值,适用于各个组件(其中一些甚至没有真正严格定义 - 这真的很奇怪...)。 - Marco13
@Marco13 RGB是指红绿蓝三色组合;但实际上边界总是需要注意的,因此我最初提到了255。 - Joop Eggen
1个回答

2
你所看到的是Java类色彩适应到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))

这是一个数字数组,表示颜色的三个参数值。接下来进行同样的转换,但色度适应到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))

通常,光源的亮度被归一化为它们的亮度,这就是为什么在我们的计算中Y等于1,我没有调查为什么Java类不返回归一化值,但快速检查显示它的计算几乎完全正确。
D50 = colour.ILLUMINANTS['cie_2_1931']['D50']

print(colour.sRGB_to_XYZ(sRGB, D50) * 0.98773193)

颜色:[0.95238297 0.98773193 0.81506482] Java:[0.95254517 0.98773193 0.81500244]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接