使用 Python PIL,我正在尝试调整给定图像的色调。
我对图形的术语不太熟悉,所以我所说的“调整色调”是指做 Photoshop 的“色相/饱和度”操作</a>:这是为了均匀地改变图像的颜色,如下所示:
- 原来的:
- 色调调整为 +180(红色):
- 色调调整为 -78(绿色):
仅供参考,Photoshop 对此色调设置使用 -180 到 +180 的比例(其中 -180 等于 +180),这可能代表HSL 色调比例(以 0-360 度表示)。
我正在寻找的是一个函数,给定 PIL 图像和 [0, 1] 内的浮点色调(或 [0, 360] 内的 int,没关系),返回图像的色调偏移了色调如上例所示。
到目前为止我所做的事情是荒谬的,显然没有给出预期的结果。它只是将我的原始图像与彩色填充层混合了一半。
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