Цветовые пространства в OpenCV и бинаризация

В уроке рассмотрим понятие квантования и цветовых пространств. Разберем, как переводить изображения из одного цветового пространства в другое.

Понятие квантования

Наши глаза воспринимают мир «аналогово», а камера видит мир «квантовано», рассмотрим на примере функции:

Квантование

Любой из существующих сейчас компьютеров работает с двоичными числами (нули и единицы). Существует теорема: 

Между любыми двумя рациональными числами всегда найдется еще хотя бы одно рациональное число.

Проще говоря, между двумя числами существует бесконечное множество чисел. Однако есть лимит на объем данных в компьютере, поэтому и множество чисел на нем ограничено. Для решения такой проблемы представления поступают следующим образом:

  1. Берут максимальное и минимальное значения, которые могут быть получены в ходе наблюдений.
  2. Задают количество памяти на сохранение.
  3. Разделяют полученный диапазон измерений на количество возможных «уровней». Данные для них получают из размера зарезервированной памяти.

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

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

Возьмем, например, изображение робота и загрузим на этот сайт. Попробуем приблизить это изображение:

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

Изображение кота для работы с OpenCV

Сравнение цветовых схем

Для начала просто откроем картинку и посмотрим на нее. Для этого введем следующую команду:

import sys
import numpy as np
import cv2 as cv
fn = "KOT.jpg" # путь к файлу с картинкой
img = cv.imread(fn) # загрузка изображения
cv.imshow('KOT', img) # выводим итоговое изображение в окно
cv.waitKey() # окно изображения открыто пока не нажмем какую-нибудь клавишу
cv.destroyAllWindows()

Разберем команды:

  • import cv2 as cv — импорт библиотеки OpenCV под именем cv
  • cv.imread() — принимает адрес изображения, возвращает, массив соответствующий изображению.
  • cv.imshow() — принимает название окна и имя переменной, которую надо отобразить.
  • cv.waitKey() — останавливает выполнение скрипта до нажатия клавиши на клавиатуре.

После выполнения команды на экран выводится само изображение кота.

Виды цветовых схем

Рассмотрим, какие бывают световые схемы:

  • BGR — стандартное цветовое пространство OpenCV (используется по умолчанию). Является аналогом RGB пространства, но с другим порядком компонентов.
  • RGB — в данном методе отображения цвета мы раскладываем каждый пиксель на составляющие в виде красной (red), зеленой (green) и голубой (blue) компоненты. 
  • HSV — это отображение создано для упрощения представление цвета человеком. Люди в случае описания цвета редко пользуются компонентами цвета, обычно они применяют такие слова как оттенок (hue), насыщенность (saturation) и интенсивность (value) цвета. 
  • XYZ — модель была выведена в лаборатории CIE. Задача состояла в описании всех цветов, которые может видеть глаз человека. Компоненты X, Y, Z в данной модели описывают чувствительность среднестатистического наблюдателя к стандартным возбуждениям.
  • GRAY — черно-белое пространство, где яркость рассчитывается как средняя яркость всех трех компонент модели BGR. 
  • YUV — данная схема пришла из телевидения, где компонента Y – значение яркости, а UV – двух цветоразностных сигналов.

Перевод изображения в другое цветовое пространство

Для перевода изображения в другое цветовое пространство достаточно написать следующую строчку:

img = cv.cvtColor(img,cv.COLOR_BGR2RGB)

Функция img = cv.cvtColor() принимает на вход изменяемое изображение и «направление» для перехода: cv.COLOR_BGR2RGB. Первым указывается текущий «формат представления» (BGR), далее символ «2» (созвучно с английским «to», которое интерпретируется как русское «в») после конечный «формат представления». Получается, что мы вводим команду перевести формат BGR в RGB. Получаем код:

import sys
import numpy as np
import cv2 as cv
fn = "KOT.jpg" # путь к файлу с картинкой
img = cv.imread(fn) # загрузка изображения
img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('KOT', img) # выводим итоговое изображение в окно
cv.waitKey() # окно изображения открыто пока не нажмем какую-нибудь клавишу
cv.destroyAllWindows()

После выполнения получаем:

Изображение кота для работы с OpenCV

Изображение по порогу (бинаризация)

Для анализа изображений проще всего использовать двухцветное (черно-белое) изображение. Его можно получить, если добавить следующие строки:

img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, img = cv.threshold(img, 127, 255, 0)

Итоговый код имеет вид:

import sys
import numpy as np
import cv2 as cv
fn = "KOT.jpg" # путь к файлу с картинкой
img = cv.imread(fn)
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, img = cv.threshold(img, 127, 255, 0)
cv.imshow('KOT', img) # выводим итоговое изображение в окно
cv.waitKey()
cv.destroyAllWindows()

Результат выполнения:

Изображение кота для работы с OpenCV

Таким образом, мы:

  1. Перевели изображение в оттенки серого.
  2. Командой threshold превратили все пиксели, которые темнее (меньше) 127 в 0. А все пиксели, которые ярче (больше) 127 — в 255.

Попробуем использовать другие значения:

ret, img = cv.threshold(img, 80, 255, 0)

Получаем следующее изображение:

Изображение кота для работы с OpenCV

Курсы Робикс, в которых изучается этот материал.

  1. Duckietown: робот с системой Автопилота
Сохраните или поделитесь
Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *