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

时间:2011-02-09 13:25:20

标签: math rgb interpolation newtons-method

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

根据以下论文中的细节,我可以使用三线性插值从RYB转换为RGB - 其中参数权重(s,t,u)是RYB颜色,立方体的顶点是3d点在RGB空间。

Paint Inspired Color Mixing and Compositing for Visualisation - Gossett and Chen - 第2.1节 - 实现细节

我的困难在于扭转转换过程。

第二篇论文引用了这种技术的使用,并且还表明使用牛顿法实现了逆转换。但没有提供进一步的细节。这可能表明在求解三线性插值方程时找到了根。

On the Transfer of Painting Style to Photographic Images through Attention to Colour Contrast - Xiaoyan Zhang; Constable, M.; Ying He;

在我用方程扩展这个问题之前,是否有人用Java / C / C ++ / C#等语言看到或解决了这个问题?

我目前的方法是采用三线性插值的正演方程(RYB到RGB),展开和重新排列,为3个未知数(参数权重:s,t和u)提供3个联立方程,然后找出如何找到使用Newton-Raphson方法的根。我是否以正确的方式解决这个问题?

我将很快编辑这个问题以提供方程式。

非常感谢你的时间,

3 个答案:

答案 0 :(得分:3)

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

采用三线性插值的方程式: wikipedia

将第一个等式代入最后一个,展开并收集系数: Xd,Yd,Zd,XdYd,XdZd,YdZd,ZdYdZd和常数。

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

Newton-Raphson Method

答案 1 :(得分:2)

这是UIColor上的一个类别,它做同样的事情,返回RGB,RYB和CMYK之间的元素。此外,您可以在相应的颜色空间中混合任意数量的颜色(当然,它们的混合方式不同)。

https://github.com/ddelruss/UIColor-Mixing

享受,

达明

答案 2 :(得分:1)

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

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