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 トリプレットを別の方法で処理する必要があると思います。
このデータを大まかに虹のように見せるために何をする必要があるか知っている人はいますか?
アップデート:
私はヒルベルト曲線をいじっていて、この問題を再検討しました。ヒルベルト曲線に沿った位置で RGB 値 (両方の画像で同じ色) を並べ替えると、興味深い (それでも完全に満足できるものではない場合) 結果が得られます。