Блог AST-SoftPro
Обработка изображений в Python: OpenCV, Pillow и AI
Введение в обработку изображений в Python
Обработка изображений — важная область компьютерных технологий, используемая в анализе данных, распознавании объектов, медицинской визуализации и системах безопасности. В Python существует множество библиотек для работы с графикой: OpenCV, Pillow и интеграция с моделями искусственного интеллекта (AI). Каждая из них решает свои задачи — от простых преобразований до сложных задач компьютерного зрения.
В этой статье рассматриваются три основных подхода:
-
Базовые операции с изображениями через Pillow;
-
Расширенные возможности OpenCV для анализа изображений;
-
Интеграция обработанных данных с моделями машинного обучения и AI (включая TensorFlow, PyTorch).
Статья не претендует на исчерпывающий охват всех возможностей библиотек, но даёт практические примеры кода и пояснения по каждому этапу.
Pillow: простая работа с изображениями в Python
Pillow — это обёртка над PIL (Python Imaging Library), предназначенная для загрузки, преобразования и сохранения изображений. Она подходит для задач, где не требуется сложная аналитика (например, изменение размера, поворот, конвертация формата).
Установка и базовая загрузка
Для начала нужно установить библиотеку:
pip install pillow
Пример загрузки изображения из файла:
from PIL import Image
image = Image.open('example.jpg')
print(f'Размер: {image.size}, Формат: {image.format}')
## Отображение (только в Jupyter или GUI)
image.show()
Примечание: show() работает не во всех средах выполнения. Для проверки можно использовать .save('output.jpg').
Основные операции с изображениями
- Изменение размера:
resized = image.resize((800, 600))
- Поворот на 90 градусов по часовой стрелке:
rotated = image.rotate(90)
- Конвертация в монохром (чёрно-белое):
grayscale = image.convert('L')
- Сохранение результата:
resized.save('output_resized.jpg', format='JPEG')
Ограничения Pillow
Pillow не предоставляет инструментов для анализа изображений (например, обнаружение краёв или распознавание лиц). Она эффективна только на этапе предобработки: конвертация форматов, сжатие, базовые преобразования.
OpenCV: компьютерное зрение в Python
OpenCV — мощная библиотека для обработки и анализа изображений. Поддерживает работу с видео, детекцию объектов, фильтрацию, машинное обучение и другие продвинутые функции. Чаще используется в задачах компьютерного зрения (computer vision).
Установка OpenCV
pip install opencv-python-headless # версия без GUI
headless-версия подходит для серверных сред — она не требует графической подсистемы.
Загрузка и просмотр изображения
Пример загрузки JPEG-файла:
import cv2
image = cv1imread('example.jpg')
if image is None:
print('Ошибка: изображение не загружено')
else:
# Отображение (только в средах с GUI, например JupyterLab)
cv2.imshow('Image', image)
cv2.waitKey(0) # Ждём нажатия клавиши
Важно: cv2.imshow() работает только при наличии графической среды. В серверных приложениях рекомендуется использовать .imwrite() для сохранения.
Основные операции OpenCV
- Преобразование в оттенки серого:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- Инверсия цвета (чёрный становится белым):
inverted = ~gray # Битовая инверсия
- Обнаружение краёв с помощью Canny:
edges = cv2.Canny(image, threshold1=50, threshold2=150)
- Поворот на угол α (в градусах):
rows, cols = image.shape[:2] center = (cols // 2, rows // 2) dst = cv2.getRotationMatrix2D(center, angle=45, scale=1.0) rotated = cv2.warpAffine(image, dst, (cols, rows))
- Сохранение изображения:
cv2.imwrite('output_opencv.jpg', rotated)
Работа с видео
OpenCV позволяет обрабатывать видеопотоки в реальном времени:
cap = cv2.VideoCapture(0) # Камера по умолчанию (webcam)
while True:
ret, frame = cap.read()
if not ret:
break
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('Webcam', frame)
cv2.imshow('Gray', gray_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Такой код можно адаптировать под анализ видеозаписей: cv2.VideoCapture('video.mp4').
Интеграция с моделями машинного обучения и AI
Для решения сложных задач (распознавание лиц, классификация изображений) изображения проходят предварительную обработку в OpenCV или Pillow, а затем подаются на вход нейронной сети. Наиболее популярные фреймворки — TensorFlow и PyTorch.
Подготовка данных: нормализация и масштабирование
Модель ожидает тензор фиксированного размера (например, 224×224×3). Изображение нужно:
-
Изменить размер;
-
Привести к типу float32;
-
Нормализовать значения пикселей в диапазон [0, 1] или [-1, 1].
Пример обработки через OpenCV перед передачей в модель:
import cv2
from tensorflow.keras.applications import MobileNetV2
# Загрузка и предобработка
image = cv2.imread('test.jpg')
img_resized = cv2.resize(image, (224, 224))
img_normalized = img_resized.astype(np.float32) / 255.0
Примечание: Некоторые модели требуют вычитания среднего значения или применение других нормализаций — см. документацию конкретной архитектуры.
Пример: классификация с помощью MobileNetV2
from tensorflow.keras.applications import MobileNetV2, preprocess_input
import numpy as np
def predict_image(model_path='mobilenet_v2_1.0_224_metadata.json', image_path='test.jpg'):
model = tf.keras.models.load_model(model_path)
img = cv2.imread(image_path)
resized = cv2.resize(img, (224, 224))
input_img = np.expand_dims(resized, axis=0) # Добавляем batch dimension
processed = preprocess_input(input_img) # Подготовка под MobileNetV2
prediction = model.predict(processed)
label = 'Категория' if prediction[0][1] > prediction[0][0] else 'Не категория'
return label, np.max(prediction[0])
Для работы preprocess_input должен соответствовать ожидаемому формату модели.
Расширения: YOLO и детекция объектов
Библиотека YOLO (You Only Look Once) позволяет находить объекты на изображении. Её можно использовать через OpenCV с предобработкой:
from yolov5 import detect as yolo_detect
# Запуск модели YOLOv5
results = yolo_detect.run(source='test.jpg', weights='yolov5s.pt')
for det in results[0]: # Первая картинка в выводе
print(f'Объект: {det["name"]}, Координаты: {det["xyxy"]}')
YOLO требует отдельной установки (pip install yolov5), а веса — скачать с официального репозитория.
Совместное использование Pillow и AI-моделей
Pillow может использоваться для предварительной обработки (например, обрезка по ROI), после чего данные передаются в модель:
from PIL import Image
cv2_image = cv2.imread('original.jpg')
pil_img = Image.fromarray(cv2_image)
crop_box = (100, 50, 300, 200) # Левый верх: x,y; правый низ: w,h
cropped_pil = pil_img.crop(crop_box)
## Преобразование обратно в OpenCV формат для модели
cv_cropped = np.array(cropped_pil)
Такой подход полезен, когда нужно вручную выделить область интереса (например, лицо на фото) и затем проанализировать её.
Сравнение библиотек: выбор инструмента
| Библиотека | Простая обработка | Анализ изображений | Поддержка видео | Интеграция с AI |
|---|---|---|---|---|
| Pillow | ✅ Отличная | ❌ Нет | ❌ | ⚠️ Ограниченно |
| OpenCV | ✅ Хорошая | ✅ Отлично | ✅ Да | ✅ Хорошо |
Рекомендация: Используйте Pillow для задач форматирования и конвертации. OpenCV — для анализа, фильтрации и компьютерного зрения. Для AI-расширений всегда применяйте предварительную обработку через одну из этих библиотек.
Заключение
В обработке изображений Python предоставляет мощные инструменты:
-
Pillow — простой способ изменить размер, формат или цвет изображения;
-
OpenCV — полноценный фреймворк для анализа и компьютерного зрения;
-
Интеграция с AI-моделями (TensorFlow, PyTorch, YOLO) возможна после предварительной обработки.
Выбор библиотеки зависит от задачи: если нужно просто изменить изображение — достаточно Pillow. Для сложных задач распознавания или анализа видео — OpenCV будет более подходящим решением. При работе с нейросетями важно правильно подготовить данные: нормализовать, масштабировать и привести к нужному формату.
Практические примеры в статье демонстрируют базовые операции без усложнений, что позволяет сосредоточиться на логике обработки, а не на реализации конкретных алгоритмов.