Основные возможности библиотеки Python Imaging Library / Pillow / PIL

PIL, известная как библиотека Python Imaging Library, может быть использована для работы с изображениями достаточно легким способом. У PIL не было никаких изменений и развития с 2009. Поэтому, добрые пользователи этого сайта предложили взглянуть на Pillow еще раз. Эта статья поможет вам узнать как пользоваться Pillow.

Что такое Pillow?

Pillow это форк PIL (Python Image Library), которая появилась благодаря поддержке Алекса Кларка и других участников. Основана на коде PIL, а затем преобразилась в улучшенную, современную версию. Предоставляет поддержку при открытии, управлении и сохранении многих форматов изображения. Многое работает так же, как и в оригинальной PIL.

Загрузка и установка Pillow

Перед началом использования Pillow, нужно загрузить и установить ее. Pillow доступна для Windows, Mac OS X и Linux. Самая “свежая” версия — это версия “8.1.0”, она поддерживается на python 3.6 и выше. Для установки Pillow на компьютеры Windows используйте conda или pip:

conda install -c anaconda pillow
pip install Pillow

Для установки Pillow на компьютерах Linux просто используйте:

$ sudo pip install Pillow

А установки Pillow на MacOS X нужно для начала установить XCode, а затем Homebrew. После того как Homebrew установлен, используйте:

$ brew install libtiff libjpeg webp littlecms
$ sudo pip install Pillow

Убедитесь, что Pillow установлена

Убедитесь, что Pillow установлена, откройте терминал и наберите следующее в текущей строке:

$ python  

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from PIL import Image

Если система показывает снова >>>, значит модули Pillow правильно установлены.

Форматы файлов

Перед началом использования модуля Pillow, давайте укажем некоторые поддерживаемые типы файлов: BMP, EPS, GIF, IM, JPEG, MSP, PCX PNG, PPM, TIFF, WebP, ICO, PSD, PDF. Некоторые типы файлов возможны только для чтения, в то время как другие доступны только для написания. Чтобы увидеть полный список поддерживаемых типов файла и больше информации о них, ознакомьтесь с руководством к Pillow.

Как использовать Pillow для работы с изображениями

Поскольку мы собираемся работать с изображениями, для начала, скачаем одно. Если у вас уже есть изображение, которое хотите использовать, пропустите этот шаг, описанный ниже.

В нашем примере будем использовать стандартное тестовое изображение под названием «Lenna» или «Lena». Это изображение используется во многих экспериментах по обработке изображений. Просто зайдите сюда и загрузите изображение. Если вы нажмете на изображение, оно сохранится как изображение с количеством пикселей 512×512.

Использование Pillow

Давайте посмотрим на возможные варианты использования этой библиотеки. Основные функции находятся в модуле Image. Вы можете создавать экземпляры этого класса несколькими способами. Путем загрузки изображений из файлов, обработки других изображений, либо создания изображений с нуля. Импортируйте модули Pillow, которые вы хотите использовать.

Затем вы получите доступ к функциям.

myimage = Image.open(filename)  
myimage.load()

Загрузка изображения

Используйте метод open идентификации файла на компьютере, а затем загрузить идентифицированный файл с помощью myfile.load(). Как только изображение будет загружено, с ним можно работать. Часто используется блок try except при работе с файлами. Чтобы загрузить изображение с помощью try except используйте:

from PIL import Image, ImageFilter  

try:  
    original = Image.open("Lenna.png")  
except FileNotFoundError:  
    print("Файл не найден")

Когда мы считываем файлы с диска с помощью функции open(), нам не нужно знать формат файла. Библиотека автоматически определяет формат, основанный на содержании файла.

Теперь, когда у вас есть объект Image, вы можете использовать доступные атрибуты для проверки файла. Например, если вы хотите увидеть размер изображения, вы можете использовать атрибут format.

print("Размер изображения:")  
print(original.format, original.size, original.mode)

Атрибут size — это tuple(кортеж), содержащий ширину и высоту (в пикселях). Обычные mode: L для изображений с оттенками серого, RGB для изображений с истинным цветным изображением и CMYK для печати изображений. В результате кода выше, вы должны получить следующее (если используете «Lenna.png»):

Размер изображения:
PNG, (512, 512), RGB

Размытие изображения

Этот пример загрузит и размоет изображение с жесткого диска.

# импортируем необходимые модули
from PIL import Image, ImageFilter

try:
    # загружаем изображение с жесткого диска
    original = Image.open("Lenna.png")
except FileNotFoundError:
    print("Файл не найден")

# размываем изображение
blurred = original.filter(ImageFilter.BLUR)
# открываем оригинал и размытое изображение
original.show()
blurred.show()
# сохраняем изображение
blurred.save("blurred.png")

Размытое изображение должно выглядеть следующим образом:

Lenne blurred

Чтобы открыть изображение, мы использовали методы show(). Если вы ничего не видите, можете сначала установить ImageMagick и попробовать снова.

Создание миниатюр

Есть необходимость создавать миниатюры для изображений. Миниатюры представляют собой уменьшенные версии изображений, но все же содержат все наиболее важные аспекты изображения.

from PIL import Image

size = (128, 128)
saved = "lenna.jpeg"
img = Image.open("Lenna.png")
img.thumbnail(size)
img.save(saved)
img.show()

Результат выполнения скрипта, можно увидеть в миниатюре:

lenna mini

Фильтры в Pillow

В модуле Pillow предоставляет следующий набор предопределенных фильтров для улучшения изображения:

  • BLUR
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE
  • EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SMOOTH
  • SMOOTH_MORE
  • SHARPEN

В нашем последнем примере мы покажем, как вы можете применить фильтр CONTOUR к вашему изображению. Приведенный ниже код примет наше изображение и применит к нему фильтр.


from PIL import Image, ImageFilter

img = Image.open("Lenna.png")
img = img.filter(ImageFilter.CONTOUR)
img.save("LennaC" + ".jpg")
img.show()

Ниже вы можете увидеть изображение с примененным фильтром CONTOUR:

Lenne filter

Тест на знание Pillow

Какая функция выводит изображение на экран?
Какой из этих форматов Pillow НЕ поддерживает?
Как узнать ширину изображения, которое хранится в переменно img?
Как изменить размер изображения?
Почему библиотека называется Pillow, а импортировать нужно Pil?