15

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

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

用于可视化的油漆启发颜色混合和合成 - Gossett 和 Chen - 第 2.1 节 - 实现细节

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

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

论绘画风格对摄影图像的关注色彩对比——张晓燕 警员,M.;何英;

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

我目前的方法是采用三线性插值的正向方程(RYB 到 RGB),扩展和重新排列以提供 3 个用于 3 个未知数的联立方程(参数权重:s、t 和 u),然后计算出如何找到根使用牛顿-拉夫森方法。我是否以正确的方式解决这个问题?

4

3 回答 3

6

我最终设法解决了它。

采用三线性插值的方程: 维基百科 编辑:当时的维基百科修订

将第一个方程代入最后一个方程,展开并收集以下系数:Xd、Yd、Zd、XdYd、XdZd、YdZd、ZdYdZd 和常数。

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

牛顿-拉夫森法

于 2011-02-19T14:37:25.507 回答
3

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

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

于 2012-05-03T20:22:26.553 回答
3

我发现这个基于三次样条的 RYB->RGB 转换的JavaScript 实现。这是我的 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
于 2013-11-25T11:13:43.557 回答