【问题标题】:How to colorize via HSL colors?如何通过 HSL 颜色着色?
【发布时间】:2011-07-27 13:43:56
【问题描述】:

我有一个复杂的问题,但可以通过这个小问题来解决。我想做一个着色器,它可以按像素工作。

我为图片定义了一个基色(图片有一些像素是这个颜色的,还有很多其他像素接近这个颜色):

Hex: #188DD9
HSL: 204° 80% 47%
RGB: 24 141 217

我知道我的目标基色

Hex: #23752E
HSL: 128° 54% 30%
RGB: 35 117 46

所以,我想给图像上色。

我的假设是,如果我在这两个 HSL 值中找到相关性,我可以 逐像素着色我的图片。

目前我发现,如果我用(目标色调 - 基础色调)= -76 移动基础色调,色调会很好。

你能指导我解决这个问题的饱和度和亮度之间的联系在哪里吗?

【问题讨论】:

    标签: colors hsl


    【解决方案1】:

    我假设,无论您最终使用什么映射,您都希望将黑色映射到黑色、白色到白色以及灰色到灰色。

    加法映射

    H' = H + (Htarget - Hbase)

    (带有环绕)您用于色调的确实可能很好。对于饱和度,需要保留灰度值建议使用乘法映射

    S' = S * (Starget / Sbase),

    超过 100% 饱和度的值被剪裁。但是,对于亮度,线性贴图是行不通的,因为您想在调整中间值的同时修复 0% 和 100% 的亮度。一个自然的选择可能是 gamma-type 映射,即

    L' = pow( L, log(Ltarget) / log(Lbase) ) = exp( log(L) * log(L目标) / log(Lbase) ).

    其中亮度值缩放到 0 和 1 之间。(注意:要为大量像素有效计算此映射,您可能需要预先计算一个包含 256 个条目的查找表。)

    当然,您可以使用许多其他地图,但我会从这些地图开始,看看它们是否能提供足够好的结果。请注意,最终结果的质量也可能受到 HSL 颜色空间的感知不均匀性的限制;详情请见this Wikipedia page

    【讨论】:

    • 谢谢!它工作得很好。我只做了一项改进。对于一些接近最终颜色(红色或绿色或蓝色)的目标值,着色后出现错误的颜色。改进是: if(S > Sbase) S = Sbase;在计算 S'之前
    • 您是否第一次尝试使用if (S' > Smax) S' = Smax;,其中 Smax 是您的最大有效饱和度(通常为 1.0、100 或 255)。附言。我建议使用长整数或浮点数进行中间计算,否则您可能会被算术溢出所困扰。另外,如果使用整数,请记住在除法之前先进行乘法运算。
    • 不,我没试过。现在我尝试了,它产生了相同的结果,你的解决方案是合乎逻辑的。 :) 再次感谢您!
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 2023-03-19
    • 2015-08-31
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多