PIL旋转图像颜色(BGR - > RGB)

时间:2011-01-11 19:06:17

标签: python colors python-imaging-library

我有一张颜色为BGR的图像。如何以有效的方式转换我的PIL图像以交换每个像素的B和R元素?

11 个答案:

答案 0 :(得分:85)

只是为了添加更新的答案:

使用新的cv2接口加载的图像现在自动为numpy数组 但是openCV cv2.imread()将图像加载为BGR,而numpy.imread()将它们加载为RGB。

最简单的转换方法是使用openCV cvtColor。

import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR, cv2.COLOR_BGR2RGB)

答案 1 :(得分:70)

我知道这是一个老问题,但我遇到了同样的问题并解决了它:

img = img[:,:,::-1]

答案 2 :(得分:18)

假设没有alpha波段,是不是就这么简单?

b, g, r = im.split()
im = Image.merge("RGB", (r, g, b))

编辑:

嗯......看来PIL在这方面有一些错误...... im.split()似乎不适用于最新版本的PIL(1.1.7)。它可能(?)仍然适用于1.1.6,但是......

答案 3 :(得分:6)

这是我最好的答案。顺便说一句,这也适用于Alpha。

from PIL import Image
import numpy as np
import sys 

sub = Image.open(sys.argv[1])
sub = sub.convert("RGBA")
data = np.array(sub) 
red, green, blue, alpha = data.T 
data = np.array([blue, green, red, alpha])
data = data.transpose()
sub = Image.fromarray(data)

答案 4 :(得分:3)

import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)

只是为了澄清Martin Beckets解决方案,因为我无法发表评论。 你需要cv2。在颜色常数面前。

答案 5 :(得分:2)

其他解决方案的应用。只是临时措施。

import numpy

im = Image.fromarray(numpy.array(im)[:,:,::-1])

答案 6 :(得分:1)

使用之前解释过的想法......你可以使用numpy。

bgr_image_array = numpy.asarray(bgr_image)
B, G, R = bgr_image_array.T
rgb_image_array = np.array((R, G, B)).T
rgb_image = Image.fromarray(rgb_image_array, mode='RGB')

此外,它可以删除Alpha通道。

assert bgra_image_array.shape == (image_height, image_width, 4)
B, G, R, _ = bgra_image_array.T
rgb_image_array = np.array((R, G, B)).T

答案 7 :(得分:1)

im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)

答案 8 :(得分:1)

对于任何编写可能不得不处理4通道图像的代码的人来说,这只是一个简短的脚注,并且发现简单的numpy答案似乎正在吞噬他们的alpha通道。

np_image[:,:,[0,1,2]] = np_image[:,:,[2,1,0]]
如果有第四个通道,

将保留Alpha数据,而

np_image = np_image[:,:,[2,1,0]]

将仅用反向的3通道数据覆盖4通道图像。 (甚至更简单的numpy答案img = img [:,:,::-1],也会为您提供ARGB数据,这也很糟糕。:)

答案 9 :(得分:0)

您应该可以使用ImageMath模块执行此操作。

编辑:

Joe的解决方案更好,我正在思考它。 :)

答案 10 :(得分:0)

使用省略号添加解决方案

image = image[...,::-1]

在这种情况下,省略号...等效于:,:,而::-1则倒数最后一个维度(通道)的顺序。