Всіх вітаю! У цій статті ми познайомимося з бібліотекою rembg, яка здатна видаляти фон з фотографій за допомогою ШІ. Хоч бібліотека невеличка, але точно є корисною для використання у деяких ситуаціях.
Встановлення rembg
Windows:
pip install rembgMacOS:
pip3 install rembgLinux:
pip install rembgТакож перед початком роботи із rembg треба обов’язково встановити бібліотеку onnxruntime, так як вона не встановлюється автоматично. Бібліотека onnxruntime по суті запускає штучний інтелект у rembg, який потрібен для виявлення фону.
Команди для встановлення onnxruntime є нижче.
Windows:
pip install onnxruntimeMacOS:
pip3 install onnxruntimeLinux:
pip install onnxruntimeТепер наш код точно буде працювати.
Використання rembg
Перший приклад
Для початку імпортуємо дві бібліотеки — rembg та pillow. Бібліотеку pillow ми використовуємо тому, що вона дозволить нам відкривати і зберігати зображення.
Імпортуємо:
import rembg as rb
from PIL import ImageДля першого прикладу оберемо це зображення:

Створюємо функцію, яка буде видаляти фон:
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)Ось результат:

Другий приклад
Тепер оберемо іншу картинку:

Насправді можна і не використовувати 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()Ось результат коду:

Третій приклад
Останнім зображенням буде це:

Останнім ми розглянемо спосіб з використанням бібліотеки 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. Також на основі трьох прикладів ми побачили, що для роботи з файлами ми цілком можемо використовувати різні бібліотеки, або ж взагалі користуватися вбудованими функціями.
Всім дякую за увагу!