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

时间:2012-06-04 18:07:59

标签: python image-processing python-imaging-library rgb pixel

我有一个使用拜耳滤镜创建的图像,颜色稍微偏离。我需要将每个像素的RG和B乘以某个因子(R,G和B各自的因子不同)以获得正确的颜色。我正在使用python映像库,当然还在python中编写。有没有办法有效地做到这一点?

谢谢!

6 个答案:

答案 0 :(得分:6)

以下是如何操作:

  1. 首先将图像分割为RGB通道。
  2. 使用point将频道乘以因子(示例中的1.5,在r频道上)。
  3. 合并频道。
  4. 下面是代码:

    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

答案 1 :(得分:2)

作为基本优化,如果您创建3个查找表(R,G和B各一个),将输入值(0-255)映射到输出值(0-255),可能会节省一点时间。查找数组条目可能比乘以十进制值并将结果舍入为整数更快。不确定要快多少。

当然,这假设值应始终映射相同。

答案 2 :(得分:1)

来自文档:

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

将函数(应该采用一个参数)应用于给定图像中的每个像素。如果图像具有多个频带,则对每个频带应用相同的功能。请注意,函数会针对每个可能的像素值进行一次评估,因此您无法使用随机组件或其他生成器。

答案 3 :(得分:1)

您可以使用.split将图片拆分为三个频道中的每一个的单独图片,.evalsuggested by astynaxImage.merge将它们重新组合在一起。

如果任何乘法因子大于1,请务必将输出钳位到255。

答案 4 :(得分:0)

您可以非常有效地完成此操作,只需使用带有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') 

输入图像:

enter image description here

结果图片:

enter image description here

答案 5 :(得分:0)

如果类型为numpy.ndarray,则为img = np.uint8(img * factor)