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

问题描述 投票:36回答:8

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

python colors python-imaging-library
8个回答
21
投票

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

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

编辑:

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


88
投票

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

随着新的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)

76
投票

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

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

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
投票
import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)

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


2
投票

使用省略号添加解决方案

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

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


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

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

0
投票

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

Edit:

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

© www.soinside.com 2019 - 2024. All rights reserved.