Python——RemoveBg三行代码自动抠图

  • 前言
  • 效果图
  • 提前准备
  • 正题
  • 总代码


前言

很多时候,我们需要抠出照片中的人物时,第一想法就是万能PS,用套索抠图。
但是往往会出错,并且让人眼花缭乱。
在这里,给大家演示一番,用python代码来自动抠图。
在这里就不得不介绍一个网站了(remove.bg),绝对的5s级抠图神器。
客户端每月可以免费处理 50 张图片,并且可以通过API上传图片。

效果图

还是老样子,先给大家上个图。(图是百度上抠下来的)

抠图前:

python脚本抠除图片绿幕背景的脚本 python自动抠图_tkinter


抠图后:

python脚本抠除图片绿幕背景的脚本 python自动抠图_tkinter_02


不能不说,这效果能够比得上多年ps老司机了!

提前准备


获得API后,还是老样子,我们先用tkinter布局

python脚本抠除图片绿幕背景的脚本 python自动抠图_抠图_03


这界面可能不太符合正常人的审美。。。。

正题

其实,实现自动抠图只需要三行代码。
我们只不过是使用removebg实现了抠图功能,但真正如何抠图的过程全是由removebg操作的。

from removebg import RemoveBg
rmbg = RemoveBg("此处填写获取的API", "error.log")  # 引号内是你获取的API
rmbg.remove_background_from_img_file("此处填写需上传图片的路径")  # 图片地址

通过这三行代码,我们可以通过API上传图片,让removebg网站帮我们自动抠图,并保存。
**注:**保存的已抠图图片会保存在所上传图片的目录下
(本来想尝试下改变保存路径的,但一直没找到方法)

总代码

# coding=utf-8

from tkinter import *
from tkinter.filedialog import askopenfilenames
import tkinter.filedialog
import tkinter.messagebox
from removebg import RemoveBg

root = Tk()
root.title("去除图中人物背景")
root.geometry("400x500")
root.resizable(0,0)

frame1 = Frame(root)
frame2 = Frame(root)
frame1.pack()
frame2.pack()

read_var = StringVar()

IMGPATH = ""

def get_image():
    global IMGPATH
    filenames = askopenfilenames(filetypes = (("jpg img","*.jpg"),("pgn img","*.pgn"),("gif img","*.gif")))
    if len(filenames) > 0:
        fnlist = [fn for fn in filenames]
        fnstr = '\n'.join(fnlist)
        read_var.set(fnstr)
        IMGPATH = fnlist
    else:
        read_var.set("目前没有选择任何图片文件")


def make_image():
    global savepath
    global IMGPATH
    for imgpath in IMGPATH:
        produce_image(imgpath)
    tkinter.messagebox.showinfo(title = "OK",message = '完成生成')


def produce_image(img_path):
    rmbg = RemoveBg("此处填写获取的API", "error.log") 
    rmbg.remove_background_from_img_file(img_path)  


Label1 = Label(frame1,text = "文件路径:")
Label1.grid(row = 0,column = 0,pady = 20)
Label3 = Label(frame1,textvariable = read_var)
Label3.grid(row = 0,column = 1)

Button1 = Button(frame2,text = "选择文件",command = get_image,font = ("楷体",18))
Button3 = Button(frame2,text = "生成图片",command = make_image,font = ("楷体",18))
Button1.pack(pady = 20)
Button3.pack(pady = 20)

mainloop()

**注:**本代码中API需改为自己所注册的
以上代码均为私人所码,如有疑问,请留言。