在HSV

时间:2018-05-11 06:48:45

标签: python colors interpolation gradient hsv

假设我有两种RGB颜色(255,0,0)和(0,0,255),我还需要100种颜色。如何根据许多必要步骤生成HSV颜色值列表?

目前使用python 3我创建了这段代码:

def lerpcolourhsv(rgb1, rgb2, steps):
#convert rgb to hsv
hsv1 = colorsys.rgb_to_hsv(rgb1[0], rgb1[1], rgb1[2])
hsv2 = colorsys.rgb_to_hsv(rgb2[0], rgb2[1], rgb2[2])

# calculate distance between two hue numbers, divide by number of steps. then loop to generate
rgb_colour_list = []
dist = cachefunc.numdistance(hsv1[0], hsv2[0])
step_value = dist / steps
hue = hsv1[0]

for x in range(steps):
    hsv_tupel = (hue, 1, 1)
    hue += step_value
    rgb = colorsys.hsv_to_rgb(hsv_tupel[0], hsv_tupel[1], hsv_tupel[2])
    rgb = (round(rgb[0] * 255), round(rgb[1] * 255), round(rgb[2] * 255), round(255)) #0-1 to 0-255
    rgb_colour_list.append(rgb)

return rgb_colour_list

上面代码的唯一问题是它循环通过多种不同的颜色,例如:red - >橙色 - >黄色 - >绿色 - >青色 - >蓝色

我想要一个函数,而不是产生更类似于此的结果: red to blue color gradient

可以看出,这个梯度产生了更加期望的红色结果 - >紫色 - >蓝色

我尝试使用单独的rgb通道值进行插值,这给出了更相似的结果,但是感知亮度和颜色的饱和度都没有了,所以我试图在hsv颜色空间中这样做。

任何人都可以使用hsv颜色空间创建函数或解释如何实现上面的渐变吗?

1 个答案:

答案 0 :(得分:3)

听起来你想要在RGB色彩空间而不是在色调上创建渐变。而你的问题是你编写了一堆代码将其转换为HSV,这样你就可以在色调中进行渐变并将其转换回来?如果是这样,答案很简单:不要写那个代码;坚持使用RGB。

由于您没有给我们提供完整的示例,我无法向您展示如何更改代码,但这是一个简单的版本:

r1, g1, b1 = rgb1
r2, g2, b2 = rgb2
rdelta, gdelta, bdelta = (r2-r1)/steps, (g2-g1)/steps, (b2-b1)/steps
for step in range(steps):
    r1 += rdelta
    g1 += gdelta
    b1 += bdelta
    output.append((r1, g1, b1))

因此,例如,因为g1g2都是0,所以您的输出颜色都不会包含任何绿色,我认为这就是您所追求的。

(当然如果你使用的是numpy数组,整个事情就更简单了 - 你可以将行作为RGB列的2D数组进行操作,并用linspace的单个调用替换整个循环。 )