RGBtoXYZ转换错误

时间:2016-02-07 17:07:13

标签: c math rgb

我无法将RGB转换为XYZ。

遵守此http://easyrgb.com/index.php?X=MATH&H=02#text2 公式是:

var_R = ( R/255 )
var_G = ( G/255 )
var_B = ( B/255 )

if ( var_R > 0.04045 ) var_R = ( ( var_R + 0.055 ) / 1.055 ) ^ 2.4
else var_R = var_R / 12.92
if ( var_G > 0.04045 ) var_G = ( ( var_G + 0.055 ) / 1.055 ) ^ 2.4
else var_G = var_G / 12.92
if ( var_B > 0.04045 ) var_B = ( ( var_B + 0.055 ) / 1.055 ) ^ 2.4
else var_B = var_B / 12.92

var_R = var_R * 100
var_G = var_G * 100
var_B = var_B * 100

X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505

问题是如果我使用Red = 7,Green = 7,Blue = 80,则值是错误的。来自同一站点的XYZ将其计算为

X = 1.612
Y = 0.776
z = 7.654

但是,使用所描述的相同公式,我发现的结果是:

X = 0,60174915012
Y = 0,3723904480
z = 2,3369759394

上面的值与使用excel进行计算的值相同。所以,我不明白我做错了什么。如果我使用网站提供的公式,值是上面的值,但从他们的网站计算,结果是不同的?

如何正确计算RGBtoXYZ的值,以便产生与其计算器相同的值? (假设他们的计算器正在给出正确的值)

注意:Stackoverflow说这是关于pow的重复问题。但它与pow无关,但上面的公式出现错误

1 个答案:

答案 0 :(得分:1)

在C和C ++中,^是按位异或。您可能打算使用pow()

if ( var_R > 0.04045 ) var_R = pow( ( var_R + 0.055 ) / 1.055, 2.4 )
else var_R = var_R / 12.92
if ( var_G > 0.04045 ) var_G = pow( ( var_G + 0.055 ) / 1.055, 2.4 )
else var_G = var_G / 12.92
if ( var_B > 0.04045 ) var_B = pow( ( var_B + 0.055 ) / 1.055, 2.4 )
else var_B = var_B / 12.92