PIL вращать цвета изображения (BGR -> RGB) - PullRequest
39 голосов
/ 11 января 2011

У меня есть изображение, где цвета BGR.Как я могу преобразовать свое изображение PIL, чтобы эффективно заменить элементы B и R каждого пикселя?

Ответы [ 9 ]

87 голосов
/ 10 марта 2012

Просто чтобы добавить более актуальный ответ:

С загруженными изображениями нового интерфейса 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)
76 голосов
/ 01 сентября 2016

Я знаю, что это старый вопрос, но у меня была та же проблема, и я решил ее с помощью:

img = img[:,:,::-1]
21 голосов
/ 11 января 2011

При условии отсутствия альфа-диапазона, не так ли просто?

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

Edit:

Хм ... Кажется, в PIL есть несколько ошибок в этом отношении ... im.split(), похоже, не работает с последними версиями PIL (1.1.7). Может (?) Все еще работать с 1.1.6, хотя ...

6 голосов
/ 11 января 2011

Это был мой лучший ответ.Это, кстати, работает и с Альфой.

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 голосов
/ 23 марта 2014
import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)

Просто чтобы прояснить решение Мартина Беккета, поскольку я не могу комментировать. Вам нужен CV2. перед постоянной цвета.

2 голосов
/ 28 мая 2019

Добавление решения с использованием многоточия

image = image[...,::-1]

В этом случае многоточие ... эквивалентно :,:, тогда как ::-1 инвертирует порядок последнего измерения(каналы).

1 голос
/ 01 февраля 2018
im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)
1 голос
/ 09 октября 2015

Используя идеи, описанные ранее ... используя 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')

Дополнительно можно удалить альфа-канал.

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
0 голосов
/ 11 января 2011

Вы можете сделать это с помощью модуля ImageMath.

Edit:

Решение Джо еще лучше, я его обдумал. :)

...