photoshop如何将两个图像混合在一起?第2部分:颜色/色相/饱和度滤镜和从RGB到LCH变换的快速变换

时间:2013-01-18 07:54:26

标签: android photoshop blending

如何将Color / hue /饱和度混合应用为Photoshop?我知道,GIMP可以使用HSV / HSL颜色模型,但是使用CIE LCH可以使用Photoshop。色调/颜色/饱和度混合具有HSV / HSL和LCH颜色空间的差异。 原始问题(How does photoshop blend two images together?)适用于HSV / HSL颜色模型。

LCH color model

HSV color model

我想要LCH颜色模型。您可以看到算法RGB到LCH(RGB-XYZ-LAB-LCH):http://dev.vkdev.pro/2013/01/lch-color-model-photoshop-blend-modes.html

正如您所看到的,该算法包含大量的乘法,除法,sqrt,atan2,sin,cos,pow ......而且这种算法在Android设备上工作得非常慢。

如何快速完成从RGB到LCH的转换?

2 个答案:

答案 0 :(得分:0)

您可以采取一些措施来提高转化速度。只需执行sqrt()和平方就可以非常接近地校正伽马校正。由于正确公式中的线性段偏移,它非常接近,我碰巧知道几个使用此快捷方式的专业应用程序。在不支持色彩校准的设备上,如手机,它将足够接近。

Rgb2Xyz()中,乘法和加法只是一个矩阵乘法。如果您在GPU上进行转换(您应该这样做),这将是一行glsl代码。

事实上,在GPU上工作会使大多数这些函数变成更少的代码行,因为它是一个高度并行的矢量处理器。因此Xyz2Lab()中的3分为单行glsl。您可以将3减去并乘以1或2行代码。它具有sqrt()atan2()sin()cos()pow()等功能。

请参阅here for the docs on glsl

答案 1 :(得分:0)

我知道这是一个很老的帖子,但我喜欢在有机会的时候尽可能地回答这些事情,这样下一个人的帮助比我的好......

在我自己的讨伐中,为了在不同的环境中实现相同的混合,我遇到了许多建议中提供的天真数学问题。除非您将LCH​​空间用于其他图像操作,否则可能不值得为此进行转换。你是对的;转换涉及大量的数学运算,如果你要转换回RGB,那么你需要优雅地处理色域外的点。据我所知,这意味着在转换回RGB之前进行数据截断。在转换后截断负像素值和超大像素值将清除图像的黑色和白色区域。问题是在转换之前截断意味着尝试计算给定H和L的最大色度。您可以预先计算并使用LUT,但它的速度并不快。

如果你想要一个颜色模型,它提供良好的(优于HSL)颜色/亮度分离并且行为相似(非临界目的),我建议使用YPbPr。它是一个仿射变换,所以它会更快,并且边界计算很简单,因为RGB色域的面保持平面。边界计算只是线平面交叉数学(如果你想要更高的速度,甚至可以将它们放入LUT。再次,它不如LAB或LUV混合;如果前景高度饱和,您可能会注意到这一点,但如果速度和简单性很重要,那么可能值得考虑。

可能值得研究的东西是HuSL(www.husl-colors.org)。 HuSL是CIELUV的一种形式,其中色度空间被归一化到上述RGB色域的边界。那里提供的WMaxima工作表应该给你一些关于如何计算截断的最大色度的想法。虽然使用HuSL进行颜色混合比HSL更好,但归一化会扭曲色度(S)的表示,因此LUV的均匀性(我们经历所有那些分数指数的原因)都会丢失。这里的实现也是基于CIELUV,而不是CIELAB,尽管除非你进行图像编辑,否则它的后果可能并不重要。

同样,如果示例有任何帮助,我在Mathworks FEX上提供了一个图像混合function,它提供了这些混合,以及HuSL和绑定的LCHab / uv转换工具(以及最大色度)对LCHab和LCHuv的LUT) 它是一个matlab脚本,但数学概念是相同的。

如果您根本不想处理边界色度计算,您可以考虑这样做:

  1. 从图像中提取亮度。只需使用加权平均值即可 无论你想要什么样的luma定义。 [0.299 0.587 0.114] * [R G B]' 是Rec.601 iirc。
  2. HSL中的HS通道交换(GIMP使用HSL 而不是HSV,而不是HSI )。 转换回RGB
  3. 转换为您最喜欢的亮度 - 色度模型(例如YPbPr)并替换 Ÿ'与原来的亮度。转换回RGB。
  4. 这基本上是在图像编辑器中使用图层的常见亮度保存技术的编程方法。这会产生令人惊讶的好结果,并使用常见的转换工具。

    最后,我使用各种颜色模型提供我自己的discussion示例混合:HSV,HSI,HSL,CIELAB(转换前后的截断)和HSL + Y方法。另外:如果你像我一样厚,那么可视化投影RGB空间的几何形状可能有助于更好地理解当你在LCH中的点之间交换色度/亮度信息时所发生的事情(以及必要性)管理OOG色点)

    我发布了更多信息的链接,但我猜他们不允许像我这样的无名小卒。

    编辑: 实际上,我刚刚意识到了什么。如果速度和均匀性很重要,并且可以接受稍微有限的色度范围(可能是UI图形或其他东西),我的YPbPr建议的附录可能是有序的。考虑YPbPr中RGB色域的范围:一个倾斜的立方体,它位于中性轴的角落。该体积的最大旋转对称子集是双锥。截断到这个双锥体而不是立方体面比计算与立方体面的交叉点快得多。混合物更均匀,但最终具有有限的最大色度。有一些HuSL方法在相同的原理(HuSLp)上运行,但是在YPbPr中这样做可以访问比HuSLp更大的RGB空间。实际上有一篇关于在我的博客上做这件事的帖子(例子将它与LAB混合比较),尽管当时我更关注一致性。到目前为止,锥形交叉点计算的速度并没有超出我的想法。