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?
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!
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)
je sais que c'est une vieille question, mais j'ai eu le même problème et résolu avec:
img = img[:,:,::-1]
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)
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.
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
im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)