Основы представления изображений в цифровом виде

Содержание лекции:

1. Цветовое пространство RGB

2. Цветовое пространство CMYK

3. Цветовое пространство - HSV

4. Функции OpenCV

Запись шестого занятия вы можете посмотреть по этой ссылке

1. Цветовое пространство RGB

Как человек воспринимает цвет?

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

Восприятие цвета колбочками

Цветное зрение возможно благодаря тому, что колбочки делятся на 3 типа, каждый из которых восприимчив к определённому диапазону длин волн:

  • Колбочки типа К восприимчивы к коротким волнам или синему цвету.
  • Колбочки типа С восприимчивы к средним по длине волнам или зелёному цвету.
  • Колбочки типа Д восприимчивы к длинным волнам или красному цвету.
  • Палочки, в свою очередь, восприимчивы к цвету, близкому к зелёному.

Колбочки различного типа имеют разное соотношение в распределении по сетчатке: больше всего красных, затем идут зелёные, затем синие.

Видимый свет

На прошлом занятии мы затронули вопрос того, с каким диапазоном цветов может работать компьютерное зрение. Так вот, существует такое понятие, как видимый свет - это часть спектра, которую может воспринимать человеческий глаз. Помимо этого существуют и другие диапазоны, которые соответствуют ультрафиолетовому или инфракрасному излучению. Для работы с данными диапазонами обычно цвета для упрощения приводятся к тому же видимому диапазону.

Сочетание цветов

Благодаря сочетанию сигналов от отдельных колбочек, человек может видеть более полный спектр цветов. Например, белый свет соответствует сочетанию всех 3-х колбочек. Благодаря сочетанию сигналов с колбочек, восприимчивых к красному и синему цветам, человек может видеть фиолетовый цвет, а благодаря сочетанию сигналов для красного и зелёного цвета - жёлтый цвет.

Что такое “белый” цвет?

Вы наверняка помните эксперимент с уроков физики, где использовалась призма для разложения света на спектр. Белый цвет - это результат сочетания всех длин волн видимого спектра.

Цветовое пространство RGB

Итак, благодаря физиологии человеческого зрения, основной моделью в компьютерном зрении является модель RGB. R, G и B - это первые буквы названий цветов:

R - Red, красный цвет.

G - Green, зелёный цвет.

B - Blue, синий цвет.

Сочетая цвета с разной насыщенностью, модель RGB позволяет получить больше цветов.

Почему не как смешивание красок?

Некоторые, возможно задались вопросом: почему сочетание синего и жёлтого цветов даёт белый цвет, а не зелёный или чёрный.

Это объясняется тем, что существует несколько вариантов смешения цветов:

  • Аддитивное смешение.
  • И субтрактивное смешение.

Аддитивное смешение соответствует добавлению отдельных компонент цвета друг к другу, когда сигнал усиливается в результате объединения цветов.

Субтрактивное смешение соответствуют вычитанию компонент цвета, то есть сигнал перекрывается или, иначе говоря, фильтруется, при этом остаются только те компоненты, которые соответствуют фильтру.

Зависимость цвета от реализации

Глаз восприимчив к отдельным цветам по-разному, а также по-разному реализовано отображение отдельных цветов на экранах или с помощью лампы проектора. Из-за ограничений реализации, экраны способны передать только часть цветового спектра, а различные реализации расположения и сочетания компонент цветов пикселей приводят к тому, что экраны передают один и тот же цвет по-разному.

Что касается красного цвета, то на одних экранах он может выглядеть более ярким, чем зелёный, а на других - менее ярким.

Байеровский шаблон

Одним из примеров шаблона размещения цветов является байеровский шаблон, который представлен на картинке ниже. Зелёные ячейки расположены в шахматном порядке, а красный и синий чередуются по диагонали.

Зависимость от источника света

Для человеческого зрения и при съёмке на камеру важную роль играет источник света. В зависимости от источника света может меняться интенсивность отдельных участков спектра. Например, для дневного света интенсивность более-менее равномерная, а для искусственных источников света резко становятся заметны искажения.

Зависимость от объекта

А как объекты принимают тот или иной цвет? Это связано с отражающей способностью объектов. Материал, из которого состоит объект, способен отражать только часть диапазона. Или, другими словами, поглощает остальную часть диапазона.

Метамерия

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

Относительность восприятия

Не стоит забывать и о том, что человек может воспринимать одинаковые цвета по-разному относительно того, где находится данный цвет. Например, на изображении клетки A и B имеют одинаковый цвет, но клетка B воспринимается как более светлая, так как от цилиндра падает тень.

2. Цветовое пространство CMYK

У модели цветов RGB есть субтрактивный аналог - модель CMYK. Довольно сложное произношение и редко можно найти в использовании для компьютерного зрения. C - означает голубой цвет, M - фиолетовый, Y - жёлтый и K - чёрный. K используется для обозначения вместо B, чтобы не было путаницы со словом Blue, которое обозначает синий цвет. Данное цветовое пространство зачастую используется при печати документов, то есть в полиграфии.

3. Цветовое пространство - HSV

Вторым по использованию в компьютерной графике является цветовой пространство HSV. Буквы H, S и V означают следующее:

  • H - Hue или цветовой тон. Данный канал отвечает на вопрос “что это за цвет?”.
  • S - Saturation или насыщенность. Данный канал отвечает на вопрос “насколько цвет насыщен? насколько он сочный?”.
  • V - Value или яркость. Данный канал отвечает на вопрос “насколько цвет светлый или тёмный?”.

Обычно цветовое пространство HSV представляют в виде цилиндра, где вдоль окружности идёт канал H, вдоль радиуса идёт канал S и вдоль высоты идёт канал V.

Где используется модель HSV?

Модель HSV значима и используется в графике, например, художниками, так как позволяет быстрее управлять полным спектром цветов, используя одну переменную. В компьютерном зрении эта модель также имеет значение, когда необходимо моделировать цветовой спектр, насыщенность или освещение. Например, если посмотреть отдельно на канал V, то можно увидеть, что он соответствует ч/б варианту изображения.



4. Функции OpenCV

OpenCV: загрузка изображений

Перейдём к технической части и рассмотрим, как работать с изображениями с помощью библиотеки OpenCV. В первую очередь, чтобы начать работать с изображением, его необходимо загрузить с диска. Для этого используется функция imread. В качестве аргумента функции указывается относительный или абсолютный путь до файла изображения.

Функция imread:

import cv2

image = cv2.imread('image.png')

Работает с популярным форматами: *.png, *.jpg, *.bmp, *.tiff.

Спецификация функции imread

Давайте посмотрим спецификацию функции imread. Помимо имени файла, в качестве второго аргумента может быть передан режим считывания изображения. Есть несколько режимов, основными из которых являются UNCHANGED, GRAYSCALE, COLOR. Режим UNCHANGED позволяет загружать изображения с т. н. альфа-каналом.

imread(filename[, flags]) -> image

filename - название файла

flags - флаги:

  1. IMREAD_UNCHANGED - загрузка с альфа-каналом.
  2. IMREAD_GRAYSCALE - загрузка в ч/б.
  3. IMREAD_COLOR - загрузка в BGR.

image - результат, массив значений каналов пикселей

Альфа-канал

Альфа-канал - это ещё один канал в дополнение к R, G и B. Данный канал отвечает за прозрачность, а прозрачность является показателем того, в какой пропорции изображение будет смешано с другим изображением. Примером формата, содержащим альфа-канал, является формат PNG.

Цветовая модель BGR

Особенностью OpenCV является то, что по-умолчанию он работает с цветовой моделью BGR, а не RGB. Модель BGR представляет собой модель RGB наоборот, то есть каналы идут в обратном порядке. Эту особенность объясняют тем, что так исторически сложилось, данная модель была популярна у производителей оборудования и другого ПО.

OpenCV: разделение слоёв изображения

Теперь рассмотрим функцию разделения слоёв изображения - функцию split. Данная функция позволяет извлечь отдельные каналы изображения в массив или сразу в отдельные переменные.

Функция split:

channels = cv2.split(image)

# channels[0] - B

# channels[1] - G

# channels[2] - R

# channels[3] - A

b, g, r, a = cv2.split(image)

Пример работы функции split

Ниже представлен пример работы функции split:

OpenCV: просмотр значений R, G, B и A

Посмотреть значения отдельных каналов можно с помощью функции print, которая выведет в консоль массив значений. Важная особенность: Первый индекс массива соответствует координате y, то есть номеру строки.

Просмотр значений с помощью функции print:

print(image) # для всех каналов

print(b) # для одного канала

print(b[i]) # для одной строки i

print(b[:, j]) # для одного столбца j

print(b[i][j]) # для одного пикселя i, j

print(image[i][j]) # несколько значений для пикселя i, j

Размер изображения в OpenCV

Первый элемент массива изображения обычно отвечает за высоту, то есть координату y, а не ширину, то есть координату x, как некоторые могли привыкнуть. Информацию о размере изображения можно получить с помощью атрибута shape. При этом первым элементом как раз будет высота изображения, затем ширина и затем количество каналов. Например, для изображения RGBA будет 4 канала.

Размер изображения - shape:

print(image.shape)

height, width, n_channels = image.shape

# height - высота

# width - ширина

# n_channels - кол-во каналов, напр. 4 для BGRA

OpenCV: вывод изображения

Значения R, G, B и A также можно проверить визуально, выведя изображение на экран или в консоль. Для этого используются функции imshow и imwrite. Функция imshow используется в сочетании с функцией waitKey, которая позволяет дождаться пользовательского ввода перед завершением работы программы.

На экран - imshow + waitKey:

cv2.imshow('image', image)

cv2.waitKey(0) # ожидание ввода, 0 - бесконечно

В файл - imwrite:

cv2.imwrite('processed_image.png', image)

OpenCV: конвертация цветов

Для преобразования цветов из одной цветовой модели в другую используется функция cvtColor. Например, с помощью данной функции можно отбросить альфа-канал, преобразовать изображение в модель RGB или сделать изображение чёрно-белым. После преобразования изображения из одной модели в другую, с помощью функций вывода изображений OpenCV будет воспринимать изображение как в модели BGR, то есть для изображения в модели RGB цвета будут инвертированы.

Перевод изображения из одной цветовой модели в другую - cvtColor:

image_bgr = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)

image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)

image_gray = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY)

OpenCV: конвертация BGR <-> HSV

Функция cvtColor также позволяет преобразовывать изображения из модель BGR в модель HSV.

Перевод изображения из цветовой модели BGR в HSV и обратно:

image_hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV)

image_bgr = cv2.cvtColor(image_hsv, cv2.COLOR_HSV2RGB)

Практические задания:

1. Скачайте любое изображение из материалов лекции или используйте свое 
1.1 Считайте изображение и выведите его на экран во фрейм с названием “My first image”
1.2 Выведите на экран размер изображения
1.3 Скиньте код и скриншот фрейма в чат
2. Скачайте новое изображение из материалов лекции или используйте свое 
2.1 Считайте изображение 
2.2 Переведите изображение в цветовую модель RGB
2.3 Сохраните новое изображение под другим именем
2.4 Скиньте код и новое изображение в чат
3. Поэкспериментируйте минимум с 3-мя изображениями:
3.1 Скачайте новое изображение из материалов лекции или используйте свое 
3.2 Сохраните по отдельности слои изображения в цветовом пространстве RGB
3.3 Скиньте результаты в чат

Домашнее задание:
Сохраните по отдельности слои изображения в цветовом пространстве HSV для всех изображений из материалов

Завершить и продолжить