3

给定 N 个桶,我想在彩虹上连续生成颜色(其中 n>=2):

在此处输入图像描述

例如,如果 n=2,颜色将是:

rgb(255,0,0) -->rgb(0,0,255)

如果 n=3,颜色将是:

rgb(255,0,0) --> rgb(0,255,0) --> rgb(0,0,255)

生成这些颜色代码的好方法是什么?

4

3 回答 3

5

您的彩虹渐变平滑地将色调从 0 度变为 240 度(纯蓝色的色调)。因此,使用例如 HSL 值而不是 RGB 值将是最容易的,因此您可以在保持饱和度和亮度不变的情况下改变色调。

colorsys库允许在不同颜色空间之间进行转换,因此您可以根据需要使用它沿彩虹渐变生成 RGB 值。该hls_to_rgb函数使用 0 到 1 之间的浮点值,2/3蓝色的色调也是如此,明亮的颜色应该具有 0 的亮度0.5和 0 的饱和度1

from colorsys import hls_to_rgb

def rainbow_color_stops(n=10, end=2/3):
    return [ hls_to_rgb(end * i/(n-1), 0.5, 1) for i in range(n) ]

结果是一个(r,g,b)元组列表。

于 2019-11-12T03:33:25.657 回答
2

这是一个小脚本,使用 kaya3 关于 HSV 的建议。是一个有趣的小练习。

import colorsys
import numpy as np
from matplotlib import pyplot as plt


def spectrum(n : int):
    hsv = [(h, 1, 1) for h in np.linspace(0, 240/360, n)]
    rgb = [colorsys.hsv_to_rgb(*tup) for tup in hsv]
    defloat = lambda x: tuple((int(255 * i) for i in x))
    return [defloat(x) for x in rgb]

if __name__ == '__main__':
    n = 100
    rgb = np.array(spectrum(n))
    rgb = rgb.reshape((1, n, 3))
    rgb = np.tile(rgb, (n, 1, 1))
    plt.imshow(rgb)
    plt.show()

生成下图 在此处输入图像描述

于 2019-11-12T03:43:55.693 回答
1

使用 RGB 比例,红色从 开始,(255,0,0)中间的绿色在(0,255,0),结束,蓝色,在(0,0,255)。我们可以通过从开始(255,0,0)并“步进”直到我们到达结束来移动规模。

假设从红色到绿色有 256*2 步(红色从 256->0 和绿色从 0->256)和 256*2 从绿色到蓝色。这达到 1024 步。现在我们可以将 1024 除以我们想要的桶数n。这是一个例子:

def generate_gradient_rgbs(num_buckets):
    rgb_codes = []
    step_size = 1024 / num_buckets
    for step in range(0,num_buckets):
        red = int(max(0, 255 - (step_size*step*0.5))) # step size is half of the step size since both this item goes down and the next one goes up
        blue = int(max(0, 255 - (step_size*0.5*(num_buckets-step-1))))
        green = (255 - red) if red else (255 - blue)
        rgb_codes.append((red, green, blue))
    return rgb_codes
 >>> generate_gradient_rgbs(4)
[(255, 0, 0), (127, 128, 0), (0, 128, 127), (0, 0, 255)]

当然,这是一个起点,但对于获得 rgb 的快速而简单的方法,这是一种可能的方法。

于 2019-11-12T03:42:48.467 回答