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

Работа с изображениями с помощью библиотеки Pillow

Последнее обновление: 20.11.2022

Одной из популярных библиотек для работы с изображениями является Pillow. Формально эта библиотека является форком другой библиотеки - PIL (Python Imaging Library). Однако если PIL работала со 2-й версий Python и давно уже не развивается, то Pillow имеет поддержку 3-й версии и продолжает развиваться.

Итак, установим данную библиотеку с помощью следующей команды:

pip install Pillow

(Стоит отметить, что в некоторые дистрибутивы Linux данная библиотека уже включена по умолчанию)

Подключение

Для работы с библиотекой необходимо импортировать модуль Image:

from PIL import Image

Открытие изображения

Для открытия изображения вызывается функция open(), в которую передается путь к файлу:

from PIL import Image
 
# открытие изображения
img = Image.open("forest.jpg")

В данном случае предполагается, что изображение представляет файл "forest.jpg" и располагается в одной папке с текущим скриптом Python. После выполнения функции переменная img будет содержать информацию об изображении в виде объекта класса Image (класс Image располагается в подключенном модуле Image).

На случай, если будет передан некорректный путь, и программа сгенерирует ошибку, можно поместить вызов метода в конструкцию try/catch:

from PIL import Image
 
try:
    img = Image.open("C://somefolder//forest.jpg")
except:
    print("Ошибка")

Получение информации о файле

Класс Image предоставляет ряд атрибутов, которые хранят информацию об изображении:

  • filename: имя файла или путь к файлу в виде строки

  • format: формат файла. Если изображение создано самой библиотекой, то имеет значение None.

  • mode: режим изображения, например, "1", "L", "RGB" или "CMYK". (Полный список форматов доступен в документации)

  • size: размер в виде кортежа (width, height)

  • width: ширина

  • height: высота

  • info: словарь dict, который хранит дополнительную ассоциированную с файлом информацию

  • is_animated: представляет булевое значение и равно True, если изображение содержит более одного фрейма. Применяется к анимированным изображениям

  • n_frames: количество фреймов в изображении. Применяется к анимированным изображениям

Например, получим некоторую информацию об изображении:

from PIL import Image
 
img = Image.open("forest.jpg")

print(f"Width: {img.width}")
print(f"Height: {img.height}")
print(f"Filename: {img.filename}")
print(f"Format: {img.format}")
print(f"Mode: {img.mode}")

Консольный вывод в моем случае:

Width: 484
Height: 363
Filename: forest.jpg
Format: JPEG
Mode: RGB

Вывод изображения на экран

С помощью метода show() можно октрыть изображение в программе для просмотра изображений по умолчанию для текщей операционной системы:

from PIL import Image
 
img = Image.open("forest.jpg")

img.show()

Сохранение изображения

Для сохранения изображения применяется метод save(). В качестве обязательного параметра он принимает путь, по которому сохраняется изображение:

from PIL import Image
 
img = Image.open("forest.jpg")
# сохраняем в файл forest_new.jpg
img.save("forest_new.jpg")

Поворот изображения

Для вращения изображения применяется метод rotate(), в который в качестве обязательного параметра передается угол поворота. Результатом метода является повернутое изображение:

from PIL import Image
 
img = Image.open("forest.jpg")
# поворот на 90 градусов
img2 = img.rotate(90)
# сохраняем новое изображение
img2.save("forest_new.jpg")
Поворот изображения в python

Обрезка изображения

Метод crop() позволяет вырезать часть изображения. В качестве параметра он принимает кортеж из 4 чисел, в формате:

(координата_X_верхнего_левого _угла, координата_Y_верхнего_левого _угла, координата_X_правого_нижнего _угла, координата_Y_правого_нижнего _угла)
Результатом метода является новое изображение:

from PIL import Image
 
img = Image.open("forest.jpg")

img = img.crop((0, 0, img.width/2, img.height/2))
img.save("forest_new.jpg")

В данном случае происходит обрезка, начиная с левого верхнего угла до его половины ширины и высоты.

Обрезка изображения в python

Изменение размера

Для изменения размера изображения применяется метод resize(), в который в качестве параметра передается кортеж из двух чисел - новой высоты и ширины. Результатом метода является сгенерированное изображение. Например, уменьшим в два раза:

from PIL import Image
 
img = Image.open("forest.jpg")
# уменьшаем в два раза
img = img.resize((img.width//2, img.height//2))
img.save("forest_new.jpg")

Если необходимо пропорциональное уменьшение размеров, то можно использовать метод reduce(), который в качестве обязательного параметра принимает множитель уменьшения. Например, уменьшим изображение в 2 раза:

from PIL import Image
 
img = Image.open("forest.jpg")
# уменьшаем в два раза
img = img.reduce(2)
img.save("forest_new.jpg")

Наложение изображения

Функция paste() позволяет наложить одно изображение на другое:

Image.paste(im, box=None, mask=None)

Первый параметр - im представляет второе изображение, которое будет накладываться. Параметр box определяет область наложения, а третий параметр - mask

Например:

from PIL import Image
 
img = Image.open("forest.jpg")
img2 = Image.open("cats.jpg")

img.paste(img2)
img.save("cats_in_forest.jpg")

В данном случае изображение "cats.jpg" накладывается на "forest.jpg". Поскольку область наложения не указана, то верхний левый угол "cats.jpg" проецируется на верхний левый угол "forest.jpg".

Параметр box позволяет определить область наложения либо в виде кортежа с двумя элементами (координаты X и Y верхнего левого угла), либо в виде кортежа с четырьмя элементами(координаты X и Y верхнего левого угла и правого нижнего угла):

from PIL import Image
 
img = Image.open("forest.jpg")
img2 = Image.open("cats_small.jpg")

img.paste(img2, (img.width//2, img.height//2))
img.save("cats_in_forest.jpg")
Наложение изображений в python

Зеркальное отражение

Для зеркального отражения применяется метод transpose(). В качестве параметра он принимает принцип отзеркаливания в виде одного из следующих значений:

  • Image.Transpose.FLIP_LEFT_RIGHT

  • Image.Transpose.FLIP_TOP_BOTTOM

  • Image.Transpose.ROTATE_90

  • Image.Transpose.ROTATE_180

  • Image.Transpose.ROTATE_270

  • Image.Transpose.TRANSPOSE

  • Image.Transpose.TRANSVERSE

Например, применим значение Image.Transpose.FLIP_LEFT_RIGHT, которое отражает слева направо:

from PIL import Image
 
img = Image.open("cats.jpg")

img = img.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
img.save("cats_new.jpg")
Зеркальное отражение изображений в python

Применение фильтров

С помощью метода filter() к изображению можно применить фильтры. В качестве параметра метод принимает определение фильтра. По умолчанию библиотека предоставляет следующие фильтры, которые определены в модуле ImageFilter:

  • BLUR

  • CONTOUR

  • DETAIL

  • EDGE_ENHANCE

  • EDGE_ENHANCE_MORE

  • EMBOSS

  • FIND_EDGES

  • SHARPEN

  • SMOOTH

  • SMOOTH_MORE

Например, применение фильтра размытия Blur

from PIL import Image, ImageFilter
 
img = Image.open("forest.jpg")

img = img.filter(ImageFilter.BLUR)
img.save("forest_new.jpg")
Применение фильтров к изображениям в python на примере фильтра размытия

Для более детального ознакомления с остальным функционалом библиотеки можно обратиться к документации

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850