gpt4 book ai didi

python - 将 RGB 三元组列表排序为光谱

转载 作者:太空狗 更新时间:2023-10-29 16:53:47 25 4
gpt4 key购买 nike

我有一个 RGB 三元组列表,我想以这样一种方式绘制它们,使它们形成类似光谱的东西。

我已将它们转换为 HSV,人们似乎建议这样做。

from PIL import Image, ImageDraw
import colorsys

def make_rainbow_rgb(colors, width, height):
"""colors is an array of RGB tuples, with values between 0 and 255"""

img = Image.new("RGBA", (width, height))
canvas = ImageDraw.Draw(img)

def hsl(x):
to_float = lambda x : x / 255.0
(r, g, b) = map(to_float, x)
h, s, l = colorsys.rgb_to_hsv(r,g,b)
h = h if 0 < h else 1 # 0 -> 1
return h, s, l

rainbow = sorted(colors, key=hsl)

dx = width / float(len(colors))
x = 0
y = height / 2.0
for rgb in rainbow:
canvas.line((x, y, x + dx, y), width=height, fill=rgb)
x += dx
img.show()

但是,结果看起来不太像漂亮的彩虹-y 光谱。我怀疑我需要转换为不同的颜色空间或以不同方式处理 HSL 三元组。

this doesn't look like a spectrum

有谁知道我需要做什么才能让这些数据看起来像彩虹?

更新:

我在研究希尔伯特曲线并重新审视了这个问题。根据 RGB 值(两个图像中的相同颜色)沿希尔伯特曲线的位置对 RGB 值进行排序会产生一个有趣的(如果仍然不完全令人满意)结果:

RGB values sorted along a Hilbert curve.

最佳答案

您正在尝试将三维空间转换为一维空间。正如 Oli 所说,不能保证你能从中做出令人愉悦的彩虹。

您可以做的是根据饱和度和明度/亮度将颜色“分桶”到几个不同的类别,然后在类别内排序,以获得几个独立的渐变。例如,经典彩虹首先是高饱和度颜色,然后是中饱和度高值颜色(粉彩),然后是低饱和度(灰色)。

或者,如果您只关心彩虹,请转换为 hsl,然后将饱和度设置为 1.0,并将值设置为 0.5,转换回 rgb 并渲染它而不是原始颜色。

关于python - 将 RGB 三元组列表排序为光谱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6208980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com