我有一个复杂的问题,但可以通过这个小问题解决。我想制作一个按像素工作的着色器。
我为图片定义了基色(图片中有一些带有此颜色的像素和许多其他像素,这些像素接近此颜色):
Hex: #188DD9
HSL: 204° 80% 47%
RGB: 24 141 217
我知道目标基色:
Hex: #23752E
HSL: 128° 54% 30%
RGB: 35 117 46
所以,我想为图像着色。
我的假设是,如果我在这两个HSL值中找到相关性,我可以 逐像素化我的图片。
目前我发现如果我用(目标色调 - 基色调)= -76移动基色调,色调就可以了。
你能指导我解决这个问题的饱和度和亮度之间的联系吗?
答案 0 :(得分:2)
我认为,无论您最终使用哪种映射,您都希望将黑色映射为黑色,将白色映射为白色并将灰色映射为灰色。
添加剂映射
用于色调的H'= H +(H target - H base )
(用环绕式)确实可能没问题。对于饱和度,需要保留灰度值表示乘法映射
S'= S *(S target / S base ),
值超过100%饱和度被剪裁。但是,对于亮度,线性贴图不会这样做,因为您想要在调整中间值时同时修复0%和100%的亮度。一个自然的选择可能是gamma - 类型的地图,即
L'= pow(L,log(L target )/ log(L base ))= exp(log(L)* log(L target )/ log(L base ))。
其中亮度值被缩放到0到1之间。(注意:要为大量像素有效地计算此贴图,您可能需要预先计算一个查找表,例如256个条目。)
当然,你可以使用很多其他地图,但我会从这些地图开始,看看它们是否能提供足够好的结果。请注意,最终,结果的质量也可能受到HSL色彩空间的感知不均匀性的限制;有关详细信息,请参阅this Wikipedia page。