У меня есть список 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 по-другому.
![this doesn't look like a spectrum](https://i.stack.imgur.com/gbd2L.png)
Кто-нибудь знает, что мне нужно сделать, чтобы эти данные выглядели примерно как радуга?
Обновление:
Я играл с кривыми Гильберта и снова рассмотрел эту проблему. Сортировка значений RGB (одинаковые цвета на обоих изображениях) по их положению вдоль кривой Гильберта дает интересный (хотя все еще не вполне удовлетворительный) результат:
![RGB values sorted along a Hilbert curve.](https://i.stack.imgur.com/2B5m8.png)