Библиотека Pillow в Python: обработка изображений
В программировании на Python невозможно переоценить важность эффективной работы с изображениями. Независимо от того, создаете ли вы графику для визуализации данных или занимаетесь проектами глубокого обучения, умение манипулировать изображениями и обрабатывать их часто имеет решающее значение. Именно здесь в игру вступает Pillow, мощный форк библиотеки Python Image Library (PIL).
Что такое Pillow?
Pillow служит обширной библиотекой для открытия, управления и сохранения множества различных форматов файлов изображений. Он основан на библиотеке PIL, предлагает улучшения, исправления ошибок и поддержку Python 3.x. Pillow предоставляет различные функциональные возможности, начиная от базовых задач по обработке изображений, таких как изменение размера и обрезка, и заканчивая более продвинутыми операциями, такими как фильтрация, смешивание и улучшение изображения.
Установка библиотеки с помощью pip
Во-первых, на вашем компьютере должен быть установлен python. Также убедитесь, что python pip (пакетный менеджер Python) установлен и обновлен. Чтобы установить pillow, выполните приведенную ниже команду:
pip install Pillow
Теперь, когда вы успешно установили Pillow, ниже приведены некоторые фрагменты, которые могут вам пригодиться. Обратите внимание, что приведенные ниже примеры представляют собой основные манипуляции с изображениями, такие как изменение размера, размытие, преобразование оттенков серого и другие.
Для чего используется Pillow?
Области применения Pillow разнообразны. Вот несколько наиболее распространенных примеров использования:
Загрузка изображений: Pillow в основном используется для загрузки, декодирования и доставки изображений для других платформ, таких как Keras, PyTorch или TensorFlow.
im = Image.open("/path/to/image.jpg")
Обработка изображений: Библиотека позволяет пользователям выполнять различные задачи по обработке изображений, такие как изменение размера, поворот и обрезка изображений в соответствии с конкретными требованиями. Пример поворота изображения:
im_rotated = im.rotate(90)
Фильтрация изображений: Программа предоставляет функциональные возможности для применения различных фильтров к изображениям, включая размытие, повышение резкости и распознавание краев, что повышает их визуальное качество:
enhancer = ImageEnhance.Sharpness(im)
factor = 2 # повысим резкость
im = enhancer.enhance(factor)
Улучшение качества изображения: Pillow позволяет регулировать такие свойства изображения, как яркость, контрастность и цветовой баланс, улучшая общий вид изображений:
enhancer = ImageEnhance.Contrast(im)
factor = 0.5 # уменьшить контраст
im = enhancer.enhance(factor)
Преобразование изображений: Pillow поддерживает преобразование изображений из одного формата файла в другой, что обеспечивает совместимость с различными платформами и приложениями, например:
im.save("img.bmp")
Поддержка Pillow
Пользователи Pillow допускают ошибки во время написания кода, как и в случае с любой другой библиотекой. К счастью, у Pillow есть активное сообщество и подробная документация, которые являются бесценными ресурсами разработки.
- Документация: в документации Pillow содержатся подробные руководства, туториалы и справочные материалы, помогающие пользователям разобраться в функциях библиотеки и устранять распространенные неполадки.
- Поддержка сообщества: пользователи могут обратиться за помощью и руководством к сообществу Pillow через форумы, списки рассылки или платформы, такие как Stack Overflow. Опытные пользователи и участники часто помогают в решении проблем и делятся передовым опытом.
Полезные снипеты кода
Собрали популярные способы применения библиотеки которые помогут вам в будущем при работе с инструментом обработки изображений.
Преобразование в оттенки серого (черно-белый)
Приведенный ниже фрагмент преобразует изображение (test_image.jpg) в базовые оттенки серого. Сохраняет его как новое изображение (test_image_grayscale.jpg). Для примера будем использовать изображение из фотографии текущей статьи.
from PIL import Image
# открытие цветного изображения
img = Image.open("test_image.jpg")
# конвертация изображение в черно-белое
img = img.convert("1")
# сохранение нового изображения
img.save("test_image_grayscale.jpg")
# открытие изображение для просмотра
img.show()
Результат обработки будет следующим:
Создание миниатюры
Часто нам нужно быстро создать миниатюры нескольких изображений. Приведенные ниже фрагменты помогут в этом.
from PIL import Image
# открытие изображения
img = Image.open("test_image.jpg")
# устанавливаем максимальные ширину и высоту
max_thumbnail_size = (200, 200)
# применяем размер к миниатюре
img.thumbnail(max_thumbnail_size)
# сохраняем результат
img.save("test_image_thumb.jpg")
# открываем картинку
img.show()
Замена цвета
Приведенный ниже код заменяет все белые пиксели на желтые. Для настройки изображений с несколькими цветами требуется дополнительная настройка. Тем не менее, приведенный ниже фрагмент кода хорошо работает с изображениями со сплошными цветами фона (например когда вы используете картинку с белым фоном).
from PIL import Image
# открытие изображения
img = Image.open("test_image.jpg")
# используем формат цвета RGB
img = img.convert("RGB")
datas = img.getdata()
new_image_data = []
for item in datas:
# заменяем все белые пиксели на желтые
if item[0] in list(range(190, 256)):
new_image_data.append((255, 204, 100))
else:
new_image_data.append(item)
# обновляем изображение
img.putdata(new_image_data)
# сохраняем результат
img.save("test_image_altered_background.jpg")
# открываем картинку
img.show()
Добавление рамки
Это позволяет выбрать цвет и размер рамки, которые будут применены к изображению. Граница может быть целым числом, например, 5, что означает, что все границы (левая, верхняя, правая и нижняя) имеют одинаковый размер. Он также принимает кортеж, т.е. (5, 10, 5, 10), каждая сторона имеет разное значение.
from PIL import Image, ImageOps
# открываем изображение
img = Image.open("test_image.jpg")
# цвет рамки
color = "green"
# верхняя, правая, нижняя левая
border = (20, 10, 20, 10)
new_img = ImageOps.expand(img, border=border, fill=color)
# сохраняем результат
new_img.save("test_image_result.jpg")
# открываем картинку с рамкой
new_img.show()
Добавление размытых краев
Этот раздел состоит из нескольких шагов, аналогичных предыдущим примерам. В первой части требуется создать размытое изображение (маску) и использовать это изображение в качестве маски для исходного изображения. Ниже подробно описаны шаги и процедуры, позволяющие создать изображение с размытыми краями.
from PIL import Image, ImageFilter
# Радиус и диаметр размытия
radius, diameter = 20, 40
# Открытие изображения
img = Image.open("test_image.jpg")
# Вставка изображения на белый фон
background_size = (img.size[0] + diameter, img.size[1] + diameter)
background = Image.new('RGB', background_size, (255, 255, 255))
background.paste(img, (radius, radius))
# Создание новых изображений с белым и черным
mask_size = (img.size[0] + diameter, img.size[1] + diameter)
mask = Image.new('L', mask_size, 255)
black_size = (img.size[0] - diameter, img.size[1] - diameter)
black = Image.new('L', black_size, 0)
# Создаем маску размытия
mask.paste(black, (diameter, diameter))
# Размытие изображения и вставка размытого
# края в соответствии с маской
blur = background.filter(ImageFilter.GaussianBlur(radius / 2))
background.paste(blur, mask=mask)
background.save("test_image_blurred.jpg", quality=100))
# открытие результата
background.show()
Добавление водяных знаков
Использование водяных знаков - один из старейших приемов, используемых для защиты изображений от пиратства. Несмотря на то, что существует несколько новых способов избежать водяных знаков на изображениях, он по-прежнему очень эффективен. Приведенный ниже пример кода иллюстрирует, как добавить последовательный водяной знак на изображение.
from PIL import Image, ImageDraw, ImageFont
# открытие изображение для наложение ватермарка
img = Image.open("watermark_test.jpg")
img.convert("RGB")
# получить размер изображения
img_width, img_height = img.size
# 5 на 4 сетка ватермарка
wm_size = (int(img_width * 0.20), int(img_height * 0.25))
wm_txt = Image.new("RGBA", wm_size, (255, 255, 255, 0))
# устанавливаем размер текста, 1:40 ширина изображения
font_size = int(img_width / 40)
# загружаем шрифт montserrat.ttf
# шрифт можно найти в сети или указать свой
font = ImageFont.truetype(path.format("montserrat.ttf"), font_size)
d = ImageDraw.Draw(wm_txt)
wm_text = "Popov.Dev"
# центрируем текст
left = (wm_size[0] - font.getsize(wm_text)[0]) / 2
top = (wm_size[1] - font.getsize(wm_text)[1]) / 2
# RGBA(0, 0, 0, alpha) черный фон для ватермарка
# альфа канал указывает на прозрачность
alpha = 75
# пишем текст на пустом изображении wm_text
d.text((left, top), wm_text, fill=(0, 0, 0, alpha), font=font)
# Можно повернуть текст ватермарка
# wm_txt = wm_txt.rotate(15, expand=1)
# wm_txt = wm_txt.resize(wm_size, Image.ANTIALIAS)
# вставляем ватермарк
for i in range(0, img_width, wm_txt.size[0]):
for j in range(0, img_height, wm_txt.size[1]):
img.paste(wm_txt, (i, j), wm_txt)
# сохраняем изображение
img.save("watermark-image.jpg")
# открываем картинку с результатом
img.show()
Вы можете использовать библиотеку Pillow для гораздо большего. Выше приведены лишь несколько базовых примеров, которые я часто использую и считаю особенно полезными.
Комментарии
Для того чтобы оставить свое мнение, необходимо зарегистрироваться на сайте