Как работать с графикой на Python

Как работать с графикой на Python

Обзор библиотеки Pillow.

Первые решения для работы с графикой у Python появились в 1990 году — как и сам язык. Тогда был доступен только набор программ ImageMagick. Сейчас в Python несколько десятков библиотек, поддерживающих графическую обработку. Pillow — популярный вариант для стандартной обработки изображений.

Рассказываем, что умеет Pillow и чем отличается от других Python-пакетов.

Что делают графические Python-библиотеки

Чтобы работать с изображениями, компьютеру, как правило, необходимо их проанализировать — форматировать или извлечь свойства.

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

В чем особенность Pillow

Pillow — форк библиотеки PIL (Python Imaging Library). Последний перестали обновлять в 2009 году, поэтому создали Pillow — нативный модуль, половина которого создана на Python, а половина — на C. Pillow — кроссплатформенная библиотека. Чтобы запустить ее на Windows, достаточно воспользоваться системой управления пакетами pip. На iOS нужно сначала поставить XCode — среду разработки, и Homebrew — утилиту для командной строки в macOS, которая позволяет устанавливать приложения.

Pillow считывает больше 40 форматов изображений в режиме чтения. Полная поддержка есть у 21 формата, среди которых — BMP, JPEG, GIF, TIFF, PNG и PSD. Больше деталей — в Pillow-документации.

Что умеет библиотека

Основные функции Pillow находятся в модуле Image. Создать экземпляр этого класса можно, загрузив изображения, обработав другие изображения или создав их. Если файл считывается с диска с помощью функции open, то библиотека определяет его формат автоматически.

В Pillow есть отложенная «ленивая» загрузка — при открытии изображения не происходит его декодирование, то есть изображения не считываются с файла, пока пользователь не попытается их обработать. Вы можете посмотреть свойства файла, определить, отвечает ли он требованиям и стоит ли с ним работать. Только после вызова функции load для файла используется необходимое количество оперативной памяти.

Часто обрезка изображений — первый этап обработки. Для этого в Pillow можно использовать два способа:

  • функцию crop, в которой указывают координаты верхнего левого и правого нижнего угла, и команду resize;
  • команды reduce и thumbnail. Этот способ учитывает соотношение сторон картинки.

Чтобы наложить одно изображение на другое (например, для нанесения водяных знаков), создают новое изображение, накладывая водяной знак на основную картинку. По умолчанию «вставленное» изображение будет в верхнем левом углу. Чтобы сделать фон изображения прозрачным, используют модуль ImageDraw, который вырезает фигуры на картинках. Насыщенность цвета фигуры можно регулировать с помощью модуля ImageEnhance. У всех классов улучшения в модуле — общий интерфейс: показатели яркости, контрастности и четкости умножают на необходимый коэффициент. Зеркально отобразить картинку можно с помощью функции transpose и константы flip_left_right. Библиотека также позволяет конвертировать изображения в разные цветовые режимы.

Конвертация в OpenCV

Pillow способна автоматически обрабатывать большие массивы фотографий. В версии Pillow-SIMD изображение с разрешением 5184 на 3456 конвертируется в картинку размером 320 пикселей за 0,79 секунды. Pillow часто применяют для унификации фото и анализа их свойств. Для машинного зрения применяют другую библиотеку — OpenCV.

OpenCV не читает EXIF или цифровой профиль, поэтому нельзя заранее узнать формат изображения. Дело в том, что OpenCV предрасположена к работе с верифицированными источниками. Например, камерой, которая присылает фото в одном формате и разрешении.

Изображения из Pillow можно экспортировать в NumPy, и OpenCV сможет обработать их как собственные. И наоборот.

Какие задачи решают другие графические Python-библиотеки

  • Scikit-image

    Это библиотека с открытым кодом, работающая с массивами NumPy. Среди ее функций — конвертирование цветового пространства, улучшение изображения, фильтр сортировки и операции рисования графики — построение графиков, гистограмм, создание шаблонов. Также Scikit-image позволяет регулировать интенсивность изображения.

  • Matplotlib

    Это Python-пакет для визуализации математических операций — создания диаграмм, гистограмм и графиков функций. Также в Matplotlib реализовано рисование контуров объектов и интерактивная маркировка — возможность делать пометки на картинках. Скрипт запоминает места кликов и сохраняет их в списке.

  • SciPy

    Библиотека построена на NumPy, а ее основное предназначение — выполнение инженерных и научных расчетов. Но в ней можно работать и с изображениями. Например, создавать гауссовский шум на картинках. Часто это начальный этап интерполяции и вычисления точек интереса. Еще в SciPy есть операции, определяющие изменение интенсивности изображения.

  • NumPy

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

    Еще NumPy используют для обработки датасетов в computer vision. Из-за высокого разрешения картинок в приложениях компьютерного зрения часто применяют уменьшение размерности. В NumPy это можно реализовать с помощью метода главных компонент (PCA). Таким образом можно хранить больше информации о тренировочных данных, используя меньше измерений.

Ещё статьи
Как системы работают с высокими нагрузками.
Зачем нужны библиотеки для векторизации.