Reading Time: 5 minutes

Вы научились устанавливать OpenCV 3 и делать простые преобразования с изображениями? Самое время добавить цвета! Сегодня мы поговорим о цветовых пространствах в OpenCV, как переводить изображения из одного в другое, зачем это надо и применим на практике полученные знания. Начнем!

Что такое цвет в OpenCV

Когда мы говорим о цветном изображении – что мы имеем в виду? Можно вспомнить анекдот:

Спорят два еврея:
– Черный – это цвет!
– Нет, черный – это не цвет!
– Пошли, спросим у раввина!
Пришли к раввину:
– Ребе, скажите – черный это цвет?
Раввин полистал Тору:
– Черный – это таки да цвет!
– Спасибо, ребе! – и ушли.
Идут и опять спорят:
– Нет, но белый – это не цвет!
– Нет, белый – это цвет!
– Пошли, спросим у раввина!
Пришли опять к раввину:
– Ребе, скажите – а белый это цвет?
Раввин полистал Тору:
– Белый – это таки да цвет!
– Спасибо, ребе! – и ушли.
Идут, один другому говорит:
– Вот видишь, Мойше, я тебе продал таки да цветной телевизор!

Мы не будем хитрить с черно-белым и для примера рассмотрим следующее изображение:

Цветное изображение

Цветное изображение

Когда мы говорим о цветном изображении, мы обычно имеем в виду изображение, которое содержит пиксели минимум 3 различных цветов, с различной длинной волны. Такие как красный, синий, зеленый. Почему мы используем именно 3 различные цвета и как мы сможем с их помощью описать любой цвет отлично описано в данной статье.

Итак, загрузим данное изображение в OpenCV:

import cv2
import numpy as np

color_image = cv2.imread('opencv_color.jpg')

Если мы в данный момент проверим размерность массива через атрибут shape то увидим следующее:

>>> color_image.shape
(343, 702, 3)

Первые числа означают разрешение изображения в пикселях: ширина 702, высота 343, а с третьим числом интереснее – в данный момент оно показывает что мы имеем дело с изображением, в котором каждый пиксель характеризуется тремя числами – B G R, которые означают его синюю, зеленую и красную компоненты. Посмотрим отдельно каждую компоненту:

cv2.imshow('Color all',color_image)
cv2.imshow('Color blue',color_image[:,:,0])
cv2.imshow('Color green',color_image[:,:,1])
cv2.imshow('Color red',color_image[:,:,2])
cv2.waitKey(0)
Разложение по каналам BGR

Разложение по каналам BGR

Здесь нас поджидает первый сюрприз – если вы раньше имели дело с фотографиями или картинками, вы могли привыкнуть, что стандартное цветовое пространство – R G B. Но OpenCV по умолчанию использует BGR, в том числе и для отображения. Проверим это, изменив цветовое пространство:

color_image_rgb = cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB)
cv2.imshow('Color RGB', color_image_rgb)
cv2.imshow('Color BGR', color_image)
cv2.waitKey(0)

Как мы видим, вывод по умолчанию предполагает что изображение будет в формате BGR. В случае перевода формат в RGB мы сохраняем зеленый канал и меняем синий и красный каналы местами. Это видно по изменению синих цветов на красные.

Сравнение BGR и RGB

Сравнение BGR и RGB

Рассмотрим подробнее код. Для преобразования мы используем функцию cv2.cvtColor, она принимает всего два аргумента и отдает итоговое изображение. Первый аргумент – исходное изображение, второй – направление трансформации цветового пространства. OpenCV поддерживает следующие цветовые пространства:

  • BGR – Стандартное цветовое пространство OpenCV. При открытие файлов или отображении встроенными средствами используется именно оно. Является аналогом RGB пространства, но с другим порядком компонент.
  • RGB – В данном методе отображения цвета мы раскладываем каждый пиксель на составляющие в виде КРАСНОЙ(RED), ЗЕЛЕНОЙ(GREEN), СИНЕЙ(BLUE) компоненты. Таким образом, наше пространство цвета можно представить в виде куба со стороной 255.
  • HSV – Данное отображение создано для упрощения представление цвета человеком. Люди в случае описания цвета редко пользуются компонентами цвета, обычно они применяют такие слова как оттенок(HUE), насыщенность(SATURATION) и интенсивность(VALUE) цвета.
  • XYZ – Данная модель была выведена в лаборатории CIE для того, чтобы описать все цвета, которые может видеть глаз человека. Компоненты X, Y, Z в данной модели описывают чувствительность среднестатистического наблюдателя к стандартным возбуждениям, в общем виде они представляют доработанные  R, G, B компоненты.
  • LAB – Модель создана как доработанная модель XYZ, в которой решалась нелинейность модели с точки зрения человеческого глаза. В системе L*a*b координата L означает светлоту (в диапазоне от 0 до 100), а координаты a,b – означают позицию между зелёным-пурпурным, и синим-жёлтым цветами.
  • GRAY –  Черно-белое пространство, где яркость рассчитывается как средняя яркость всех трех компонент модели BGR.
  • YUV – Данная схема пришла из телевидения, где компонента Y – значение яркости, а UV – двух цветоразностных сигналов.

Хорошие статьи про цветовые пространства это раз, два, три. Вот пример отображения всех пространств в BGR:

color_spaces = ('RGB','GRAY','HSV','LAB','XYZ','YUV')
color_images = {color : cv2.cvtColor(image_bgr, getattr(cv2,'COLOR_BGR2' + color))
    for color in color_spaces}
for color in color_images:
    cv2.imshow(color, color_images[color])
cv2.waitKey(0)
RGB, GRAY, YUV, LAB, HSV, XYZ в BGR

RGB, GRAY, YUV, LAB, HSV, XYZ в BGR

Итог

Сегодня мы научились конвертировать изображения из одного цветового пространства в другое и разобрали какие есть пространства в OpenCV 3. Стандартное пространство в OpenCV это BGR, и об этом следует помнить, так как другие программы чаще всего работают с RGB, и для передачи изображения надо будет применить конвертацию. Конвертация происходит с помощью функции cv2.cvtColor, которая принимает исходное изображение и значение направления конвертации. Направления имеют вид cv2.COLOR_BGR2RGB, cv2.COLOR_BGR2YUV и так далее. Первая аббревиатура показывает в каком цветовом профиле находится исходное изображение а вторая, после цифры 2 – в какое мы хотим его перевести. В случае ошибочного задания исходного пространства может как быть вызвано исключение, в том случае если его размерность отличается от заданной. Например – мы задали GRAY, который содержит одну компоненту, а находимся в BGR, в котором 3, в таком случае будет исключение. Если же размерности совпадают – будет результат, отличный от ожидаемого и чаще всего не имеющий смысла. Таким образом всегда удостоверяйтесь что вы знаете в каком пространстве находитесь.

В следующий раз мы научимся размещать на изображении произвольную информацию, такую как текст и геометрические фигуры. Хорошего распознавания изображений!


0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.