许多颜色操作最好在颜色空间中完成,例如HSV您可以通过以下方式在 PIL 中获取:
HSV = rgb.convert('HSV')
然后您可以使用split()
获得 3 个独立的通道:
H, S, V = hsv.split()
现在您可以更改颜色。你似乎对自己想要的东西有点犹豫不决。如果您想改变颜色的强度,即降低它们的饱和度和鲜艳度,请降低 S(饱和度)。如果您想将红色更改为紫色,即更改色调,请向色调通道添加一些内容。如果您想让图像更亮或更暗,请更改值 (V) 通道。
完成后,合并merge((H,S,V))
编辑后的通道重新组合在一起并转换回 RGBconvert('RGB')
.
See 分裂与合并 and 处理各个频段 on this page.
这是使用此图像的示例:
这是加载图像、转换为 HSV 色彩空间、分割通道、进行一些处理、重新组合通道并恢复为 RGB 色彩空间并保存结果的基本框架。
#!/usr/bin/env python3
from PIL import Image
# Load image and create HSV version
im = Image.open('colorwheel.jpg')
HSV= im.convert('HSV')
# Split into separate channels
H, S, V = HSV.split()
######################################
########## PROCESSING HERE ###########
######################################
# Recombine processed H, S and V back into a recombined image
HSVr = Image.merge('HSV', (H,S,V))
# Convert recombined HSV back to reconstituted RGB
RGBr = HSVr.convert('RGB')
# Save processed result
RGBr.save('result.png')
所以,如果你发现标记为“此处处理”并在那里添加代码将饱和度除以 2,这会使颜色不那么鲜艳:
# Desaturate the colours by halving the saturation
S = S.point(lambda p: p//2)
相反,如果我们将亮度 (V) 减半,如下所示:
# Halve the brightness
V=V.point(lambda p: p//2)
结果会更暗:
相反,如果我们将色调添加 80,则所有颜色都将围绕圆旋转 - 这称为「色相旋转」:
# Rotate Hues around the Hue circle by 80 on a range of 0..255, so around 1/3 or a circle, i.e. 120 degrees:
H = H.point(lambda p: p+80)
这给出了: