popov . dev

Main

Library

Articles

Библиотека Pillo...

Библиотека 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 для гораздо большего. Выше приведены лишь несколько базовых примеров, которые я часто использую и считаю особенно полезными.

Comments

In order to leave your opinion, you need to register on the website