Цветовые пространства в 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()
После выполнения получаем:
Изображение по порогу (бинаризация)
Для анализа изображений проще всего использовать двухцветное (черно-белое) изображение. Его можно получить, если добавить следующие строки:
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()
Результат выполнения:
Таким образом, мы:
- Перевели изображение в оттенки серого.
- Командой threshold превратили все пиксели, которые темнее (меньше) 127 в 0. А все пиксели, которые ярче (больше) 127 — в 255.
Попробуем использовать другие значения:
ret, img = cv.threshold(img, 80, 255, 0)
Получаем следующее изображение:
Добавить комментарий