我必须将XYZ转换为 HunterLab 颜色。我使用此网站计算(http://www.easyrgb.com/en/math.php)尝试了以下代码。问题是我没有得到确切的输出值。
在下面的小提琴我选择这个HEX颜色代码(“#e33054”)。我的HunterLab结果 43.6862,63.8433,16.6580
当我与此网站(http://www.color-hex.com/color/e33054)进行比较时,输出( 43.6863,63.8431,16.6536 )的值略有错误。
我附上了easyrgb.com网站的截图。我已经使用了下面图像中的大部分X,Y,Z值。我需要使用哪些X,Y,Z值如果我想显示正确的确切结果。
$(document).ready(function() {
function RGBtoXYZ(R, G, B)
{
var_R = parseFloat( R / 255 )
var_G = parseFloat( G / 255 )
var_B = parseFloat( B / 255 )
if ( var_R > 0.04045 ) var_R = Math.pow(( ( var_R + 0.055 ) / 1.055 ), 2.4)
else var_R = var_R / 12.92
if ( var_G > 0.04045 ) var_G = Math.pow(( ( var_G + 0.055 ) / 1.055 ), 2.4)
else var_G = var_G / 12.92
if ( var_B > 0.04045 ) var_B = Math.pow(( ( 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
//Observer. = 2°, Illuminant = D65
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
return [X, Y, Z]
}
function XYZtoHunter(X, Y, Z)
{
var_Ka = ( 175.0 / 198.04 ) * ( 100.000 + 98.03894 )
var_Kb = ( 70.0 / 218.11 ) * ( 100.000 + 118.1045 )
Hunter_L = 100.0 * Math.sqrt( Y / 100.000 )
Hunter_a = var_Ka * ( ( ( X / 98.03894 ) - ( Y / 100.000 ) ) / Math.sqrt( Y / 100.000 ) )
Hunter_b = var_Kb * ( ( ( Y / 100.000 ) - ( Z / 118.1045 ) ) / Math.sqrt( Y / 100.000 ) )
return [Hunter_L, Hunter_a, Hunter_b]
}
$("#flat").spectrum({
color: "#fff",
showInput: true,
preferredFormat: "hex6",
change: function(color) {
var xyz = color.toRgbString().replace('rgb(','');
var xyzclr = xyz.replace(')','');
var mystring = xyzclr;
var splits = mystring.split(",");
var bbb = RGBtoXYZ(splits[0], splits[1], splits[2]);
var ccc = XYZtoHunter(bbb[0], bbb[1], bbb[2]);
$(".hunterlb").text("Hunter Lab: " + ccc);
}
});
});
答案 0 :(得分:1)
这可能与计算中的精度问题或各种矩阵和光源数据的舍入方式有关。
参考我使用#e33054 获得的CIE XYZ三刺激值,并使用Colour计算 如下:
[0.343348156796269 0.190877270586848 0.102641996187028]
与http://www.color-hex.com/color/e33054
的 [34.3357 19.0849 10.2616] 不同虽然这是一个值得商榷的问题,但这是一个实际问题,你实际上有一个主要的实现问题,这也影响了你引用的网站,因为你得到了几乎相同的结果:
根据您在RGBtoXYZ
函数中使用的传递函数和转换矩阵,假设您的十六进制值使用sRGB colourspace进行编码。 sRGB使用D65作为光源,其具有如下的CIE XYZ三刺激值:
[95.045592705167152 100.000000000000000 108.905775075987847]
但是,XYZtoHunter
函数使用不同的参考白点,接近 C :
[98.03894 100.000 118.1045]
这是不正确的,您需要使用与用于sRGB到CIE XYZ转换的光源相同的光源,或者将您的三色激励值与XYZtoHunter
函数使用的值进行色彩调整。
我已根据您的测试颜色在各种光源下计算出相应的Hunter Lab值:
RGB: [227.000000000000000 48.000000000000000 84.000000000000000]
XYZ: [0.343348156796269 0.190877270586848 0.102641996187028]
A [46.504499644334125 64.843762706004426 10.523794703973838]
C [43.793566931997233 65.186253736429975 15.569392726793327]
D50 [44.346077037498887 68.520955438240733 13.605094920688586]
D60 [43.868910583037632 67.708490946827283 14.514756461641493]
D65 [43.688755978973106 67.215867228676174 14.862203270379064]
D75 [43.406074307560630 66.195808970976557 15.425166890191013]
F2 [44.802450532649551 68.731031818870903 12.746488963663195]
TL 4 [45.145148163779659 67.238144444096079 12.884252260395227]
UL 3000 [46.368214893847501 65.905510666492106 10.227507087643088]
获取这些值的代码:
import numpy as np
import colour
from colour.notation.triplet import HEX_to_RGB
RGB = HEX_to_RGB('#e33054')
print('RGB: ', np.round(RGB * 255))
print('XYZ: ', colour.sRGB_to_XYZ(RGB))
for name, illuminant in sorted(
colour.HUNTERLAB_ILLUMINANTS['cie_2_1931'].items()):
XYZ = colour.RGB_to_XYZ(
RGB,
colour.ILLUMINANTS['cie_2_1931']['D65'],
colour.XYZ_to_xy(illuminant.XYZ_n),
colour.sRGB_COLOURSPACE.RGB_to_XYZ_matrix,
decoding_cctf=colour.sRGB_COLOURSPACE.decoding_cctf)
print(name, colour.XYZ_to_Hunter_Lab(
XYZ * 100, XYZ_n=illuminant.XYZ_n, K_ab=illuminant.K_ab))