人工智能技术正处于蓬勃发展中,移除图片背景的方法众多,涵盖了各式各样的实现途径和模型。然而,这些方法往往在安装和配置环境方面稍显复杂。今天,介绍一种极其简便的方法——大约30行代码,就能实现这一功能。虽然相比之下可能稍显简单,但对于不太苛刻的需求来说,这种方法颇为方便实用。
最终效果图
软件UI
Web UI
前置:python3是必须的,>=3.8,<=3.12
创建并激活虚拟环境
一个项目使用一个独立的虚拟环境,这是一个好习惯,避免模块冲突,同时也方便未来可能的打包。
创建一个英文目录并进入该文件夹,地址栏输入cmd
回车,会打开一个cmd窗口,在窗口中输入命令python -m venv venv && .\venv\scripts\activate
创建并激活了虚拟环境
用pip安装2个库
- pillow:这是python中用来处理图片的著名库
- rembg:这是用来移除背景的核心库,主角就是它
执行命令安装:
pip install pillow rembg
非必须但建议
有条件最好搞个代理,以加速从github下载模型,当然没有也可以,但你懂的原因,速度很慢
如果有代理,加速代理地址端口是 127.0.0.1:10809
,在cmd窗口中分别执行2条命令
set http_proxy=http://127.0.0.1:10809 set https_proxy=http://127.0.0.1:10809
创建个 start.py 文件
输入以下30行代码
from tkinter import * from rembg import remove from PIL import Image from tkinter import filedialog root = Tk() root.geometry("800x400") root.maxsize(800, 400) root.minsize(800, 400) root.title("移除图片背景") caption = Label(root, text="") def removeImageBg(): filename = filedialog.askopenfilename(initialdir="/", title="选择一个png格式图片", filetypes=(("png图片", "*.png*"),)) try: if(filename == ""): caption.configure(text="必须选择图片", fg="red") else: caption.configure(text="处理中请稍后...", fg="#333333") root.update_idletasks() openimg = Image.open(filename) removeBg = remove(openimg) removeBg.save(f"{filename}-已删除背景.png") caption.configure(text="处理完成", fg="#11934A") root.update_idletasks() except Exception as e: caption.configure(text=f"出错了{str(e)}", fg="red") selectImgBtn = Button(text="选择png图片立即移除", padx=30, pady=10, bg="#76ABAE", fg="#31363F", cursor="hand2", command=removeImageBg) selectImgBtn.pack(side=TOP, anchor=CENTER, pady=20) caption.pack(side=TOP, anchor=CENTER) root.mainloop()
其实核心就是这3行
openimg = Image.open(filename) removeBg = remove(openimg) removeBg.save(f"{filename}-已删除背景.png")
- 读取要移除背景的原始图片:
openimg = Image.open(filename)
- 移除图片openimg中的背景:
removeBg = remove(openimg)
- 然后将移除背景后的新图片保存到计算机:
removeBg.save(f"{filename}-已删除背景.png")
其他都是构建ui界面、输出处理信息等辅助元素。
执行 start.py
cmd窗口输入 python start.py
,会显示开头的ui图,点击按钮选择要处理的原始png格式图片。
例如原始图片
选择原始图片后将立即自动处理。
处理完成
完成后将在原始图片同目录下创建“原图片名-已删除背景.png”图片,如下图,效果还凑合吧。
第一次使用时将自动下载模型
不论是ui界面形式还是命令行形式,第一次使用,将从GitHub上自动下载模型(167MB),如果未填写代理,下载可能很慢,或许只有几十几百kb,耐心等待哦。
如果有代理,速度或可到几MB,十几MB,下载将很快。
编辑
到此就实现了 移除图片中的背景功能,而且除第一次使用需要联网下载模型,后续使用无需联网。
完整ui模式代码
from tkinter import * from rembg import remove from PIL import Image from tkinter import filedialog root = Tk() root.geometry("800x400") root.maxsize(800, 400) root.minsize(800, 400) root.title("移除图片背景") caption = Label(root, text="") def removeImageBg(): filename = filedialog.askopenfilename(initialdir="/", title="选择一个png格式图片", filetypes=(("png图片", "*.png*"),)) try: if(filename == ""): caption.configure(text="必须选择图片", fg="red") else: caption.configure(text="处理中请稍后...", fg="#333333") root.update_idletasks() openimg = Image.open(filename) removeBg = remove(openimg) removeBg.save(f"{filename}-已删除背景.png") caption.configure(text="处理完成", fg="#11934A") root.update_idletasks() except Exception as e: caption.configure(text=f"出错了{str(e)}", fg="red") selectImgBtn = Button(text="选择png图片立即移除", padx=30, pady=10, bg="#1d7dfa", fg="#ffffff", cursor="hand2", command=removeImageBg) selectImgBtn.pack(side=TOP, anchor=CENTER, pady=20) caption.pack(side=TOP, anchor=CENTER) root.mainloop()
不想要界面,只想要命令行使用
那么代码将更简单,仅需5行
from rembg import remove from PIL import Image input=Image.open("./2.png") output=remove(input) output.save("./2-remove.png")
2.png为原始要处理的图片,2-remove.png 是处理后的图片。
想使用GPU加速:有英伟达显卡,并且不那么旧
cmd窗口中分别执行下面2条命令(莫忘了激活虚拟环境哦)
pip uninstall -y rembg pip install onnxruntime rembg[gpu,cli]
然后重新去执行python start.py
即可
想构建一个web界面,在网页中使用
也很简单,继续执行命令
pip install gradio aiohttp watchdog filetype asyncer
执行完毕后,接着执行
rembg s --host 0.0.0.0 --port 7000
将自动打开web界面