PIL rotation des couleurs de l'image (BGR - > RGB)

j'ai une image où les couleurs sont BGR. Comment puis-je transformer mon image PIL pour échanger efficacement les éléments B et R de chaque pixel?

29
demandé sur Claudiu 2011-01-11 22:06:16

8 réponses

en Supposant qu'aucune bande alpha, n'est-ce pas aussi simple que cela?

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

Edit:

Hmm... Il semble que PIL ait quelques problèmes à cet égard... im.split() ne semble pas fonctionner avec les versions récentes de PIL (1.1.7). Il peut (?) fonctionne toujours avec 1.1.6, cependant...

Sinon, si vous avez numpy disponible, vous pouvez l'utiliser pour ce faire: (Encore une fois, je suppose une image RGB ici, une image RGBA!):

data = np.asarray(im)
im = Image.fromarray(np.roll(data, 1, axis=-1))

Si im.split() ne fonctionnerait que, il est certainement plus simple et plus lisible!

15
répondu Joe Kington 2011-01-11 20:05:42

Juste pour ajouter un plus à la date de réponse:

avec la nouvelle interface cv2 les images chargées sont maintenant des tableaux numpy automatiquement.

Mais openCV cv2.imread () charge les images en BGR tandis que numpy.imread () les charge en RGB.

la façon la plus facile de convertir est d'utiliser openCV cvtColor.

import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR, cv2.COLOR_BGR2RGB)
64
répondu Martin Beckett 2015-03-24 20:49:26

je sais que c'est une vieille question, mais j'ai eu le même problème et résolu avec:

img = img[:,:,::-1]
54
répondu Peter9192 2016-09-01 11:37:25

C'était ma meilleure réponse. Ce n'est, par ailleurs, travailler avec 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)
6
répondu sberry 2011-01-11 20:39:27
import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)

juste pour clarifier la solution de Martin Beckets, car je ne suis pas en mesure de commenter. Vous avez besoin de cv2. devant la constante de couleur.

2
répondu user2692263 2014-03-23 11:40:56

en Utilisant les idées expliqué avant... utilisation de numpy vous pourriez.

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')

en Outre, il peut supprimer le canal 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
répondu BlaZerTech 2015-10-09 13:31:28

Vous devriez être en mesure de le faire à l' ImageMath module.

Edit:

la solution de Joe est encore meilleure, j'y réfléchissais trop. :)

0
répondu Amber 2013-08-11 18:16:50
im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)
0
répondu Andrei Antonov 2018-02-01 07:49:51