我有一个颜色是BGR的图像。如何转换我的PIL图像以有效的方式交换每个像素的B和R元素?
假设没有alpha波段,是不是就这么简单?
b, g, r = im.split()
im = Image.merge("RGB", (r, g, b))
编辑:
嗯......看来PIL在这方面有一些缺陷... im.split()
似乎不适用于最新版本的PIL(1.1.7)。它可能(?)仍然适用于1.1.6,但......
只是为了添加更新的答案:
随着新的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)
我知道这是一个老问题,但我有同样的问题并解决了它:
img = img[:,:,::-1]
这是我最好的答案。顺便说一句,这也适用于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)
import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)
只是为了澄清Martin Beckets解决方案,因为我无法发表评论。你需要cv2。在颜色常数面前。
使用省略号添加解决方案
image = image[...,::-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
im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)