我需要在CIE颜色空间中实现我自己的色调旋转功能。我找不到任何关于这件事的技术描述。我发现了像“在XYZ颜色空间中绕Y轴旋转”这样的高级描述,这是有意义的,因为Y是亮度。
我很快做了一个愚蠢的矩阵旋转:
vec3 xyz = rgb_to_cie_xyz(color.r, color.g, color.b);
vec3 Y_axis = vec3(0,1,0);
mat4 mat = rotationMatrix(Y_axis, hue_angle);
vec4 res_xyz = mat * vec4(xyz, 1.0);
vec3 res = cie_xyz_to_rgb(res_xyz.x, res_xyz.y, res_xyz.z);但后来意识到,更多地了解cie空间是完全错误的。
所以我的问题是: A.如何在CIE/XYZ中旋转色调?
或者B。我应该从XYZ转换到CIE LCH,然后在那里改变H(色调),然后再转换回XYZ吗?(如果我能找到它的函数,听起来很容易,但这是否正确/等效于在XYZ中更改色调?)
或者C。我应该从XYZ转换到这个2D-xy CIE颜色空间吗?你是如何旋转色调的?
编辑
我已经实现了ex 这段代码 (也尝试过另一个来源 & 另一个来源 ),计划从XYZ转换到LCH,改变色调,然后从LCH转换到XYZ。但似乎没有往返的机会。XYZ -实验室- XYZ - RGB工作正常,看起来完全一样。但XYZ - LAB - LCH - LAB - XYZ - RGB断裂;结果颜色与源颜色完全不同.它是不是意味着不能这样使用(例如,它只是一种方式?),我误解了什么?
vec3 xyz = xyzFromRgb(color);
vec3 lab = labFromXyz(xyz);
vec3 lch = lchFromLab(lab);// doesn't work
//lch.z = lch.z + hue;
lab = labFromLch(lch);// doesn't work
xyz = xyzFromLab(lab);
vec3 rgb = rgbFromXyz(xyz);我的完整代码:https://github.com/gka/chroma.js/issues/295
资源:
XYZ系统是基于颜色匹配实验的。X,Y和Z是为避免负数而从数学上产生的RGB的外推,称为三刺激值。此模型中的X值表示颜色的红色/绿色部分。Y-值近似表示亮度,Z-值大致对应于蓝色/黄色部分。
L_C_h颜色空间,类似于CIELAB,是一些行业专业人士的首选,因为它的系统与人眼对颜色的感知有很好的关联。它与L_a_b*颜色空间具有相同的图解,但使用柱面坐标代替直角坐标。 在这个颜色空间中,L*表示亮度,C*表示色度,h表示色调角。色度C*的值是与亮度轴(L*)之间的距离,从中心的0开始。色调角从+a*轴开始,以度表示(例如,0°is +a*或红色,90°is +b或黄色)。
发布于 2022-04-09 22:53:50
CIE颜色有很多表示和子表示,而且它没有在技术上或在互联网上得到一致的解释。在阅读了许多资料来源和检查了许多项目后,才能在清晰的图片上达成一致。正如Giacomo在评论中所说,是的,改变色调的唯一方法似乎是从CIE XYZ转到CIE实验室,然后进入圆柱形色调移位表示,即CIE LCH。
从(RGB -) XYZ到LAB - LCH - LAB - XYZ (- RGB)的转换只是为了改变色调,这是正常的,在任何地方都是这样,尽管很难在网上找到具体表示“在CIE颜色空间中改变色调”的项目/代码,或者在其中甚至有" hue“这个词。同样奇怪的是,在github上找不到从XYZ到LCH或HSV到LCH的直接转换的任何东西,因为有多少项目链接中间步骤来混合CIE颜色,而且web是过渡到使用LCH颜色空间。
我在搜索lablch:https://www.shadertoy.com/view/lsdGzN时发现了这个出色的着色玩具,它提供了高效和合并的XYZ到LCH和LCH到XYZ转换。❤️
虽然它里面有很多神奇的数字,所以通过使用它,我仍然没有弄清楚我的代码/端口有什么问题,但是其他人也有问题。。我做的是正确的atan2,正确的浮动,矩阵的正确,等等。当我找到答案的时候,我会更新我的答案。
编辑,这里的问题似乎是信息的丢失,通过所有这些颜色空间和许多假设或近似必须恰到好处的往返。影子玩具人很狡猾地做了一些魔术。当我需要的时候必须进一步调查。
https://stackoverflow.com/questions/71763970
复制相似问题