Друкарня від WE.UA

Всіх вітаю! У цій статті ми познайомимося з бібліотекою rembg, яка здатна видаляти фон з фотографій за допомогою ШІ. Хоч бібліотека невеличка, але точно є корисною для використання у деяких ситуаціях.

Встановлення rembg

Windows:

pip install rembg

MacOS:

pip3 install rembg

Linux:

pip install rembg

Також перед початком роботи із rembg треба обов’язково встановити бібліотеку onnxruntime, так як вона не встановлюється автоматично. Бібліотека onnxruntime по суті запускає штучний інтелект у rembg, який потрібен для виявлення фону.

Команди для встановлення onnxruntime є нижче.

Windows:

pip install onnxruntime

MacOS:

pip3 install onnxruntime

Linux:

pip install onnxruntime

Тепер наш код точно буде працювати.

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

Перший приклад

Для початку імпортуємо дві бібліотеки — rembg та pillow. Бібліотеку pillow ми використовуємо тому, що вона дозволить нам відкривати і зберігати зображення.

Імпортуємо:

import rembg as rb
from PIL import Image

Для першого прикладу оберемо це зображення:

,Photo by Atul Pandey on Unsplash

Створюємо функцію, яка буде видаляти фон:

def remove_photo_background(original, edited):
    original_photo = Image.open(original)
    edited_photo = rb.remove(original_photo)
    edited_photo.save(edited)

    print(f"Image {original} successfully edited!")


remove_photo_background("atul-pandey-aMtO0ubeK_4-unsplash.jpg", "without_background_1.png")

Ця функція приймає два параметри original та edited — назва старого й нового фото, причому нове фото повинно бути у форматі png.

Далі відкриваємо зображення, з яким будемо працювати за допомогою pillow:

original_photo = Image.open(original)

Функція remove() у rembg дозволяє нам видаляти фон зображень:

edited_photo = rb.remove(original_photo)

Зберігаємо зображення без фону з новою назвою:

edited_photo.save(edited)

Ось результат:

Фото без фону

Другий приклад

Тепер оберемо іншу картинку:

Photo by Aidan Lynch on Unsplash

Насправді можна і не використовувати pillow разом з rembg — це лиш один з варіантів як можна робити. У наступному прикладі ми також видалимо фон, але без якихось інших сторонніх бібліотек, окрім rembg.

Ось так ми переробили функцію — тепер вона відкриває файли без допомоги pillow. Ось код даної функіції:

def remove_photo_background(original, edited):
    original_photo = open(original, "rb")
    read_original = original_photo.read()
    remove_background = rb.remove(read_original)

    edited_photo = open(edited, "wb")
    edited_photo.write(remove_background)

    original_photo.close()
    edited_photo.close()

    print(f"Image {original} successfully edited!")


remove_photo_background("aidan-lynch--ynAkBMFupU-unsplash.jpg", "without_background_2.png")

Отже, спочатку відкриваємо файл з оригінальним фото:

original_photo = open(original, "rb")

Причому прапор “rb“ вказує, що файл ми відкриваємо у двійковому форматі.

Читаємо файл з оригінальним зображенням:

read_original = original_photo.read()

Видаляємо фон зображення:

remove_background = rb.remove(read_original)

Створюємо файл з відредагованим зображенням:

edited_photo = open(edited, "wb")

Прапор “wb” означає запис у файл у двійковому форматі.

Поміщаємо зображення у новий файл:

edited_photo.write(remove_background)

Закриваємо обидва файли:

original_photo.close()
edited_photo.close()

Ось результат коду:

Фото без фону

Третій приклад

Останнім зображенням буде це:

Photo by Lance Reis on Unsplash

Останнім ми розглянемо спосіб з використанням бібліотеки OpenCV, яка встановлювалася на ваш комп’ютер разом із rembg раніше. Бібліотека OpenCV також надає функції для роботи з файлами.

Імпортуємо бібліотеку OpenCV:

import cv2

Ось код зі застосуванням даної бібліотеки:

def remove_photo_background(original, edited):
    original_photo = cv2.imread(original)
    remove_background = rb.remove(original_photo)
    edited_photo = cv2.imwrite(edited, remove_background)

    print(f"Image {original} successfully edited!")
    return edited_photo


remove_photo_background("abhinav-roy-SZh1kRFp8qM-unsplash.jpg", "without_background_3.png")

Читаємо файл з оригінальним зображенням:

original_photo = cv2.imread(original)

Видаляємо фон:

remove_background = rb.remove(original_photo)

Зберагіємо нове зображення:

edited_photo = cv2.imwrite(edited, remove_background)

Взагалі варто зазначити, що функції imread() перетворює зображення на матрицю, з якою потім працює функція imwrite().

Результат коду:

Фото без фону

Висновок

Ось таким чином можна легко видаляти фон за допомогою функції remove() бібліотеки rembg. Також на основі трьох прикладів ми побачили, що для роботи з файлами ми цілком можемо використовувати різні бібліотеки, або ж взагалі користуватися вбудованими функціями.

Всім дякую за увагу!

Статті про вітчизняний бізнес та цікавих людей:

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Magnifique numérique
Magnifique numérique@nocturnal_reader

Нічний читач

57Довгочити
1.2KПерегляди
18Підписники
Підтримати
На Друкарні з 14 липня 2025

Більше від автора

  • Список різноманітних бібліотек у Python

    Всіх вітаю! Сьогодні хочу поділитися великим списком бібліотек у Python для різного призначення та потреб:https://github.com/vinta/awesome-pythonТут багато цікавих бібліотек зібрано за сферами їхньго призначення.

    Теми цього довгочиту:

    It
  • Roadmap — ваш путівник до поставлених цілей.

    Сайт Roadmap вміщує у собі багато путівників до великої кількості професій та сфер, у яких доволі чітко описано, що саме потрібно для повноцінного вивчення того чи іншого предмету зацікавленості.

    Теми цього довгочиту:

    It

Це також може зацікавити:

  • Безпорадність ВНЗ перед дистанційкою.

    Всі ви навчалися у коледжах, університетах, інститутах, бурсах, і так далі. Кожен із вас пережив студентські роки, той самий період, коли мівіна здавалася їжею богів, а сесія - була такою ж страшною як і перелом усіх частин тіла одразу у декількох місцях.

    Теми цього довгочиту:

    Освіта
  • Як я зазнав невдачі в наставництві

    З 18 років я працюю ментором в Code Club Україна, і мій підхід до навчання завжди був... експериментальним. Моя остання група була повним провалом, і я хочу поділитися цим з іншими менторами, щоб вони були дуже обережними з методами наставництва, які вони використовують.

    Теми цього довгочиту:

    Менторство
  • Java. Повний огляд мережевих моделей. Socket API, forking, non-blocking sockets, event-driven API

    Хоча сокет - це один файловий дескриптор, він є двонаправленим каналом комунікації, який використовується для одночасного відправлення і отримання даних. Операційна система та мережеві протоколи забезпечують управління потоками даних, що дозволяє коректно розрізняти дані

    Теми цього довгочиту:

    Java

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити:

  • Безпорадність ВНЗ перед дистанційкою.

    Всі ви навчалися у коледжах, університетах, інститутах, бурсах, і так далі. Кожен із вас пережив студентські роки, той самий період, коли мівіна здавалася їжею богів, а сесія - була такою ж страшною як і перелом усіх частин тіла одразу у декількох місцях.

    Теми цього довгочиту:

    Освіта
  • Як я зазнав невдачі в наставництві

    З 18 років я працюю ментором в Code Club Україна, і мій підхід до навчання завжди був... експериментальним. Моя остання група була повним провалом, і я хочу поділитися цим з іншими менторами, щоб вони були дуже обережними з методами наставництва, які вони використовують.

    Теми цього довгочиту:

    Менторство
  • Java. Повний огляд мережевих моделей. Socket API, forking, non-blocking sockets, event-driven API

    Хоча сокет - це один файловий дескриптор, він є двонаправленим каналом комунікації, який використовується для одночасного відправлення і отримання даних. Операційна система та мережеві протоколи забезпечують управління потоками даних, що дозволяє коректно розрізняти дані

    Теми цього довгочиту:

    Java