У меня есть изображение, где цвета BGR. Как я могу преобразовать изображение PIL для эффективной замены элементов B и R каждого пикселя?
PIL поворачивает цвета изображения (BGR → RGB)
Ответ 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