我有一张使用 Bayer 滤镜创建的图像,颜色略有偏差。我需要将每个像素的 RG 和 B 分别乘以一个特定因子(每个颜色分别不同)来获得正确的颜色。我正在使用 Python Imaging 库,并且当然是用 Python 写的。是否有高效的方法来实现这个目标?谢谢!
以下是完成此操作的步骤:
point
函数将通道乘以因子(例如,在r通道上为1.5
)。以下是代码示例:
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')
输入图像:
输出图像:
您可以将该矩阵解读为:
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, 色彩矩阵, 变换, 通道数乘, 通道缩放, 分离, 单独地, 各个通道, 波段, 成分, 分别, 拆分通道, 合并通道, 图像, 图像处理.
您可以使用.split
将图像分割成三个通道的单独图像,使用.eval
(由astynax建议)进行计算,并使用Image.merge
将它们重新组合在一起。
如果任何乘法因子大于1,请确保将输出夹紧到255。
来自文档:
from PIL import Image
Image.eval(image, function) => image
将该函数(应该只接受一个参数)应用于给定图像中的每个像素。如果图像有多个波段,则同一函数将应用于每个波段。请注意,该函数对于每个可能的像素值都会被评估一次,因此您不能使用随机组件或其他生成器。