Dis*_*oes 2 python interpolation gradient colors 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
Run Code Online (Sandbox Code Playgroud)
上面代码的唯一问题是它循环了多种不同的颜色,例如:红色 -> 橙色 -> 黄色 -> 绿色 -> 青色 -> 蓝色
可以看出,这个渐变产生了更符合预期的红色 -> 紫色 -> 蓝色
我尝试制作一个使用单个 rgb 通道值进行插值的函数,这给出了更相似的结果,但是颜色的感知亮度和饱和度关闭,所以我试图在 hsv 颜色空间中执行此操作。
任何人都可以创建一个函数或解释如何使用 hsv 颜色空间实现上述渐变?
听起来您想在 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))
Run Code Online (Sandbox Code Playgroud)
因此,例如,因为g1和g2都是 0,所以您的输出颜色都不会包含任何绿色,我认为这就是您所追求的。
(当然,如果您使用的是 numpy 数组,那么整个过程就更简单了——您可以将行作为 RGB 列的二维数组进行操作,并用对 的单个调用替换整个循环linspace。)
| 归档时间: |
|
| 查看次数: |
3889 次 |
| 最近记录: |