RGB 和 RYB 颜色空间之间的转换
Posted
技术标签:
【中文标题】RGB 和 RYB 颜色空间之间的转换【英文标题】:Conversion between RGB and RYB color spaces 【发布时间】:2011-06-24 03:30:39 【问题描述】:我目前正在尝试在 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 个用于 3 个未知数(参数权重:s、t 和 u)的联立方程,然后计算出如何使用 Newton-Raphson 方法求根。我是否以正确的方式处理这件事?
【问题讨论】:
你试过 mathoverflow.com 了吗? @sje397:我查看了 mathoverflow.com,但看不到任何关于三线性插值或其逆过程的信息。 - 刚刚意识到你也可以尝试在那里提问。 您为 Gossett 和 Chen 链接的论文似乎在插值坐标上有错字。这是论文的更新版本:web.siat.ac.cn/~baoquan/papers/ryb_TR.pdf 这里还有一些说明:math.stackexchange.com/questions/305395/… 我在这里的答案中勾勒出了一个(希望是)有效的解决方案:math.stackexchange.com/a/4370750/1020517(部分用代码验证) 【参考方案1】:我终于解决了。
取三线性插值方程: wikipedia 编辑:Wikipedia revision at the time
将第一个方程代入最后一个方程,展开并收集系数: Xd, Yd, Zd, XdYd, XdZd, YdZd, ZdYdZd 和常数。
然后求方程在 3 个维度中的每个维度中关于 Xd、Yd 和 Zd 的偏微分。使用这些新方程填充 (3x3) 雅可比矩阵,然后使用牛顿法在软件中求解。
Newton-Raphson Method
【讨论】:
链接的信息好像没有了。你指的是哪个方程? Wiki 包含所有过去的修订。以发帖日期推测,这大概是我当时看到并使用的修订版:en.wikipedia.org/w/…怕是记不住步骤是什么了。但希望它对你更有意义。【参考方案2】:我发现this javascript implementation 的 RYB->RGB 转换基于三次样条。这是我的 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
【讨论】:
正如他所说,问题在于逆向,rgb -> ryb nishitalab.org/user/UEI/publication/Sugita_IWAIT2015.pdfnishitalab.org/user/UEI/publication/Sugita_SIG2015.pdf【参考方案3】:这是 UIColor 上的一个类别,它做同样的事情,返回 RGB、RYB 和 CMYK 之间的元素。此外,您可以在各自的颜色空间中混合任意数量的颜色(当然,它们的混合方式不同,具体取决于)。
https://github.com/ddelruss/UIColor-Mixing
【讨论】:
以上是关于RGB 和 RYB 颜色空间之间的转换的主要内容,如果未能解决你的问题,请参考以下文章
FFmpeg入门详解之121:颜色空间转换RGB和YUV的原理与实战
pytorchtensor张量vector向量numpy array数组image图像RGB空间LAB空间之间相互转换大全