Math RGB和RYB颜色空间之间的转换

Math RGB和RYB颜色空间之间的转换,math,rgb,interpolation,newtons-method,Math,Rgb,Interpolation,Newtons Method,我目前正在尝试在RGB(红、绿、蓝)颜色空间和RYB(红、黄、蓝)颜色空间之间转换颜色,然后再转换回来 基于本文中的细节,我能够使用三线性插值将RYB转换为RGB,其中参数权重(s、t、u)是RYB颜色,立方体的顶点是RGB空间中的3d点 -第2.1节-实现细节 我的困难在于逆转转换过程 第二篇文章引用了该技术的使用,并指出反向转换是使用牛顿法实现的。但没有提供进一步的细节。这可能表明在求解三线性插值方程时寻找根 在我用方程展开这个问题之前,有没有人见过,或者用Java/C/C++/C#这样的

我目前正在尝试在RGB(红、绿、蓝)颜色空间和RYB(红、黄、蓝)颜色空间之间转换颜色,然后再转换回来

基于本文中的细节,我能够使用三线性插值将RYB转换为RGB,其中参数权重(s、t、u)是RYB颜色,立方体的顶点是RGB空间中的3d点

-第2.1节-实现细节

我的困难在于逆转转换过程

第二篇文章引用了该技术的使用,并指出反向转换是使用牛顿法实现的。但没有提供进一步的细节。这可能表明在求解三线性插值方程时寻找根

在我用方程展开这个问题之前,有没有人见过,或者用Java/C/C++/C#这样的语言解决过这个问题


我目前的方法是采用三线性插值(RYB到RGB)的正向方程,展开并重新排列,以提供3个未知量(参数权重:s、t和u)的3个联立方程,然后使用牛顿-拉斐逊方法找出根。我这样做对吗?

我最终设法解决了这个问题

取三线性插值的方程式:

将第一个方程式替换为最后一个方程式,展开并收集系数: Xd,Yd,Zd,XdYd,XdZd,YdZd,ZdYdZd和常数

然后求方程在三个维度中的偏微分,每个维度关于Xd,Yd和Zd。使用这些新方程填充(3x3)雅可比矩阵,然后使用牛顿法在软件中求解


UIColor上的一个类别也做了同样的事情,返回RGB、RYB和CMYK之间的元素。此外,您可以在各自的颜色空间中混合任意数量的颜色(当然,它们的混合方式会有所不同,具体取决于具体情况)

我发现了基于三次样条的RYB->RGB转换。这是我的Lua端口(所有值都在0-1之间):


你试过mathoverflow.com吗?@sje397:我在mathoverflow.com上看过了,但没有看到任何关于三线性插值或其反向过程的内容。-刚意识到你也可以试着问这个问题。注意,对于RGB坐标的插值,三线性插值往往是一个非常糟糕的选择。这是因为中性粒子位于RGB空间中立方体的主对角线上。你经常会看到很大的插值误差,恰恰是在你的大脑可以看到的颜色的细微误差上。你为Gossett和Chen链接的论文似乎在插值坐标上有一个输入错误。这是本文的后一个版本:这里有更多的说明:正如他所说的,问题是做逆运算,rgb->ryb蓝色分量值是错误的。
local ryb2rgb = function( R, Y, B ) 
  local R, Y, B = R*R*(3-R-R), Y*Y*(3-Y-Y), B*B*(3-B-B)
  return 1.0 + B * ( R * (0.337 + Y * -0.137) + (-0.837 + Y * -0.163) ),
    1.0 + B * ( -0.627 + Y * 0.287) + R * (-1.0 + Y * (0.5 + B * -0.693) - B * (-0.627) ),
    1.0 + B * (-0.4 + Y * 0.6) - Y + R * ( -1.0 + B * (0.9 + Y * -1.1) + Y )
end