Подтвердить что ты не робот

PIL поворачивает цвета изображения (BGR → RGB)

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

4b9b3361

Ответ 1

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

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

Редактировать:

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

Ответ 2

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

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

Ответ 3

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

img = img[:,:,::-1]

Ответ 4

Это был мой лучший ответ. Это, кстати, тоже работает с 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)

Ответ 5

import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)

Просто прояснить решение Martin Beckets, поскольку я не могу комментировать. Вам нужно cv2. перед постоянной цвета.

Ответ 6

Используя идеи, объясненные до... с помощью 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

Ответ 7

im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)

Ответ 8

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

Edit:

Решение Joe еще лучше, я переусердствовал.:)

Ответ 9

Как насчет этого короткого кода NumPy?

In [15]: img = cv2.imread('baboon.jpg')

# copy the array before modification
In [16]: image = img.copy()

# reverse the channels
In [17]: image = image[::-1]

P.S.: предполагает, что входное изображение не имеет канала A