在图像中将每个像素乘以一个因子

3
我有一张使用 Bayer 滤镜创建的图像,颜色略有偏差。我需要将每个像素的 RG 和 B 分别乘以一个特定因子(每个颜色分别不同)来获得正确的颜色。我正在使用 Python Imaging 库,并且当然是用 Python 写的。是否有高效的方法来实现这个目标?谢谢!
6个回答

10

以下是完成此操作的步骤:

  1. 首先将您的图像分成RGB通道。
  2. 使用point函数将通道乘以因子(例如,在r通道上为1.5)。
  3. 合并通道。

以下是代码示例:

import Image
im = Image.open('1_tree.jpg')
im = im.convert('RGB')
r, g, b = im.split()
r = r.point(lambda i: i * 1.5)
out = Image.merge('RGB', (r, g, b))
out.show()

原文:

enter image description here

将红色通道乘以 1.5(变得有点更红了):

enter image description here


好的,它告诉我_imaging C模块未安装?你知道快速修复的方法吗?我在电脑上有这个文件,但它找不到它。 - clifgray
@clifgray,你有没有用过PIL做其他的东西?顺便说一下,我觉得导入ImageChops并不必要。 - Mark Ransom
谢谢Mark,我之前安装过它,但是后来更新了一下就无法工作了。不过现在我通过卸载和重新安装它使其正常工作了。我想我的解释器没有添加PIL库。 - clifgray

7
你可以使用一个简单的变换矩阵和 convert() 函数来高效而简单地完成这个操作:
#!/usr/bin/env python3 

from PIL import Image 

# Open image 
im = Image.open('tree.jpg') 

# Make transform matrix, to multiply R by 1.5, leaving G and B unchanged
Matrix = ( 1.5, 0,  0, 0, 
           0,   1,  0, 0, 
           0,   0,  1, 0) 

# Apply transform and save 
im = im.convert("RGB", Matrix) 
im.save('result.png') 

输入图像:

输入图像描述

输出图像:

输出图像描述


您可以将该矩阵解读为:

newRed   = 1.5*oldRed + 0.0*oldGreen + 0.0*oldGreen + 0.0
newGreen = 0.0*oldRed + 1.0*oldGreen + 0.0*oldBlue  + 0.0
newBlue  = 0.0*oldRed + 0.0*oldGreen + 1.0*oldBlue  + 0.0

关键词: Python, PIL, Pillow, 色彩矩阵, 变换, 通道数乘, 通道缩放, 分离, 单独地, 各个通道, 波段, 成分, 分别, 拆分通道, 合并通道, 图像, 图像处理.


2
作为一种基本的优化,如果您创建3个查找表,分别用于R、G和B,则可以节省一些时间,以将输入值(0-255)映射到输出值(0-255)。查找数组条目可能比乘以十进制值并将结果四舍五入为整数更快。不确定快多少。
当然,这假设值应始终映射相同。

1

您可以使用.split将图像分割成三个通道的单独图像,使用.eval(由astynax建议)进行计算,并使用Image.merge将它们重新组合在一起。

如果任何乘法因子大于1,请确保将输出夹紧到255。


1

来自文档:

from PIL import Image
Image.eval(image, function) => image

将该函数(应该只接受一个参数)应用于给定图像中的每个像素。如果图像有多个波段,则同一函数将应用于每个波段。请注意,该函数对于每个可能的像素值都会被评估一次,因此您不能使用随机组件或其他生成器。


1
由于每个频段都使用相同的函数,这样做是行不通的。 - Mark Ransom

0
如果类型是numpy.ndarray,只需使用img = np.uint8(img*factor)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接