3

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

我为图片定义了基色(图片有一些具有这种颜色的像素和许多其他接近这种颜色的像素):

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

我知道我的目标基色

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

所以,我想为图像着色。

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

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

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

4

1 回答 1

2

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

加法映射

H' = H + (H目标- H)

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

S' = S * (S目标/ S基础),

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

L' = pow( L, log(L target ) / log(L base ) ) = exp( log(L) * log(L target ) / log(L base ) )。

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

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

于 2011-07-27T14:14:37.353 回答