首页 文章

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

提问于
浏览
-1

如何将Color /色调/饱和度混合应用为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

    您可以采取一些措施来提高转化速度 . 通过执行 sqrt() 和square可以非常接近地校正伽马校正 . 由于正确公式中的线性段偏移,它支持颜色校准,就像手机一样,它将足够接近 .

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

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

    here for the docs on glsl .

  • 0

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

    在我自己的讨伐中,为了在不同的环境中实现相同的混合,我遇到了一个问题,那就是使用LCH空间进行其他图像操作的天真数学,这可能不值得为此转换成本 . 你有很多数学参与转换,如果你需要优雅地处理超出色域的点数 . 据我所知,这意味着在转换回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转换工具(以及最大色度LUT 's for LCHab and LCHuv) It' sa matlab脚本,但是数学概念是一样的 .

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

    • 从图像中提取亮度 . 只需使用你想要的任何luma定义来加权平均值 . [0.299 0.587 0.114] * [R G B]'是Rec.601 iirc .

    • 在HSL中进行HS通道交换(GIMP使用HSL而不是HSV,而不是HSI) . 转换回RGB

    • 转换为您最喜欢的亮度 - 色度模型(例如YPbPr)并将Y'替换为原始亮度 . 转换回RGB .

    这基本上是在图像编辑器中使用图层的常见亮度保存技术的编程方法 . 这产生了令人惊讶的好结果并使用了常见的转换工具 .

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

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

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

相关问题