繁体   English   中英

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

[英]Multiply each pixel in an image by a factor

我有一个使用拜耳过滤器创建的图像,颜色略有偏差。 我需要将每个像素的 RG 和 B 乘以某个因子(R、G 和 B 的每个因子不同)以获得正确的颜色。 我正在使用 python 成像库,当然也用 python 编写。 有没有办法有效地做到这一点?

谢谢!

这是如何做到的:

  1. 首先将您的图像拆分为 RGB 通道。
  2. 使用point将通道乘以因子(示例中为1.5 ,在 r 通道上)。
  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()

原来的:

在此处输入图片说明

红色通道乘以1.5 (它有点红..):

在此处输入图片说明

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

输入图像:

在此处输入图片说明

结果图像:

在此处输入图片说明

关键词:Python、PIL、枕头、颜色矩阵、颜色矩阵、变换、乘法通道、缩放通道、分离、单独、单独通道、带、组件、单独、分割通道、合并通道、图像、图像处理。

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

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

从文档:

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

将函数(应采用一个参数)应用于给定图像中的每个像素。 如果图像有多个波段,则对每个波段应用相同的功能。 请注意,该函数为每个可能的像素值计算一次,因此您不能使用随机组件或其他生成器。

您可以使用.split将图像拆分为三个通道中的每一个的单独图像, .eval按照.eval建议使用,并使用Image.merge将它们重新组合在一起。

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

如果类型是 numpy.ndarray 只是 img = np.uint8(img*factor)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM