OpenCV (Open Source Computer Vision Library) — это библиотека для обработки изображений и компьютерного зрения. Она используется в:
- 📸 Фильтрации и преобразовании изображений.
- 🚗 Распознавании объектов (лица, машины, дорожные знаки).
- 🤖 Глубоком обучении (нейросетях).
- 🎥 Анализе видео (трекинг, стабилизация).
🌍 Где применяется OpenCV?
- Медицина: Анализ рентгеновских снимков, диагностика заболеваний
- Безопасность: Распознавание лиц в системах видеонаблюдения
- Автомобили: Беспилотные транспортные системы
- Ретушь: Фильтры в Instagram и других соцсетях
- Дополненная реальность: Фильтры в Snapchat, игры типа Pokémon GO
Установка OpenCV
Первым делом установим библиотеку:
pip install opencv-python
🛠️ 1. Базовые операции с изображениями
Загрузка и сохранение изображения
import cv2
# Загружаем изображение (входные данные - файл 'input.jpg')
# Второй аргумент:
# cv2.IMREAD_COLOR - цветное (по умолчанию)
# cv2.IMREAD_GRAYSCALE - ч/б
# cv2.IMREAD_UNCHANGED - с альфа-каналом
img = cv2.imread('input.jpg', cv2.IMREAD_COLOR)
# Проверяем успешность загрузки
if img is None:
print("Ошибка загрузки изображения!")
else:
# Сохраняем изображение (результат - файл 'output.jpg')
cv2.imwrite('output.jpg', img)
print("Изображение успешно обработано!")
🔄 2. Преобразование цветовых пространств
Что такое цветовые пространства?
Цветовые пространства — это математические модели, которые описывают цвета в виде числовых значений.
OpenCV и другие библиотеки используют разные форматы представления цветов.
Почему OpenCV использует BGR вместо RGB?
- Историческая причина: В старых камерах использовался порядок BGR (Blue-Green-Red).
- Совместимость: Многие алгоритмы OpenCV были разработаны под BGR.
Конвертация BGR → RGB → Grayscale
python
import cv2
import matplotlib.pyplot as plt
# Загружаем изображение
img = cv2.imread('input.jpg')
# Конвертируем BGR (OpenCV) в RGB (для matplotlib)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# Конвертируем в градации серого
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Отображаем результаты
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.title("RGB Изображение")
plt.subplot(1, 2, 2)
plt.imshow(img_gray, cmap='gray')
plt.title("Черно-белое изображение")
plt.show()
Применение: Преобразование цветных медицинских снимков в ч/б для анализа тканей.
🌫️ 3. Размытие изображения
🔍 Гауссово размытие: почему оно так называется?
Гауссово размытие (Gaussian Blur) — один из самых популярных методов сглаживания изображений. Его название происходит от функции Гаусса (гауссианы), которая лежит в основе этого фильтра.
📜 История названия
Название связано с именем Карла Фридриха Гаусса (1777–1855) — немецкого математика, который ввёл понятие нормального распределения (кривой Гаусса). Эта функция описывает:
- Распределение случайных величин в природе (например, рост людей, шумы в изображениях).
- Как "размазать" информацию с убывающим весом от центра к краям.
Гауссово размытие
import cv2
img = cv2.imread('portrait.jpg')
# Применяем размытие Гаусса
# Параметры:
# (5, 5) - размер ядра размытия (должен быть нечётным)
# 0 - стандартное отклонение по X
blurred = cv2.GaussianBlur(img, (5, 5), 0)
# Сохраняем результат
cv2.imwrite('blurred_portrait.jpg', blurred)
Применение: Используется в системах защиты приватности для размытия номеров автомобилей или лиц.
✂️4. Обрезка и поворот изображения
Выделение области интереса (ROI)
ROI (Region of Interest) — это выделение определенной части изображения для дальнейшей обработки. Это одна из самых часто используемых операций в компьютерном зрении.
import cv2
img = cv2.imread('family_photo.jpg')
# Обрезаем изображение [y:y+h, x:x+w]
# В данном случае выделяем область с 100 по 400 пиксель по высоте
# и с 200 по 500 пиксель по ширине
cropped = img[100:400, 200:500]
# Поворачиваем изображение на 45 градусов
(h, w) = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated = cv2.warpAffine(img, M, (w, h))
# Сохраняем результаты
cv2.imwrite('cropped.jpg', cropped)
cv2.imwrite('rotated.jpg', rotated)
Применение: Автоматическая обрезка фотографий для паспортов или документов.
🎛 5. Пороговая обработка
Бинаризация изображения
import cv2
# Загружаем изображение в градациях серого
img = cv2.imread('document.jpg', cv2.IMREAD_GRAYSCALE)
# Применяем пороговую обработку
# 127 - пороговое значение
# 255 - максимальное значение
# cv2.THRESH_BINARY - тип порога
_, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# Адаптивная пороговая обработка
adaptive = cv2.adaptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
cv2.imwrite('binary.jpg', binary)
cv2.imwrite('adaptive.jpg', adaptive)
Применение: Обработка сканированных документов для улучшения читаемости текста.
🖌️ 6. Рисование на изображении
Добавление фигур и текста
import cv2
import numpy as np
# Создаем черное изображение 500x500 пикселей
img = np.zeros((500, 500, 3), dtype="uint8")
# Рисуем синюю линию толщиной 5px
cv2.line(img, (50, 50), (400, 50), (255, 0, 0), 5)
# Рисуем зеленый прямоугольник
cv2.rectangle(img, (50, 100), (400, 200), (0, 255, 0), 3)
# Рисуем красный круг
cv2.circle(img, (225, 350), 100, (0, 0, 255), -1) # -1 означает заливку
# Добавляем текст
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV Demo!', (50, 450),
font, 1, (255, 255, 255), 2, cv2.LINE_AA)
cv2.imwrite('drawing.jpg', img)
Применение: Добавление аннотаций к медицинским снимкам или техническим схемам.
Заключение
OpenCV — это не просто библиотека для программистов. Это:
- Мощный инструмент для автоматизации работы с изображениями
- Основа для современных технологий компьютерного зрения
- Платформа для творчества и инноваций