我有一张颜色以BGR编码的图片。如何以高效的方式将每个像素的B和R元素交换,从而转换我的PIL图片?
我有一张颜色以BGR编码的图片。如何以高效的方式将每个像素的B和R元素交换,从而转换我的PIL图片?
img = img[:, :, ::-1]
仅补充最新的答案:
在新的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)
如果没有 alpha 通道,难道不是这么简单吗?
b, g, r = im.split()
im = Image.merge("RGB", (r, g, b))
编辑:
嗯... 看起来PIL在这方面有一些错误... im.split()
在最近版本的PIL(1.1.7)中似乎无法正常工作。不过,它可能仍然适用于1.1.6版本...
np.roll
会将BGR格式转换为RBG格式,而不是RGB格式。如果你想在numpy中进行此操作,可以使用 data[...,[2,1,0]]
来交换通道。但是如果您已经在使用OpenCV或PIL,则建议采用Martin Beckett的解决方案。 - Luke Yeagernp.flip(image_bgr, axis=2)
。 - hoohoo-b使用省略号添加解决方案
image = image[...,::-1]
在这种情况下,省略号...
等同于:,:
,而::-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)
如果您正在编写可能涉及4通道图像的代码,并且发现简单的numpy答案似乎会吞噬它们的alpha通道,请注意以下提示。
np_image[:,:,[0,1,2]] = np_image[:,:,[2,1,0]]
如果存在第四个通道,将保留alpha数据,而
np_image = np_image[:,:,[2,1,0]]
import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)
为了澄清Martin Beckets的解决方案,因为我无法评论。 在颜色常量前面需要加上cv2。
其他解决方案的应用。仅作为临时措施。
import numpy
im = Image.fromarray(numpy.array(im)[:,:,::-1])
Image.fromarray(np.array(img)[:,:,:3][:,:,::-1])
。 - Lewis Morrisim = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)
np.shape
或类似的方法来获取维度信息。另外,bgr_buf
是什么? - Muhammad Yasirronibgr_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
有效地颠倒了颜色的顺序。宽度和高度不受影响。 - Peter9192::-1
实际上是numpy操作[start:end:step]
的简写形式,其中start
/end
会自动确定。 - Wesley Ranger