我有一个 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 三元组。
有谁知道我需要做什么才能使这些数据看起来大致像彩虹?
更新:
我在玩希尔伯特曲线并重新审视了这个问题。通过沿希尔伯特曲线的位置对 RGB 值(两个图像中的相同颜色)进行排序会产生一个有趣的(如果仍然不完全令人满意)的结果: