如何使用Python枕头(PIL)生成部分灰度图像?

如何使用Python枕头(PIL)生成部分灰度图像?,python,python-3.x,image,image-processing,python-imaging-library,Python,Python 3.x,Image,Image Processing,Python Imaging Library,例如: 第一个图像:原始图像 第二、第三和第四幅图像:输出I 需要 我知道PIL有一种方法,PIL.ImageOps.grayscale(image)返回第四幅图像,但它没有参数来生成第二幅和第三幅图像(部分灰度)。当你将一幅图像转换为灰度时,你实际上是在对其进行去饱和以去除饱和颜色。因此,为了达到您想要的效果,您可能需要转换为模式,降低饱和度并转换回RGB模式 from PIL import Image # Open input image im = Image.open('potat

例如:

  • 第一个图像:原始图像
  • 第二、第三和第四幅图像:输出I 需要

我知道PIL有一种方法,
PIL.ImageOps.grayscale(image)
返回第四幅图像,但它没有参数来生成第二幅和第三幅图像(部分灰度)。

当你将一幅图像转换为灰度时,你实际上是在对其进行去饱和以去除饱和颜色。因此,为了达到您想要的效果,您可能需要转换为模式,降低饱和度并转换回RGB模式

from PIL import Image

# Open input image
im = Image.open('potato.png')

# Convert to HSV mode and separate the channels
H, S, V = im.convert('HSV').split()

# Halve the saturation - you might consider 2/3 and 1/3 saturation
S = S.point(lambda p: p//2)

# Recombine channels
HSV = Image.merge('HSV', (H,S,V))

# Convert to RGB and save
result = HSV.convert('RGB')
result.save('result.png')


如果您更喜欢使用Numpy而不是PIL进行图像处理,则可以使用以下代码获得与上述相同的结果:

from PIL import Image
import numpy as np

# Open input image
im = Image.open('potato.png')

# Convert to HSV and go to Numpy
HSV = np.array(im.convert('HSV'))

# Halve the saturation with Numpy. Hue will be channel 0, Saturation is channel 1, Value is channel 2
HSV[..., 1] = HSV[..., 1] // 2

# Go back to "PIL Image", go back to RGB and save
Image.fromarray(HSV, mode="HSV").convert('RGB').save('result.png')

当然,将整个饱和通道设置为零,以获得全灰度

from PIL import ImageEnhance
# value: float between 0.0 (grayscale) and 1.0 (original)
ImageEnhance.Color(image).enhance(value)
注:马克的解决方案有效,但似乎增加了曝光量