Неделя 3: Работа с цветами и цветовыми пространствами
1. Цветовые пространства в OpenCV
OpenCV поддерживает несколько цветовых моделей, каждая из которых полезна для разных задач компьютерного зрения.
Основные цветовые пространства:
BGR - стандартный формат OpenCV (синий, зеленый, красный)
RGB - традиционный формат (красный, зеленый, синий)
HSV (Hue, Saturation, Value) - полезно для цветовой сегментации
LAB (Luminance, A, B) - близко к человеческому восприятию
Grayscale - черно-белое представление
2. Преобразование между цветовыми пространствами
Основная функция - cv2.cvtColor(src, code)
python
Copy
import cv2
import numpy as np
image = cv2.imread("image.jpg")
# Преобразование BGR в другие форматы
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Отображение результатов
cv2.imshow("Original BGR", image)
cv2.imshow("RGB", rgb_image)
cv2.imshow("HSV", hsv_image)
cv2.imshow("LAB", lab_image)
cv2.imshow("Grayscale", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. Работа с HSV пространством
HSV особенно полезно для выделения объектов по цвету.
Диапазоны HSV для распространенных цветов:
Цвет
Нижний диапазон
Верхний диапазон
Красный
(0, 100, 100)
(10, 255, 255)
Зеленый
(40, 100, 100)
(80, 255, 255)
Синий
(100, 100, 100)
(140, 255, 255)
Пример выделения синего цвета:
python
Copy
# Преобразование в HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# Определение диапазона синего цвета
lower_blue = np.array([100, 100, 100])
upper_blue = np.array([140, 255, 255])
# Создание маски
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# Применение маски
result = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Original", image)
cv2.imshow("Mask", mask)
cv2.imshow("Result", result)
cv2.waitKey(0)
4. Разделение и объединение каналов
Можно работать с отдельными каналами изображения.
python
Copy
# Разделение каналов BGR
b, g, r = cv2.split(image)
# Создание пустого изображения
zeros = np.zeros(image.shape[:2], dtype="uint8")
# Восстановление изображения с перестановкой каналов
red_channel = cv2.merge([zeros, zeros, r])
green_channel = cv2.merge([zeros, g, zeros])
blue_channel = cv2.merge([b, zeros, zeros])
# Объединение каналов по-новому
merged = cv2.merge([r, g, b]) # Теперь это RGB
5. Гистограммы цветов
Анализ распределения цветов в изображении.
python
Copy
from matplotlib import pyplot as plt
# Вычисление гистограммы для каждого канала
color = ('b', 'g', 'r')
for i, col in enumerate(color):
hist = cv2.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=col)
plt.xlim([0, 256])
plt.title('Color Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()
6. Коррекция цвета
Изменение яркости и контраста
python
Copy
alpha = 1.5 # Контраст (1.0 - оригинал)
beta = 50 # Яркость (0 - без изменений)
adjusted = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
Автоматическая коррекция (CLAHE)
python
Copy
# Преобразование в LAB
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
# Применение CLAHE к L-каналу
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
l = clahe.apply(l)
# Объединение каналов и обратное преобразование
updated_lab = cv2.merge((l, a, b))
enhanced = cv2.cvtColor(updated_lab, cv2.COLOR_LAB2BGR)
7. Практическое задание
1. Преобразуйте изображение в HSV и выделите зеленые объекты
2. Разделите изображение на каналы и создайте новое изображение, где:
o Красный канал усилен в 2 раза
o Зеленый канал уменьшен в 2 раза
o Синий канал оставлен без изменений
3. Постройте гистограммы для каждого канала оригинального изображения
4. Примените CLAHE для улучшения контраста
8. Итоги
OpenCV использует BGR по умолчанию, а не RGB
HSV пространство идеально для цветовой сегментации
Разделение каналов позволяет точечно редактировать изображение
Гистограммы помогают анализировать распределение цветов
CLAHE эффективен для улучшения контраста
Следующая тема: Фильтрация изображений: размытие, шумоподавление и выделение границ