我有一组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()
然而,结果看起来并不像一个漂亮的彩虹光谱。我怀疑我需要转换为另一种颜色空间或以不同的方式处理HSL三元组。 有人知道我需要做什么才能让这些数据看起来像一个彩虹吗?
更新:
我在玩Hilbert曲线,并重新审视了这个问题。通过沿着Hilbert曲线对RGB值(两个图像中的相同颜色)进行排序,可以得到一个有趣的(尽管仍然不完全令人满意)结果: