Сортировка списка триплетов RGB в спектр

У меня есть список триплетов 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&#39;t look like a spectrum

Кто-нибудь знает, что мне нужно сделать, чтобы эти данные выглядели примерно как радуга?

Обновление:

Я играл с кривыми Гильберта и снова вернулся к этой проблеме. Сортировка значений RGB (одинаковые цвета на обоих изображениях) по их положению на кривой Гильберта дает интересный (хотя и не совсем удовлетворительный) результат:

RGB values sorted along a Hilbert curve.

16
задан Jason Sundram 23 November 2014 в 12:40
поделиться