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

Удалить фон из изображения с помощью Python

Давайте посмотрим, как мы можем создать простое настольное приложение на Python, используя Tkinter для графического интерфейса и rembg для удаления фона изображения.

Содержание

С помощью Tkinter

Прежде чем создавать главное окно и виджеты, убедитесь, что Tkinter установлен в вашей системе.

pip install tk
pip install tkinterdnd2

Добавьте функциональность

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

pip install rembg

Установка 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()

Удалить фон изображения с помощью rembg в Python

Выход

Как стереть фон с изображения в Python

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

пример удаления фона изображения в Python

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

Нажмите «Удалить фон»

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

Добавить комментарий