Основні можливості бібліотеки 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) for more information. >>> від PIL import Image

Якщо система показує знову >>> , модулі Pillow правильно встановлені.

Формати файлів

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

Як використовувати Pillow для роботи із зображеннями

Оскільки ми збираємося працювати із зображеннями, для початку, завантажуємо одне.

У нашому прикладі будемо використовувати стандартне тестове зображення під назвою Lena. Це зображення використовується в багатьох експериментах з обробки зображень. Просто зайдіть сюди і завантажте зображення. 512.

Використання Pillow

Давайте подивимося на можливі варіанти використання цієї бібліотеки. Основні функції знаходяться в модулі Image .

Основні можливості бібліотеки Python Imaging Library / Pillow / PIL - Druzhba.v.ua

Pillow – найпопулярніша бібліотека для роботи із зображеннями в Python. За допомогою неї картинки можна відкривати, обертати, накладати фільтри і навіть працювати з окремими пікселями.

Огляд

Імпортується бібліотека так:

from PIL import Image 

Pillow — покращена версія бібліотеки PIL, тому вона імпортується таким дивним чином.

Далі спробуємо щось зробити з картинкою:

from PIL import Image image = Image.open("example.jpg") rotated_image = image.rotate(45) rotated_image.save("rotated.jpg") 

Спочатку відкриваємо картинку з назвою example.jpg і кладемо її в змінну image. На наступному рядку повертаємо картинку на 45 градусів. Метод .rotate() не змінює картинку, а створює нову, тому покладемо в змінну rotated_image . І в кінці зберігаємо повернене зображення в новий файл rotated.jpg .

Атрибути картинок

У Pillow є нові типи даних: JpegImageFile, PngImageFile … Вони дозволяють зберігати картинки прямо в змінних Python. У картинок є кілька атрибутів, які знадобляться вам у майбутньому:

  • format – формат даних картинки: jpeg, png …
  • mode – колірна модель картинки: CMYK, RGB, L – для чорно-білих зображень.
  • width – Ширина картинки в пікселях.
  • height – Висота картинки в пікселях.
  • size – Розмір картинки в пікселях. Повертає tuple: (ширина, висота).

Як їх отримати:

from PIL import Image image = Image.open("example.jpg") print(image.format) # Виведе JPG print(image.mode) # Наприклад, може вивести RGB 

Відкрити картинку

Для відкриття картинки використовується функція Image.open().

Як аргументи вона приймає на вхід шлях до файлу, який потрібно відкрити:

from PIL import Image image = Image.open("example.jpg") 

Зберегти картинку у файл

Для збереження зображення є спосіб .save() .

Як аргументи він приймає:

  • Шлях до файлу, у якому зберегти картинку.
  • Іменований необов'язковий параметр format , в якому передається формат картинки, що зберігається.
from PIL import Image image = Image.open("example.jpg") image.save("new.jpg") image.save("another.jpg", format="JPEG") 

Як результат з'явиться 2 копії картинки: new.jpg і another.jpg.

Перевести зображення в іншу колірну модель

Про колірну модель ви можете прочитати у розділі Атрибути. Щоб змінити колірну модель картинки, необхідно скористатися способом .convert() . Він приймає на вхід іменний аргумент mode:

from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вивелося RGB cmyk_image = image.convert("CMYK") print(cmyk_image.mode) # Вивелося CMYK print(image.mode) # Вивелося RGB 

Зауважимо, що метод не змінює вихідну картинку, а створює її копію з колірною моделлю CMYK. Тому ми поклали її в окрему змінну.

Обрізати картинку

За обрізання картинки відповідає метод .crop(). Він приймає на вхід кортеж з 4 чисел: координат кутів нової картинки.

Координати потрібно передати в такому порядку: ліворуч, зверху, праворуч, знизу.

from PIL import Image image = Image.open("example.jpg") coordinates = (10, 15, image.width, image.height) cropped = image.crop(coordinates) # Відріжеться 10 пікселів зліва та 15 зверху 

Цей код відрізає 10 пікселів ліворуч і 15 зверху.

Розділити картинку на канали

Картинки складаються з пікселів різних кольорів. Кожний піксель картинки в RGB складається з 3 значень: скільки в ньому червоного, скільки зеленого та скільки синього. . 0 – немає такого кольору, а 255 – його дуже-дуже багато.

Насправді картинки зберігають не за пікселями, а по каналах. – З синім.

Виходить 3 картинки. Але якщо взяти якийсь колірний канал окремо від картинки, то вона не буде знати, який колір їй показувати. пікселі зберігається 0, то піксель буде чорний, а якщо 255 – білий. піксель.

Метод .split() розбиває зображення на канали. Працює так:

from PIL import Image image = Image.open("example.jpg") print(image.mode) # Повернуло CMYK, означає каналу 4 cyan, magenta, yellow, key_color = image.split() # У змінні запишуться 4 чорно-білі картинки. 

Зібрати картинку з каналів

Pillow дозволяє розділяти картинку на канали. Але так само дозволяє збирати її назад. За це відповідає функція Image.merge(). Вона приймає на вхід 2 аргументи:

  • Колірна модель майбутньої картинки
  • Кортеж із колірних каналів. Якщо модель RGB, то перший канал буде пофарбований у червоний, другий зелений, третій синій.
from PIL import Image image = Image.open("example.jpg") print(image.mode) # Повернуло CMYK, означає каналу 4 cyan, magenta, yellow, key_color = image.split() # У змінні запишуться 4 чорно-білі картинки. new_image = Image.merge("CMYK", (cyan, magenta, yellow, key_color)) 

new_image нічим відрізняється від image , т.к. складається з тих самих каналів у тому порядку.

Пофарбувати колірний канал

Pillow дозволяє розфарбовувати чорно-білі картинки. За це відповідає функція ImageOps.colorize().

Вона приймає 3 аргументи: Картинка, який колір показуватиме замість чорного і який замість білого. Приклад:

from PIL import Image, ImageOps image = Image.open("example.jpg") colorized = ImageOps.colorize(image, black ="red", white ="Yellow") 

Код вище зробить з такої картинки:

Основні можливості бібліотеки Python Imaging Library / Pillow / PIL - Druzhba.v.ua

Як працює thumbnail

Метод resize наводить картинку до бажаного розміру без збереження пропорцій. Картинка тулиться, стає негарною:

Метод thumbnail зберігає пропорції:

Детальніше про thumbnail

За допомогою методу .thumbnail() можна зробити мініатюру зображення. Мініатюра — зменшена версія картинки зі збереженням пропорцій. На вхід приймається кортеж із максимальними шириною та висотою.Метод .thumbnail() сам підбере нові координати так, щоб картинка помістилася в задану область. :

from PIL import Image image = Image.open("example.jpg") print(image.size) # Вивелося (800, 1200) image.thumbnail((1200, 600)) # Картинка тепер розміру 400 на 600 print(image.size) # Вивелося (400, 600) 

Накласти картинки один на одного

Функція Image.blend() створює нову картинку, накладаючи одне зображення поверх іншого.

  • Перша картинка.
  • Друга картинка того ж розміру, що й перша.
  • Коефіцієнт прозорості.

Якщо прозорість дорівнює 0.5, то зображення змішуються в рівних частках. Якщо коефіцієнт дорівнює 1.0, то перша картинка стане повністю прозорою і залишиться тільки друга.

from PIL import Image image1 = Image.open("image1.jpg") image2 = Image.open("image2.jpg") image3 = Image.blend(image1, image2, 0.5) # Вийде картинка, складена з двох 

Накласти зі зміщенням

Окремого методу цього немає, але виходить рахунок комбінації .crop() і Image.blend().

  1. Виберіть зображення для ефекту. У нас це зображення wave.png з шириною в 1000 пікселів.
  2. Відріжте від неї 200 пікселів зліва.Вийде wave_left.png шириною 800 пікселів.
  3. Візьміть вихідну картинку wave.png і відріжте від неї по 100 пікселів з обох боків: зліва та справа. Вийде wave_middle.png теж шириною в 800 пікселів.
  4. Накладіть wave_left.png на wave_middle.png за допомогою Image.blend()
  5. Збережіть у файл те, що вийшло. вліво.

Спробуйте безкоштовні уроки з Python

Отримайте круте код-рев'ю від практикуючих програмістів із розбором помилок та рекомендаціями, на що звернути увагу – безкоштовно.

Перейдіть на сторінку навчальних модулів «Девмана» та вибирайте тему.

Основні можливості бібліотеки Python Imaging Library / Pillow / PIL - Druzhba.v.ua

Бібліотека Pillow додає в Python досить потужні можливості обробки зображень, ідентифікує і читає велику кількість форматів. Підтримка запису обмежена найбільш часто використовуваними форматами. т.д.

Бібліотека Pillow містить основні функції обробки зображень:

  • містить ряд готових операцій для зображення L і RGB (автоконтраст, обрізка, масштабування, обертання, довільні афінні перетворення і т.д.)
  • містить набір зумовлених фільтрів покращення зображення (BLUR, DETAIL, SHARPEN і т.д.).
  • При збереженні файлів JPEG можна використовувати параметри якості зображення, еквівалентні параметрам Photoshop.
  • вміє робити копіювання вмісту екрана (скриншот екрану).
  • підтримує фільтрацію за допомогою набору вбудованих ядер згортки та перетворення колірного простору.
  • метод гістограми дозволяє отримати деяку статистику із зображення, яку можна використовувати для автоматичного покращення зображення та для статистичного аналізу.
  • вміє завантажувати шрифти TrueType або OpenType з подальшим створенням об'єкта шрифту із заданим розміром для виконання написів на зображенні.
  • має просту 2D-графіку для створення нових зображень, ретушування існуючих, а також створення графіки на льоту для використання в Інтернеті.

Зміст:

Встановлення Pillow у віртуальне оточення:

# створюємо віртуальне оточення, якщо ні $ python3 -m venv .venv --prompt VirtualEnv активуємо віртуальне оточення $ source .venv/bin/activate # оновлюємо `pip` (VirtualEnv):~$ python3 -m pip install -U pip # ставимо модуль `Pillow` (VirtualEnv):~$ python3 -m pip install Pillow -U

Модель та режим зображень.

Зображення може складатися з однієї або кількох смуг/каналів даних. Pillow дозволяє зберігати кілька каналів в одному зображенні за умови, що всі вони мають однакові розміри та глибину. Наприклад, зображення PNG може мати смуги R , G , B та A для значень прозорості червоного, зеленого, синього та альфа-каналу. Багато операцій впливають на кожну смугу окремо, наприклад гістограми. Корисно думати, кожен піксель має одне значення кожної смуги. Щоб отримати кількість і назву каналів на зображенні, використовуйте метод Image.getbands() .

Режим зображення mode – це рядок, що визначає тип та глибину пікселя зображення. Кожен піксель використовує повний спектр бітової глибини. Таким чином, 1-бітний піксель має діапазон від 0 до 1, 8-бітний піксель має діапазон від 0 до 255, 32-розрядний цілочисельний піксель має діапазон INT32, а 32-бітний піксель з плаваючою комою має діапазон FLOAT32.

Бібліотека Pillow підтримує такі стандартні режими:

  • 1 (чорно-білі 1-бітові пікселі, зберігаються по одному пікселю на байт)
  • L (чорно-білі 8-бітові пікселі)
  • P (8-бітові пікселі, зіставлені з будь-яким іншим режимом за допомогою палітри кольорів)
  • RGB (3×8-бітові пікселі, дійсний колір)
  • RGBA (4×8-бітові пікселі, дійсний колір з маскою прозорості)
  • CMYK (4×8-бітові пікселі, кольороподіл)
  • YCbCr (3×8-бітові пікселі, формат кольорового відео)
    • Зверніть увагу, це стосується стандарту JPEG, а не стандарту ITU-R BT.2020.
    • Діапазон відтінку 0-255 – це масштабована версія 0 градусів

    Pillow поки що не підтримує багатоканальні зображення з глибиною більше 8 біт на канал.

    Прочитати режим зображення можна через атрибут Image.mode. Це рядок, що містить одне із зазначених вище значень.

    Система координат.

    Бібліотека Pillow використовує декартову піксельну систему координат (0,0) у верхньому лівому кутку. Зверніть увагу, що координати відносяться до кутів пікселів.Центр пікселя, адресованого як (0, 0), насправді лежить у (0,5, 0,5).

    Координати зазвичай передаються до бібліотеки у вигляді двох кортежів (x, y). Прямокутники видаються як 4-х елементний кортеж, причому верхній лівий кут дається першим. Наприклад, прямокутник, що покриває все зображення розміром 800×600 пікселів, записується як (0, 0, 800, 600).

    Розмір зображення можна прочитати через атрибут Image.size. Це кортеж з двох елементів, що містить розмір горизонталі Image.width і вертикалі в пікселях Image.height .

    Прозорість зображень.

    Якщо зображення не має альфа-каналу, прозорість може бути вказана в атрибуті Image.info з ключем transparency .

    У більшості випадків значення transparency є одним цілим числом, що описує, яке значення пікселя є прозорим у зображенні в режимах 1 , L , I або P . Однак зображення PNG можуть мати три значення, по одному для кожного каналу в зображенні в режимі RGB або можуть мати рядок байтів для зображення в режимі P (альфа-значення для кожного запису палітри).

    Орієнтація зображень.

    Загальним елементом атрибуту Image.info зображень у форматі JPG та TIFF є тег орієнтації EXIF. Це інструкція про те, як орієнтувати дані зображення під час перегляду в програмі-переглядачі зображень. Наприклад, тег може вказувати, що зображення повернуто на 90 градусів або відображено дзеркально. Щоб застосувати цю інформацію до зображення, що зберігається, можна використовувати Image.exif_transpose() .

    Приклад використання модуля Pillow.

    Прочитати зображення по URL можна таким чином:

    from PIL import Image from urllib.request import urlopen url = "https://python-pillow.org/images/pillow-logo.png" # відкриваємо URL img = Image.open(urlopen(url)) # зберігаємо зображення img.save('pillow-logo.png') 

    Наступний код робить скріншот екрану та виконує деякі перетворення з отриманим зображенням. Усі перетворення детально прокоментовані.

    from PIL import (Image, ImageEnhance, ImageOps, ImageGrab, ImageDraw, ImageFont) import time # робимо затримку в 2 секунди, щоб # встигнути перейти на потрібне вікно time.sleep(2) # робимо скріншот im_orig = ImageGrab.схоп() # Отримуємо розміри скріншота print(f'Розміри: im_orig.size>') # Отримуємо режим зображення скріншота print(f'Режим: im_orig.mode>') # обрізаємо по 100px з кожного краю im_orig = ImageOps.crop(im_orig, border=100) # додаємо чорний кордон у 2px im_orig = ImageOps.expand(im_orig, border=2, fill='#000000') # і з верху додаємо білу межу в 10px im_orig = ImageOps.expand(im_orig, border=10, fill='#ffffff') # робимо напис на скріншоті idraw = ImageDraw.Draw(im_orig) # текст text = 'DOCS-PYTHON.RU' # підключаємо Font і задаємо висоту в пікселях font = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeSans.ttf", size=18) # обчислюємо довжину напису textlength = idraw.textlength(text, font) обчислюємо положення напису на скріншоті, наприклад по ширині # ширина скріншота - довжина напису - межа 2px + 10px size = (im_orig.size[0]-textlength-12, im_orig.size[1]-32) # накладаємо текст на скріншот idraw.text(size, text, font=font, fill='green') # зберігаємо оброблений скріншот im_orig.save('scrshoot.png') # зберігаємо скріншот у форматі `JPG` # з оптимізацією та заданою якістю im_orig.save('scrshoot.jpg', optimize=True, quality=90) # Відкриваємо зображення скріншоту # (для прикладу) with Image.open('scrshoot.png') as im_orig: # отримуємо формат файлу print(f'Формат файлу: im_orig.format>') # УВАГА! усі подальші перетворення # проробляємо з оригінальним зображенням `im_orig` # результат кожного перетворення будемо зберігати # Знебарвлюємо зображення з відтінками сірого im = ImageOps.grayscale(im_orig) # зберігаємо im.save('scrshoot_grayscale.png') # накладаємо сепію 'black='#523224'' im = ImageOps.colorize(im, black='#523224', white='#ffffff') im.save('scrshoot_colorize.png') # відображаємо дзеркальну картинку im = ImageOps.mirror(im_orig) im.save('scrshoot_mirror.png') # `режим сканера` з порогом 150 # тобто. застосовуємо до кожного пікселя картинки функцію `fn` threshold = 150 fn = lambda x : 255 if x > threshold else 0 метод image.convert('L') - попередньо знебарвлює картинку im = im_orig.convert('L').point(fn, mode='1') im.save('scrshoot_scan.png') # збільшимо різкість im = ImageEnhance.Sharpness(im_orig).enhance(2) im.save('scrshoot_Sharpness.png') # збільшимо контрастність im = ImageEnhance.Contrast(im_orig).enhance(2) im.save('scrshoot_Contrast.png') # збільшимо насиченість im = ImageEnhance.Color(im_orig).enhance(2) im.save('scrshoot_Color.png') # Змінимо розмір зображення так, щоб воно вписалося в size size = (700, 700) співвідношення сторін зберігаються im = ImageOps.contain(im_orig, size, метод=Image.BICUBIC) im.save('scrshoot_contain.png') # створення `thumbnail` size = (150, 150) im_orig.thumbnail(size) im_orig.save('scrshoot_thumbnail.jpg') 
    • КОРОТКИЙ ОГЛЯД МАТЕРІАЛУ.
    • Функція Image.open() модуля Pillow
    • Функція Image.new() модуля Pillow
    • Функція Image.frombytes() модуля Pillow
    • Функція Image.frombuffer() модуля Pillow
    • Функція Image.fromarray() модуля Pillow
    • Створення знімка екрана з використанням Pillow
    • Об'єкт Image модуля Pillow
    • Обробка GIF зображень у Pillow
    • Параметри для JPG, ICO та WebP модуля Pillow
    • Вилучення EXIF-тегів модулем Pillow
    • Вбудовані фільтри покращення модуля Pillow
    • Фільтри передискретизації модуля Pillow
    • Підмодуль ImageDraw модуля Pillow
    • Функція Image.alpha_composite() модуля Pillow
    • Функція Image.blend() модуля Pillow
    • Функція Image.composite() модуля Pillow
    • Функція Image.merge() модуля Pillow
    • Функція модуля Image.eval() Pillow
    • Регулювання яскравості, контрастності, різкості та насиченості: Pillow
    • Автоматичне регулювання контрастності, Pillow
    • Тонування чорно-білого фото модулем Pillow
    • Масштабування зображень із модулем Pillow
    • Додати/обрізати рамку зображення, модуль Pillow
    • Перевернути/відобразити зображення, модуль Pillow
    • Знебарвлення/інверсія зображення, модуль Pillow
    • Операції з каналами зображень, модуль Pillow

Related Posts