Генерация списка цветов между двумя цветами в HSV - PullRequest
0 голосов
/ 11 мая 2018

Допустим, у меня есть два цвета RGB (255,0,0) и (0,0,255), мне также требуется 100 цветов между ними. Как создать список значений цвета HSV на основе количества необходимых шагов?

В настоящее время, используя python 3, я создал этот код:

def lerpcolourhsv(rgb1, rgb2, steps):
#convert rgb to hsv
hsv1 = colorsys.rgb_to_hsv(rgb1[0], rgb1[1], rgb1[2])
hsv2 = colorsys.rgb_to_hsv(rgb2[0], rgb2[1], rgb2[2])

# calculate distance between two hue numbers, divide by number of steps. then loop to generate
rgb_colour_list = []
dist = cachefunc.numdistance(hsv1[0], hsv2[0])
step_value = dist / steps
hue = hsv1[0]

for x in range(steps):
    hsv_tupel = (hue, 1, 1)
    hue += step_value
    rgb = colorsys.hsv_to_rgb(hsv_tupel[0], hsv_tupel[1], hsv_tupel[2])
    rgb = (round(rgb[0] * 255), round(rgb[1] * 255), round(rgb[2] * 255), round(255)) #0-1 to 0-255
    rgb_colour_list.append(rgb)

return rgb_colour_list

Единственная проблема с кодом, приведенным выше, заключается в том, что он перебирает несколько разных цветов, например: красный -> оранжевый -> желтый -> зеленый -> голубой -> синий

Я бы хотел функцию, которая вместо этого дает результаты, более похожие на это: red to blue color gradient

Как видно, этот градиент дает более ожидаемый результат: красный -> фиолетовый -> синий

Я попытался сделать функцию, которая интерполирует, используя отдельные значения канала rgb, это дало более похожий результат, однако воспринимаемая яркость и насыщенность цветов были отключены, поэтому я пытаюсь сделать это в цветовом пространстве hsv.

Может кто-нибудь создать функцию или объяснить, как добиться указанного выше градиента, используя цветовое пространство hsv?

1 Ответ

0 голосов
/ 11 мая 2018

Звучит так, будто вы хотите создать градиент по цветовому пространству RGB, а не по оттенку.И ваша проблема в том, что вы написали кучу кода, чтобы преобразовать его в HSV, чтобы вы могли градиентно переходить по оттенку и преобразовывать его обратно?Если так, ответ прост: не пишите этот код;просто придерживайтесь RGB.

Поскольку вы не дали нам полный пример, я не могу показать вам, как именно изменить код, но вот простая версия:

r1, g1, b1 = rgb1
r2, g2, b2 = rgb2
rdelta, gdelta, bdelta = (r2-r1)/steps, (g2-g1)/steps, (b2-b1)/steps
for step in range(steps):
    r1 += rdelta
    g1 += gdelta
    b1 += bdelta
    output.append((r1, g1, b1))

Так, например, поскольку g1 и g2 оба равны 0, ни один из ваших выходных цветов не будет включать в себя зеленый, что, я думаю, то, что вам нужно.

(Конечно, если выиспользуя пустые массивы, все еще проще - вы можете просто оперировать строками как двумерными массивами столбцов RGB и заменять весь цикл одним вызовом linspace.)

...