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 .
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") Код вище зробить з такої картинки:
Як працює 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().
- Виберіть зображення для ефекту. У нас це зображення wave.png з шириною в 1000 пікселів.
- Відріжте від неї 200 пікселів зліва.Вийде wave_left.png шириною 800 пікселів.
- Візьміть вихідну картинку wave.png і відріжте від неї по 100 пікселів з обох боків: зліва та справа. Вийде wave_middle.png теж шириною в 800 пікселів.
- Накладіть wave_left.png на wave_middle.png за допомогою Image.blend()
- Збережіть у файл те, що вийшло. вліво.
Спробуйте безкоштовні уроки з Python
Отримайте круте код-рев'ю від практикуючих програмістів із розбором помилок та рекомендаціями, на що звернути увагу – безкоштовно.
Перейдіть на сторінку навчальних модулів «Девмана» та вибирайте тему.
Бібліотека 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