Чтобы удалить фон изображения в Python, мы будем использовать библиотеку rembg, которая является очень мощным инструментом Python и даст вам очень быстрые и точные результаты, поскольку эта библиотека rembg специально создана для удаления фона изображения.

Давайте посмотрим, как мы можем создать простое настольное приложение на Python, используя Tkinter для графического интерфейса и rembg для удаления фона изображения.
С помощью Tkinter
Прежде чем создавать главное окно и виджеты, убедитесь, что Tkinter установлен в вашей системе.
pip install tk
pip install tkinterdnd2
Добавьте функциональность
Чтобы использовать функции rembg, сначала вам необходимо установить rembg в вашей системе. Удалить фоновое изображение в Python.
pip install rembg

Для удаления фона изображения в Python есть встроенная функция библиотеки rembg, называемая Remove(), которая принимает изображение в качестве параметра и возвращает изображение с удаленным фоном в формате файла PNG.
Давайте посмотрим, как мы можем создать простое приложение для удаления фоновых изображений на Python.
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
import rembg
import io
import os
import tempfile
import shutil
from tkinterdnd2 import TkinterDnD, DND_FILES
def how_to_use():
messagebox.showinfo("How to use", '''Welcome to the Application \nYou can use this application to remove the background of the image \nInstructions: \nClick On Browse Button and Upload the image and after click on upload button, the image will be processed for removing the background and then you can download your image.''')
def browse_file():
file_path = filedialog.askopenfilename()
if file_path: # Check if a file is selected
display_image(file_path)
def on_submit():
try:
processed_image = remove_background(current_file_path)
if processed_image:
display_before_after_images(current_file_path, processed_image)
else:
messagebox.showinfo("Processing Error", "Image processing failed.")
except Exception as e:
messagebox.showerror("Error", f"Failed to process the image: {e}")
def remove_background(image_path):
try:
with open(image_path, "rb") as input_file:
input_data = input_file.read()
output_data = rembg.remove(input_data)
return Image.open(io.BytesIO(output_data))
except Exception as e:
messagebox.showerror("Error", f"Failed to remove background: {e}")
return None
def display_image(file_path):
global current_file_path
try:
current_file_path = file_path.strip('{}')
image = Image.open(current_file_path)
image = image.resize((500, 500), Image.LANCZOS)
tk_image = ImageTk.PhotoImage(image)
image_label.config(image=tk_image)
image_label.image = tk_image
submit_button.config(command=on_submit)
submit_button.pack(pady=5)
except Exception as e:
messagebox.showerror("Error", f"Failed to open the image: {e}")
def save_temp_image(processed_image):
temp_dir = tempfile.mkdtemp()
temp_path = os.path.join(temp_dir, "removed_bg.png")
processed_image.save(temp_path)
return temp_path
def on_drop(event):
file_path = event.data
display_image(file_path)
def display_before_after_images(original_path, processed_image):
global temp_removed_bg_path, result_window
result_window = tk.Toplevel(window)
result_window.title("Before And After Images")
try:
# Original Image
original_image = Image.open(original_path)
original_image = original_image.resize((500, 500), Image.LANCZOS)
tk_original_image = ImageTk.PhotoImage(original_image)
# Processed Image
processed_image = processed_image.resize((500, 500), Image.LANCZOS)
tk_processed_image = ImageTk.PhotoImage(processed_image)
# Before and After Label
before_after_label = tk.Label(result_window, text="Before And After", font=("Georgia", 14))
before_after_label.pack(pady=5)
# Display Original Image
original_label = tk.Label(result_window, image=tk_original_image)
original_label.image = tk_original_image
original_label.pack(side="left", padx=10)
# Display Processed Image
processed_label = tk.Label(result_window, image=tk_processed_image)
processed_label.image = tk_processed_image
processed_label.pack(side="left", padx=10)
# Download Button
download_button = tk.Button(result_window, text="Download", command=download_image)
download_button.pack(pady=5)
# Close Button
close_button = tk.Button(result_window, text="Cancel", command=result_window.destroy)
close_button.pack(pady=5)
# Save the processed image path in temporary storage
temp_removed_bg_path = save_temp_image(processed_image)
except Exception as e:
messagebox.showerror("Error", f"Failed to display images: {e}")
def download_image():
global temp_removed_bg_path, result_window
if temp_removed_bg_path:
destination_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png"),("All files", "*.*")])
if destination_path:
shutil.copy(temp_removed_bg_path, destination_path)
messagebox.showinfo("Save Successful", f"Image saved to {destination_path}")
result_window.destroy() # Close the Before and After window
window.deiconify() # Show the main window again
else:
messagebox.showinfo("Save Cancelled", "Image not saved.")
# Creating Main Window with TkinterDnD
window = TkinterDnD.Tk()
window.title("Image Background Removal Application")
window.minsize(width=300, height=350)
logo_image = tk.PhotoImage(file="my_logo.png")
logo_image_resized = logo_image.subsample(2, 2)
logo_label = tk.Label(window, image=logo_image_resized)
logo_label.pack(pady=10) # Add padding on the Y-axis
menu_bar = tk.Menu(window)
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Home", menu=file_menu)
help_menu = tk.Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=how_to_use)
menu_bar.add_cascade(label="How To Use", menu=help_menu)
more_features = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="More Features", menu=more_features)
page_title = tk.Label(window, text="Upload Your Picture Here", font=("Georgia", 18))
page_title.pack()
# Bind the drag-and-drop events
window.drop_target_register(DND_FILES)
window.dnd_bind('<>', lambda event: on_drop(event))
# Button to open the file dialog
browse_button = tk.Button(window, text="Browse", command=browse_file)
browse_button.pack(pady=5)
# Label to display the selected image
image_label = tk.Label(window)
image_label.pack(pady=10)
# Create "Remove Background" button outside display_image function
submit_button = tk.Button(window, text="Remove Background", command=on_submit)
window.config(menu=menu_bar)
window.mainloop()

Выход

Нажмите кнопку «Обзор», чтобы загрузить изображение.

Когда вы нажмете «Удалить фон», он сохранит результат во временной памяти и покажет вам результат, как до, так и после.

Когда вы нажмете «Загрузить», он сохранится в вашей системе.