Cla*_*diu 43 python colors python-imaging-library
我有一个颜色是BGR的图像.如何转换我的PIL图像以有效的方式交换每个像素的B和R元素?
Mar*_*ett 92
只是为了添加更新的答案:
随着新的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)
Run Code Online (Sandbox Code Playgroud)
Pet*_*192 80
我知道这是一个老问题,但我有同样的问题并解决了它:
img = img[:,:,::-1]
Run Code Online (Sandbox Code Playgroud)
Joe*_*ton 24
假设没有alpha波段,是不是就这么简单?
b, g, r = im.split()
im = Image.merge("RGB", (r, g, b))
Run Code Online (Sandbox Code Playgroud)
编辑:
嗯......看来PIL在这方面有一些缺陷...... im.split()似乎不适用于最新版本的PIL(1.1.7).它可能(?)仍然适用于1.1.6,但......
或者,如果您有numpy可用,您可以使用它来执行此操作:(再次,我在这里假设RGB图像,而不是 RGBA图像!):
b, g, r = im.split()
im = Image.merge("RGB", (r, g, b))
Run Code Online (Sandbox Code Playgroud)
如果im.split()只是工作,它肯定是一个更简单,更可读的选择!
这是我最好的答案.顺便说一句,这也适用于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)
Run Code Online (Sandbox Code Playgroud)
小智 6
对于任何编写可能需要处理 4 通道图像的代码并发现简单的 numpy 答案似乎正在吞噬其 alpha 通道的人来说,这只是一个快速脚注。
np_image[:,:,[0,1,2]] = np_image[:,:,[2,1,0]]
Run Code Online (Sandbox Code Playgroud)
如果有第四个通道,将保留 alpha 数据,而
np_image = np_image[:,:,[2,1,0]]
Run Code Online (Sandbox Code Playgroud)
将仅用反转的 3 通道数据覆盖 4 通道图像。(甚至更简单的 numpy 答案,img = img[:,:,::-1],将为您提供 ARGB 数据,这也很糟糕。:)