我可以使用具有自定义权重而不是内置亮度转换权重的Python和Pillow将彩色图像转换为灰度吗?

问题描述 投票:0回答:1

PIL转换功能的文档说:

[将彩色图像转换为灰度(模式“ L”)时,库使用ITU-R 601-2亮度转换:L = R * 299/1000 + G * 587/1000 +B * 114/1000

我想在计算中为R,G和B传递自定义权重。我应该如何处理?

上下文:我正在尝试模拟在黑白摄影中使用的滤色器以创建心情和对比度。例如,当拍摄黑白照片时,摄影师可以在镜头前放一个红色滤镜或一个橙色滤镜,从而得到看起来不同的照片。因此,我的想法是使用与给定滤镜相对应的权重转换彩色照片。在最简单的情况下,红色滤镜将为L = R * 1 + G * 0 + B * 0,橙色滤镜将为L = R * 0.5 + G * 0.5 + B * 0。

image-processing python-imaging-library
1个回答
0
投票

您可以使用语法L = R * 0.5 + G * 0.5 + B * 0RGB应该是float类型的2D数组。

  • 由于使用PIL读取图像,因此需要将图像转换为3D RGB阵列(其他软件包将图像读取为3D阵列)。
  • 将RGB元素从uint8类型转换为float类型。
  • 进行数学运算。
  • 转换回uint8和PIL图像。

这里是示例代码:

import numpy as np
from PIL import Image

RGB = np.asarray(Image.open("rgb_input.png")) # Read RGB input image and convert to RGB array
RGB = RGB.astype('float') # Convert elements from uint8 to float
R, G, B = RGB[:, :, 0], RGB[:, :, 1], RGB[:, :, 2]  # Split RGB to R, G and B numpy arrays.
L =  R * 299/1000 + G * 587/1000 + B * 114/1000 # Convert to L (select your desired coefficients).
L = Image.fromarray(np.uint8(L)) #Format back to PIL image
L.show()

备注:我没有太多的Python经验-可能有较短的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.