algorithm - HSL插值

标签 algorithm colors interpolation color-picker hsl

如果我的 HSL 颜色的色调分量以度为单位,我如何才能在两种色调之间正确插值?使用 (h1 + h2)/2 似乎并不是在所有情况下都能产生理想的结果。以下是说明原因的两个示例:

让:

红色 = 0°
黄色 = 60°
蓝色 = 240°

(红色 + 黄色)/2 = 30°(橙色)
(黄色 + 蓝色)/2 = 150° (蓝绿色)
(红 + 蓝)/2 = 120° (绿)

如您所见,对红色和蓝色进行平均会产生绿色而不是紫色/洋红色!但是,如果我们让:

红色 = 360°
黄色 = 60°
蓝色 = 240°

(红色+黄色)/2 = 210°(蓝绿色)
(黄色 + 蓝色)/2 = 150° (蓝绿色)
(红色 + 蓝色)/2 = 300°(洋红色)

现在,红色和蓝色产生预期的颜色,但红色和黄色产生蓝绿色!我可以用什么方式插入颜色的色调分量,以便结果与混合实际油漆的预期相匹配?谢谢!

最佳答案

基本上,您这样做是为了得到我假设您想要的颜色,这是一种看起来介于您的两个输入之间的中间颜色,但您只需要处理这个计算是在一个环绕的圆上完成的事实。 (我假设您并不是真的想要“像油漆一样混合”,而只是想要一种中等颜色——也就是说,您不希望红色和绿色变成棕色,对吗?)

这是一个 Python 函数,它会选取圆上两个角之间的角度。它基本上只是尝试两个选项(添加或不添加 360)并选择一个给出最接近原始角度的角度:

pairs = [(0, 60), (60, 239), (60, 241), (0, 240), (350, 30)]

def circ_ave(a0, a1):
    r = (a0+a1)/2., ((a0+a1+360)/2.)%360 
    if min(abs(a1-r[0]), abs(a0-r[0])) < min(abs(a0-r[1]), abs(a1-r[1])):
        return r[0]
    else:
        return r[1]

for a0, a1 in pairs:
    print a0, a1, circ_ave(a0, a1)

产生:

0 60    30.0
60 239  149.5  # 60, 240 is ambiguous
60 241  330.5
0 240   300.0
350 30  10.0

(我觉得应该有更简单的方法来做这个计算,但我没有想到。)

关于algorithm - HSL插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1416560/

相关文章:

algorithm - 使用主定理

c# - 按元素选择最重复的项目

css - 背景图像结壳

r - 在图像 {graphics} 中添加颜色图例

javascript - 实现 Mandelbrot 集的平滑着色

algorithm - 用简单语言对算法进行概率分析?

algorithm - 如果硬件已经做到了,为什么还需要乘法算法?

python - 如何使用 Python 和/或 R 在数据帧的值之间进行插值

python - 插值和图像绘制

python - 使用 pandas.interpolate()