2

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

谢谢!

4

6 回答 6

9

这是如何做到的:

  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(它有点红..):

在此处输入图像描述

于 2012-06-04T18:47:48.170 回答
6

您可以非常有效地执行此操作,并且只需使用带有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、颜色矩阵、颜色矩阵、变换、乘法通道、比例通道、分离、单独、单独通道、波段、组件、单独、分割通道、合并通道、图像、图像处理。

于 2019-05-27T09:17:49.610 回答
2

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

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

于 2012-06-04T18:27:24.700 回答
1

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

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

于 2012-06-04T18:44:17.343 回答
1

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.

于 2012-06-04T18:19:21.047 回答
0

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

于 2020-11-18T19:59:09.200 回答