我有一张使用拜耳滤镜创建的图像,颜色略有偏差。我需要将每个像素的 RG 和 B 乘以某个因数(R、G 和 B 各有一个不同的因数)以获得正确的颜色。我正在使用 python 成像库,当然也用 python 编写。有没有办法有效地做到这一点?
谢谢!
我有一张使用拜耳滤镜创建的图像,颜色略有偏差。我需要将每个像素的 RG 和 B 乘以某个因数(R、G 和 B 各有一个不同的因数)以获得正确的颜色。我正在使用 python 成像库,当然也用 python 编写。有没有办法有效地做到这一点?
谢谢!
这是如何做到的:
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
(它有点红..):
您可以非常有效地执行此操作,并且只需使用带有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、Pillow、颜色矩阵、颜色矩阵、变换、乘法通道、比例通道、分离、单独、单独通道、波段、组件、单独、分割通道、合并通道、图像、图像处理。
作为一项基本优化,如果您创建 3 个查找表,R、G 和 B 各一个,将输入值 (0-255) 映射到输出值 (0-255),可能会节省一点时间。查找数组条目可能比乘以十进制值并将结果四舍五入为整数更快。不知道快多少。
当然,这假设值应该始终映射相同。
您可以使用astynax 的建议将.split
图像拆分为三个通道中的每一个的单独图像,然后将它们重新组合在一起。.eval
Image.merge
如果您的任何乘法因子大于 1,请务必将输出钳制为 255。
From documentation:
from PIL import Image
Image.eval(image, function) => image
Applies the function (which should take one argument) to each pixel in the given image. If the image has more than one band, the same function is applied to each band. Note that the function is evaluated once for each possible pixel value, so you cannot use random components or other generators.
如果类型是 numpy.ndarray 只是 img = np.uint8(img*factor)