- Convert BGR and RGB with Python, OpenCV (cvtColor)
- OpenCV is BGR, Pillow is RGB
- Convert BGR and RGB with OpenCV function cvtColor()
- Convert BGR and RGB without using cvtColor()
- OpenCV — быстрый старт: начало работы с изображениями
- Вступление
- Импортируем нужные библиотеки
- Открываем изображения в OpenCV
- cv2.imread() — синтаксис и аргументы
- Посмотрим атрибуты изображения
- А теперь выведем картинку через matplotlib
- Другой пример
- Переходим к цвету
- Разделение и объединение каналов
- Перевод в иные цветовые пространства
- Преобразование BGR в RGB
- Преобразование в HSV
- Модификация отдельного канала
- Сохранение изображений
- How to convert BGR to RGB in OpenCV Python
- Step 1
- Step 2
- Step 3
- Step 4
- Step 5
Convert BGR and RGB with Python, OpenCV (cvtColor)
When the image file is read with the OpenCV function imread() , the order of colors is BGR (blue, green, red). On the other hand, in Pillow, the order of colors is assumed to be RGB (red, green, blue).
Therefore, if you want to use both the Pillow function and the OpenCV function, you need to convert BGR and RGB.
You can use the OpenCV function cvtColor() or simply change the order of ndarray .
This article describes the following contents.
- OpenCV is BGR, Pillow is RGB
- Convert BGR and RGB with OpenCV function cvtColor()
- Convert BGR and RGB without using cvtColor()
OpenCV is BGR, Pillow is RGB
When reading a color image file, OpenCV imread() reads as a NumPy array ndarray of row (height) x column (width) x color (3) . The order of color is BGR (blue, green, red).
The OpenCV function imwrite() that saves an image assumes that the order of colors is BGR, so it is saved as a correct image.
import cv2 import numpy as np from PIL import Image im_cv = cv2.imread('data/src/lena.jpg') cv2.imwrite('data/dst/lena_bgr_cv.jpg', im_cv)
When performing image processing with Pillow, you can convert ndarray to a PIL.Image object with Image.fromarray() , but in Pillow the color order assumes RGB (red, green, blue).
Therefore, if the ndarray of the image read by OpenCV imread() is converted to a PIL.Image object and saved, the image with the wrong color is saved.
pil_img = Image.fromarray(im_cv) pil_img.save('data/dst/lena_bgr_pillow.jpg')
If you want to convert ndarray and PIL.Image objects to use both Pillow and OpenCV functions, you need to convert BGR and RGB.
Convert BGR and RGB with OpenCV function cvtColor()
Various color spaces such as RGB, BGR, HSV can be mutually converted using OpenCV function cvtColor() .
Refer to the following document for the value to be specified for the parameter code .
When code is cv2.COLOR_BGR2RGB , BGR is converted to RGB.
When converted to RGB, it will be saved as a correct image even if it is saved after being converted to a PIL.Image object.
im_rgb = cv2.cvtColor(im_cv, cv2.COLOR_BGR2RGB) Image.fromarray(im_rgb).save('data/dst/lena_rgb_pillow.jpg')
When converted to RGB and saved with OpenCV imwrite() , it will be an incorrect color image.
cv2.imwrite('data/dst/lena_rgb_cv.jpg', im_rgb)
The parameter code when converting from RGB to BGR is cv2.COLOR_RGB2BGR . Use this when reading an image file as a PIL.Image , convert it to ndarray , and save it using OpenCV imwrite() .
im_pillow = np.array(Image.open('data/src/lena.jpg')) im_bgr = cv2.cvtColor(im_pillow, cv2.COLOR_RGB2BGR) cv2.imwrite('data/dst/lena_bgr_cv_2.jpg', im_bgr)
Convert BGR and RGB without using cvtColor()
Converting BGR and RGB can be realized without using cvtColor() .
There are several ways, for example, as follows:
im_bgr = cv2.imread('data/src/lena.jpg') im_rgb = im_bgr[:, :, [2, 1, 0]] Image.fromarray(im_rgb).save('data/dst/lena_swap.jpg') im_rgb = im_bgr[:, :, ::-1] Image.fromarray(im_rgb).save('data/dst/lena_swap_2.jpg')
OpenCV — быстрый старт: начало работы с изображениями
Перевожу родной OpenCV-шный туториал. И он хорош! (Сложно сказать, чем не понравились те, что есть.)
Изначально туториал в виде ноутбука , поэтому что-то я убрал. А что-то добавил. В общем, это помесь перевода с пересказом.
Вступление
Эта записнушка поможет с первыми шагами в изучении обработки изображений и машинном зрении через OpenCV. Несколько простых примеров объяснят важные вещи! Рассмотрим:
- Как открыть изображение
- Проверить его атрибуты, вроде формы или типа данных в нём
- Матричное представление картинки в Numpy
- Цветные картинки и работу с каналами изображения
- Вывод изображения через matplotlib
- Сохранение изображений
Импортируем нужные библиотеки
import cv2 # собственно OpenCV import numpy as np # для работы с математикой import matplotlib.pyplot as plt # для вывода картинки
Открываем изображения в OpenCV
Картинкой пойдёт крошечная доска в шашечку, 18×18 пикселей:
OpenCV позволяет работать с разными форматами: JPG, PNG, и так далее. Можно загружать цветные и чб-картинки, изображения с альфа-каналом. Для загрузки воспользуйтесь функцией cv2.imread() .
cv2.imread() — синтаксис и аргументы
retval = cv2.imread( filename[, flags] )
retval : если картинка не загрузилась, в retval запишется None . Такое бывает при ошибке в имени/пути, или если изображение битое.
В функцию передаётся один обязательный аргумент и один необязательный флаг:
- filename : Может быть как относительным, так и абсолютным путём. Это обязательный аргумент.
- Flags : Флаги нужны для чтения изображения в определенном формате (например, в оттенках серого/цветном/с альфа-каналом). Необязательный аргумент! Значение по умолчанию cv2.IMREAD_COLOR или 1 : этот флаг загрузит изображение как цветное.
Перед примерами посмотрим на пару флагов:
- cv2.IMREAD_GRAYSCALE или 0 : Загружаем картинку как чёрно-белую
- cv2.IMREAD_COLOR или 1 : Флаг по умолчанию, загружает картинку как цветную, без альфа-канала.
- cv2.IMREAD_UNCHANGED или -1 : Загружает картинку в том виде, в котором она есть, включая альфу.
Теперь посмотрим, что внутри шашечек:
# Читаем изображение как чёрно-белое cb_img = cv2.imread("checkerboard_18x18.png",0) # Печатаем что прочитали. Каждый пиксель есть элемент двумерного массива numpy. # Значение пикселей восьмибитное: [0,255] print(cb_img)
Посмотрим атрибуты изображения
# вывод размера изображения (то есть, массива Numpy) print("Image size is ", cb_img.shape) # тип данных в изображении (то есть, в массиве Numpy) print("Data type of image is ", cb_img.dtype)
>>>Image size is (18, 18) >>>Data type of image is uint8
8-bit unsigned integer arrays!
Uint8 — стандартный способ отображения изображений, где пиксель описывается диапазоном от 0 до 255. Если это изображение в градациях серого, пиксель со значением 0 является черным, а пиксель со значением 255 — белым.
Есть и другие форматы, конечно.
В общем, работаeт всё, что работает с ndarray : .ndim , .itemsize , .fill() .
А теперь выведем картинку через matplotlib
# рисуем шашечки plt.imshow(cb_img) # выводим шашечки plt.show()
Прочитанная цветовая палитра и отображённая могут и не совпасть. Поэтому явно укажем цветовое пространство для вывода изображения:
# Поставим настройку color map plt.imshow(cb_img, cmap='gray')
Другой пример
Расплывчатые шашечки! Такие же, как в прошлый раз, но теперь с нечёткими гранями:
# Читаем картинку как чб cb_img_fuzzy = cv2.imread("checkerboard_fuzzy_18x18.jpg",0) # Печатаем массив print(cb_img_fuzzy) # Показываем картинку plt.imshow(cb_img_fuzzy,cmap='gray') plt.show()
Переходим к цвету
До этого момента мы говорили про чёрно-белые изображения, а теперь поговорим про цветные.
Подопытным кроликом будет лого колы:
Загружаем, проверяем размер и тип данных:
coke_img = cv2.imread("coca-cola-logo.png",1) print("Image size is ", coke_img.shape) print("Data type of image is ", coke_img.dtype)
>>>Image size is (700, 700, 3) >>>Data type of image is uint8
Размер картинки поменялся, потому как чб-изображение состоит из одного канала — от чёрного до белого, а цветное — из нескольких, например, трёх: RGB .
Выведем на экран уже известными манипуляциями:
plt.imshow(coke_img) plt.show()
Цвет лого явно отличается от того, что было. Matplotlib ожидает картинку в формате RGB, а OpenCV хранит их в формате BGR. То есть, для корректного отображения нам нужно поменять местами красный и синий каналы.
# ниже numpy-специфичная конструкция: # (:) — взять каждый элемент по порядку, # (::-1) — взять каждый элемент, но в обратном порядке. coke_img_channels_reversed = coke_img[:, :, ::-1] plt.imshow(coke_img_channels_reversed)
Разделение и объединение каналов
cv2.split() — разделит многоканальный массив на несколько одноканальных.
cv2.merge() — объединит массивы в один многоканальный. Массивы должны быть одинакового размера.
Проверим их на озере. В смысле, озером.
# Разбиваем картинку на каналы: B,G,R img_NZ_bgr = cv2.imread("New_Zealand_Lake.jpg",cv2.IMREAD_COLOR) b,g,r = cv2.split(img_NZ_bgr) # Отрисовываем их plt.figure(figsize=[20,5]) plt.subplot(141);plt.imshow(r,cmap='gray');plt.title("Red Channel") plt.subplot(142);plt.imshow(g,cmap='gray');plt.title("Green Channel") plt.subplot(143);plt.imshow(b,cmap='gray');plt.title("Blue Channel") # Собираем обратно в BGR imgMerged = cv2.merge((b,g,r)) # Выводим, что получилось plt.subplot(144);plt.imshow(imgMerged[. -1]);plt.title("Merged Output") plt.show()
. не поощряется, но допускается. Помогает писать код в одну строку, а иногда это удобно!
Перевод в иные цветовые пространства
cv2.cvtColor() — преобразует изображение из одного цветового пространства в другое. В случае преобразования в RGB и из него порядок каналов надо указать явно: RGB или BGR. Формат цвета по умолчанию в OpenCV часто называют RGB, но на самом деле это BGR. Первый байт в стандартном 24-битном цветном изображении будет 8-битным синим компонентом, второй байт будет зеленым, а третий байт будет красным. Четвертый, пятый и шестой байты будут, соответственно, вторым пикселем — синий, зеленый, красный, и так до конца картинки.
Преобразование BGR в RGB
img_NZ_rgb = cv2.cvtColor(img_NZ_bgr, cv2.COLOR_BGR2RGB) plt.imshow(img_NZ_rgb) plt.show()
Преобразование в HSV
HSV — Hue, Saturation, Value — тон, насыщенность, значение.
img_hsv = cv2.cvtColor(img_NZ_bgr, cv2.COLOR_BGR2HSV) # Разобъём картинку на H,S,V каналы h,s,v = cv2.split(img_hsv) # Нарисуем и покажем их plt.figure(figsize=[20,5]) plt.subplot(141);plt.imshow(h,cmap='gray');plt.title("H Channel") plt.subplot(142);plt.imshow(s,cmap='gray');plt.title("S Channel") plt.subplot(143);plt.imshow(v,cmap='gray');plt.title("V Channel") plt.subplot(144);plt.imshow(img_NZ_rgb);plt.title("Original") plt.show()
Модификация отдельного канала
Хочется синий посиней? Есть решение!
img_NZ_bgr = cv2.imread("New_Zealand_Lake.jpg",cv2.IMREAD_COLOR) b,g,r = cv2.split(img_NZ_bgr) b = b+50 # осиняем plt.figure(figsize=[20,5]) plt.subplot(141);plt.imshow(r,cmap='gray');plt.title("Red Channel") plt.subplot(142);plt.imshow(g,cmap='gray');plt.title("Green Channel") plt.subplot(143);plt.imshow(b,cmap='gray');plt.title("Blue Channel") imgMerged = cv2.merge((r,g,b)) # в этот раз соберём сразу RGB plt.subplot(144);plt.imshow(imgMerged);plt.title("Merged Output") plt.show()
Сохранение изображений
Почти cv2.imread , только cv2.imwrite . Первым аргументом передаём путь и имя, вторым — изображение. Оба два обязательны. Расширение OpenCV подберёт, отталкиваясь от указанного в имени. Ещё можно докинуть параметров, и, например, указать качество JPG.
cv2.imwrite( filename, img[, params] )
Вот и всё! Первый маленький шажок к человеку-фотошопу пройден! До встречи в следующих сериях.
How to convert BGR to RGB in OpenCV Python
You can convert an image from BGR to RGB using OpenCV Python by following the given steps. I highly recommend you get the “Computer Vision: Models, Learning, and Inference Book” to learn Computer Vision.
How to convert BGR to RGB in OpenCV Python
Step 1
Import the OpenCV library. If OpenCV is not installed in your system then first install it using This Method.
import cv2 #cv2 is used for OpenCV library
Step 2
Now read the image from the location. In my case “F:\\AiHints” is the location and “apple.jpg” is the name of the image. Change it according to your image location and name.
image = cv2.imread("C://AiHints//apple.jpg") #imread is use to read an image from a location
Step 3
Now convert the BGR image into RGB.
RGB_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Step 4
Now display the BGR, and RGB image using the following code.
cv2.imshow("BGR Image", image) cv2.imshow("RGB Image", RGB_image)
Step 5
waitKey() open the image for a specific time in milliseconds until you press any key. The function cv2.destroyAllWindows() will destroy all the windows that we created.
cv2.waitKey(0) cv2.destroyAllWindows()