Reading Time: 5 minutes

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как мы видим, вывод по умолчанию предполагает что изображение будет в формате 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:

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, в таком случае будет исключение. Если же размерности совпадают - будет результат, отличный от ожидаемого и чаще всего не имеющий смысла. Таким образом всегда удостоверяйтесь что вы знаете в каком пространстве находитесь.

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


Leave a Reply

Your email address will not be published.

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