我有一张颜色为BGR的图像。如何以有效的方式转换我的PIL图像以交换每个像素的B和R元素?
答案 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)
答案 10 :(得分:0)
使用省略号添加解决方案
image = image[...,::-1]
在这种情况下,省略号...
等效于:,:
,而::-1
则倒数最后一个维度(通道)的顺序。