Java中的RGB到CIEXYZ

时间:2015-08-06 12:10:31

标签: java colors rgb color-space

我正在尝试将 RGB 颜色转换为 CIEXYZ ,最终想将它们转换为CIELAB但是我遇到了 java.awt的问题.color.ColorSpace.CS_CIEXYZ 色彩空间。

在线使用计算器我得到的值与Color Space提供的值不同

代码:

5.1.*

输出:

  

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 :(得分:1)

您看到的是Java类根据 CIE标准光源D50 进行色彩调整的结果。

使用Colour,例如,在保持 sRGB colourspace光源( 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]

通常将光源标准化为 Luminance ,这就是我们的计算中 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]