使用Python PIL改变图像色调
使用Python PIL改变图像色调
我正在使用Python PIL库尝试调整给定图像的色相。
由于我对图形术语不太熟悉,所以我所说的“调整色相”是指进行Photoshop操作称为“色相/饱和度”:即统一改变图像的颜色,如下所示:
- 原始图像:
- 色相调整为+180(红色):
- 色相调整为-78(绿色):
值得一提的是,Photoshop在色相设置上使用的是-180到+180的范围(其中-180等于+180),这可能代表了HSL色相刻度(以0-360度表示)。
我正在寻找的是一个函数,给定一个 PIL 图像和一个在 [0, 1](或在 [0, 360] 内的整数,无关紧要)范围内的浮点色相,返回通过色相调整后的图像,就像上面的示例一样。
到目前为止,我所做的是可笑的,显然无法得到期望的结果。它只是将我的原始图像与填充颜色的图层混合了一半。
import Image im = Image.open('tweeter.png') layer = Image.new('RGB', im.size, 'red') # 通过选择一种颜色来进行“色相”选择... 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): """ 使用给定的`hue`(0-360范围内的色相)对PIL图像`original`进行着色;返回另一个PIL图像。 """ 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