Статья представляет собой обзор наиболее популярных Python-библиотек, предназначенных для простого и понятного преобразования изображений (image).
Современный мир заполнен гигантскими объемами данных, причем существенная часть этих данных — изображения. Но чтобы работать с image, картинку надо сначала обработать. Под обработкой в данном случае подразумевается процесс анализа и технических операций, производимых с цифровым изображением в целях улучшения качества image либо извлечения информации, необходимой для последующего применения.
Общие задачи следующие:
- кадрирование,
- отражение,
- сегментация,
- вращение,
- классификация,
- восстановление,
- извлечение признаков,
- распознавание.
Прекрасным средством для решения вышеописанных задач является язык программирования Python. Вдобавок к этому, данный язык программирования очень доступен, широко популярен и повсеместно применяется в качестве научно-технического языка. А раз так, то неудивительно, что внутри экосистемы Пайтона существует большое количество хороших инструментов, предназначенных для обработки image. Их и рассмотрим.
Scikit-image
Пакет для Питона, имеющий открытый исходный код и работающий с массивами NumPy. Позволяет реализовывать алгоритмы и утилиты с последующим их применением в научно-исследовательских, образовательных и даже промышленных программных приложениях. Пакет прост и понятен, с ним справятся даже новички. Код написан активным сообществом, реализован качественно и является рецензированным.
Также библиотека хорошо задокументирована, причем в документации можно найти много практических примеров.
Пакет импортируется как skimage, а большая часть функций располагается внутри подмодулей. На картинке ниже пример, каким путем можно выполнить фильтрацию изображений:

NumPy
Одна из основных и наиболее популярных Python-библиотек, которая поддерживает массивы. Изображение — это стандартный NumPy-массив, который содержит пиксели точек данных. В результате в процессе выполнения основных NumPy-операций (срезов, масок, индексирования) есть возможность менять пиксельные значения изображения. Непосредственно image можно загрузить с помощю skimage либо отобразить через Matplotlib.
Все нужные ресурсы и документация есть на официальном сайте NumPy.
Вот каким путем можно выполнить маскировку image с помощью NumPy:

Как видим, распознать внешность человека с камерой теперь невозможно.
SciPy
SciPy — не менее важный научный модуль, сравнимый с NumPy. Он позволяет решать основные задачи по обработке изображений и не только. К примеру, в подмодуле scipy.ndimage есть функции, работающие в n-мерных NumPy-массивах. Текущий пакет содержит функции для линейной/нелинейной фильтрации, интерполяции В-сплайнами, бинарной морфологии и пр. Полный список функций лучше смотреть в документации.
Рассмотрим, как SciPy используется для размытия изображений посредством фильтра Гаусса:

PIL, он же Pillow
PIL — это Python Imaging Library и бесплатная библиотека, предназначенная для открытия, работы, а также сохранения разных форматов изображений. Неприятная новость заключается в том, что ее разработка остановилась, причем последнее обновление выходило в далеком 2009. Но есть и хорошая новость: существует Pillow — форк PIL, который активно развивается и характеризуется простой установкой. Pillow работает на основных ОС и поддерживает Python 3-й версии. Имеет базовый функционал методов для обработки изображений, в том числе точечные операции, преобразование цветового пространства, фильтры с набором ядер свертки и пр.
Примеры использования и процесс установки хорошо описаны в документации.
Улучшаем image через ImageFilter в Pillow:
from PIL import Image, ImageFilter
#считывание изображения
im = Image.open( 'image.jpg' )
#отображение изображения
im.show()
from PIL import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.8).show("30% more contrast")

OpenCV
Одна из наиболее популярных библиотек, которая используется при обработке приложений по компьютерному зрению (Computer Vision — популярнейшее сегодня направление и технология, используемая в системах управления процессами, системах видеонаблюдения с камер, системах дополненной реальности и т. д.). Версия интерфейса для Пайтона называется OpenCV-Python, и именно Python-обертка во фронтенде обеспечивает легкое развертывание и настройку. Отличный инструмент для высоконагруженных вычислительных программ, работа которых связана с Computer Vision. Руководство здесь.
На jpg-картинке ниже — пример наложения изображения посредством пирамид с целью создания нового фрукта.

SimpleCV
Очередной фреймворк с открытым исходным кодом, предназначенный для создания Computer Vision-приложений. С ним появляется доступ к ряду мощных CV-библиотек (к тому же OpenCV) без надобности изучения глубины цвета, цветовых пространств, файловых форматов и т. д. Кривая обучения гораздо меньше, чем в OpenCV, то есть основной слоган — «компьютерное зрение становится проще». Также среди преимуществ:
- простые CV-тесты cмогут писать даже начинающие разработчики;
- алгоритм работы обеспечивает функциональную совместимость не только с изображениями (images), но и с камерой (camera), видеофайлами, видеопотоками.
А вот и понятная документация, где можно найти много практических примеров. Один из них — на фотографии ниже:

Mahotas
Очередная библиотека Python для обработки изображений и Computer Vision. Включает в себя как стандартные обрабатывающие функции (фильтрация, морфологические операции), так и более современные CV-возможности, позволяющие вычислять признаки и находить особые точки и локальные дескрипторы. Python-интерфейс обеспечивает высокую скорость разработки, а алгоритмы написаны на С++. В результате Mahotas представляет собой быструю библиотеку с минимальным кодом и зависимостями. В документации по ссылке можно найти инструкции по установке и даже пошаговые уроки по освоению.
Решение задач по поиску и обработке происходит с помощью простого кода. На картинке jpg ниже можно увидеть задачу по поиску под названием «Где Уолли?». Для выполнения поиска требуется минимум кода.

На рисунке ниже — результат поиска:

SimpleITK
ITK — кроссплатформенная система, которая предоставляет широкий набор средств по анализу image. SimpleITK — это упрощенный слой, который надстроен поверх ITK. Он облегчает работу с библиотекой и упрощает собой набор инструментов для выполнения анализа изображений, имеющих большое число компонентов, которые поддерживают общую фильтрацию, а также сегментацию и регистрацию изображений. SimpleITK написан на C++, однако доступен и для других языков, в том числе и Python.
Возможности SimpleITK можно посмотреть, к примеру, используя Jupyter Notebook. Там же демонстрируется интерактивный анализ изображений с применением языков Python и R.
На анимации ниже визуализирован процесс преобразования при регистрации КТ- и МРТ-снимков. Доступен и исходный код.

Pgmagick
Обертка для библиотеки GraphicsMagick — системы, которую порой называют «швейцарским ножом» в обработке image. Тут предоставляется коллекция эффективных библиотек и инструментов, которые поддерживают запись, чтение и операции с изображениями в десятках основных форматов (GIF, JPEG, PNG, PDF, TIFF и пр.). Есть подробное руководство пользователя и ссылка на Github.
На примерах ниже можно увидеть такие операции, как масштабирование изображения и выделение контуров:


PyCairo
Это уже комплект привязок Пайтон-кода для графической библиотеки Cairo. Последняя представляет собой 2D-библиотеку, предназначенную для прорисовки векторной графики. Сама по себе векторная графика интересна тем фактом, что она не теряет свою четкость в случае изменения размеров либо трансформации. Можно вызывать и Cairo-команды. Вводное руководство здесь.
Вот каким путем выполняется отрисовка линий, основных фигур и радиальных градиентов:

Вывод
Сегодня существует много бесплатных и полезных инструментов по обработке изображений в Python (GIF, JPEG, PNG, PDF, TIFF и пр.). Популярность и эффективность у этих инструментов разная. Именно поэтому рекомендуется поработать с несколькими из них, чтобы выбрать наиболее удобную и эффективную библиотеку, максимально подходящую для решения поставленных задач.
Также будет полезным повысить навыки программирования на Python:
