我有一个使用拜耳滤镜创建的图像,颜色稍微偏离。我需要将每个像素的RG和B乘以某个因子(R,G和B各自的因子不同)以获得正确的颜色。我正在使用python映像库,当然还在python中编写。有没有办法有效地做到这一点?
谢谢!
答案 0 :(得分:6)
以下是如何操作:
point
将频道乘以因子(示例中的1.5
,在r频道上)。 下面是代码:
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
(它有点红......):
答案 1 :(得分:2)
作为基本优化,如果您创建3个查找表(R,G和B各一个),将输入值(0-255)映射到输出值(0-255),可能会节省一点时间。查找数组条目可能比乘以十进制值并将结果舍入为整数更快。不确定要快多少。
当然,这假设值应始终映射相同。
答案 2 :(得分:1)
来自文档:
from PIL import Image
Image.eval(image, function) => image
将函数(应该采用一个参数)应用于给定图像中的每个像素。如果图像具有多个频带,则对每个频带应用相同的功能。请注意,函数会针对每个可能的像素值进行一次评估,因此您无法使用随机组件或其他生成器。
答案 3 :(得分:1)
您可以使用.split
将图片拆分为三个频道中的每一个的单独图片,.eval
为suggested by astynax,Image.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')
输入图像:
结果图片:
答案 5 :(得分:0)
如果类型为numpy.ndarray,则为img = np.uint8(img * factor)