Используя Python PIL, я пытаюсь настроить оттенок данного изображения.
Мне не очень нравится использование жаргона графики, так что я имею в виду под "настройкой оттенка" - это операция Photoshop, называемая "Hue/saturation" : это равномерно изменить цвет изображения, как показано ниже:
- Оригинал:
- С оттенком, настроенным на +180 (красный):
- С оттенком, настроенным на -78 (зеленый):
FYI, Photoshop использует шкалу от -180 до +180 для этой настройки оттенка (где -180 равно +180), что может представлять собой шкалу оттенков HSL (выражается в 0-360 градусов).
То, что я ищу, - это функция, которая, учитывая изображение PIL и оттенок float внутри [0, 1] (или int внутри [0, 360], не имеет значения), возвращает изображение с его оттенком, измененным оттенком, как в приведенном выше примере.
То, что я делал до сих пор, смехотворно и явно не дает желаемого результата. Он просто наполовину смешал мое исходное изображение с наполненным цветом слоем.
import Image
im = Image.open('tweeter.png')
layer = Image.new('RGB', im.size, 'red') # "hue" selection is done by choosing a color...
output = Image.blend(im, layer, 0.5)
output.save('output.png', 'PNG')
(Пожалуйста, не догадайтесь) результат:
Спасибо заранее!
Решение: здесь обновлен код unutbu, чтобы он соответствовал тому, что я описал.
import Image
import numpy as np
import colorsys
rgb_to_hsv = np.vectorize(colorsys.rgb_to_hsv)
hsv_to_rgb = np.vectorize(colorsys.hsv_to_rgb)
def shift_hue(arr, hout):
r, g, b, a = np.rollaxis(arr, axis=-1)
h, s, v = rgb_to_hsv(r, g, b)
h = hout
r, g, b = hsv_to_rgb(h, s, v)
arr = np.dstack((r, g, b, a))
return arr
def colorize(image, hue):
"""
Colorize PIL image `original` with the given
`hue` (hue within 0-360); returns another PIL image.
"""
img = image.convert('RGBA')
arr = np.array(np.asarray(img).astype('float'))
new_img = Image.fromarray(shift_hue(arr, hue/360.).astype('uint8'), 'RGBA')
return new_img