3

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

让:

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

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

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

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

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

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

4

3 回答 3

3

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

这是一个 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

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

于 2009-09-13T04:11:12.707 回答
1

对于每个颜色值x, x < 360,它可能是xx+360。然后你有 4 对颜色值。如果找到最小距离对,则使用该对插入颜色。它可能会给你正确的视觉效果。

例如,

红色 = 0° 或 360°
黄色 = 60° 或 420°
蓝色 = 240° 或 600°

红色和黄色的最小距离是60(red 0 yellow 60),所以插值应该是30。
黄色和蓝色的最小距离是180(yellow 60 blue 240),所以插值应该是150
。红蓝是60(红360蓝240),所以插值应该是300。

于 2009-09-13T05:57:08.673 回答
0

您可能不想听到这个,而是转换为 RGB、插值并转换回来。

编辑:刚刚看到“应该混合实际油漆”

在这种情况下,您可能希望转换为 CMY 颜色空间而不是 RGB。看看维基百科上的颜色混合

于 2009-09-13T01:23:27.040 回答