使用Python PIL改变图像色调

8 浏览
0 Comments

使用Python PIL改变图像色调

我正在使用Python PIL库尝试调整给定图像的色相。

由于我对图形术语不太熟悉,所以我所说的“调整色相”是指进行Photoshop操作称为“色相/饱和度”:即统一改变图像的颜色,如下所示:

  • 原始图像:Original
  • 色相调整为+180(红色):hue: -180
  • 色相调整为-78(绿色):hue: -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')

(请不要嘲笑)结果:output.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

0