图片人像抠图工具
这是一个使用 Python 开发的桌面应用程序,可以方便地从图片中抠出人像,去除背景。
功能介绍
- 选择图片: 用户可以点击"选择图片"按钮,从本地文件系统中选择 JPG, JPEG, PNG, BMP, GIF 格式的图片。
- 实时预览: 选择图片后,原始图片会显示在左侧预览框中。
- 一键抠图: 点击"开始抠图"按钮,程序会自动识别人像并去除背景。处理后的图片会显示在右侧预览框中。
- 保存图片: 抠图完成后,用户可以点击"保存图片"按钮,将去除背景后的图片(带透明通道)保存为 PNG 文件。
- 状态提示: 程序底部有状态栏,会显示当前操作状态或提示信息。
- 用户友好: 简洁的图形用户界面,易于操作。
技术栈
- Python: 主要编程语言。
- Tkinter: 用于构建图形用户界面 (GUI)。
- Pillow (PIL): 用于图像的加载、处理和显示。
- rembg: 核心库,用于实现背景去除功能。它使用了预训练的深度学习模型(如 U2Net)来识别人像。
- onnxruntime:
rembg依赖此库来运行其底层的 ONNX 格式深度学习模型。 - PyInstaller: 用于将 Python 脚本打包成可执行的
.exe文件,方便在没有 Python 环境的 Windows 电脑上运行。
创作过程
-
需求分析:
- 目标是创建一个简单易用的抠图工具,用户可以直接运行
.exe文件。 - 核心功能是人像背景去除。
- 需要有图片选择、预览和保存功能。
- 目标是创建一个简单易用的抠图工具,用户可以直接运行
-
技术选型:
- GUI 库选择了 Python 内置的
tkinter,因为它轻量且无需额外安装复杂的依赖(除了 Pillow)。 - 图像处理选择了
Pillow,功能强大且与tkinter配合良好。 - 抠图功能调研后选择了
rembg,它使用方便,效果也相对不错,并且支持多种模型。 - 打包工具选择了
PyInstaller,是 Python 常用的打包方案。
- GUI 库选择了 Python 内置的
-
环境搭建:
- 安装 Python。
- 使用
pip安装rembg,Pillow,PyInstaller,onnxruntime.
-
核心功能实现 (
rembg):- 首先测试
rembg库的基本用法,确保能够成功去除图片背景。 rembg.remove(image_bytes)是关键函数。
- 首先测试
-
GUI 设计与实现 (
tkinter):- 设计界面布局:包含选择图片、开始抠图、保存图片三个主要按钮,以及左右两个图片预览区域(原始图和效果图),底部添加状态栏。
- 编写
select_image函数:使用filedialog.askopenfilename获取图片路径,使用Pillow加载图片,并使用ImageTk.PhotoImage在tkinter标签中显示。 - 编写
display_image辅助函数:用于将 PIL 图像对象缩放并显示在指定的tk.Label控件上,注意保持图像引用以防被垃圾回收。 - 编写
start_remove_background函数:- 调用
rembg.remove()进行抠图。 - 关键: 由于抠图可能耗时,将其放入一个单独的
threading.Thread中执行,避免 GUI 卡顿。 - 使用
root.after(0, callback)将 GUI 更新操作调度回主线程执行。
- 调用
- 编写
on_background_removal_complete函数:在抠图线程完成后,此函数在主线程中被调用,用于更新处理后的图片显示和按钮状态。 - 编写
save_image函数:使用filedialog.asksaveasfilename获取保存路径,使用Pillow的save()方法保存处理后的图片(建议保存为 PNG 以支持透明背景)。
-
打包成
.exe(PyInstaller):- 挑战:
rembg依赖于预训练的 ONNX 模型文件以及onnxruntime库。直接打包时,PyInstaller可能不会自动包含这些模型或onnxruntime的所有必要部分,导致打包后的程序无法运行。 - 解决方案:
- 手动找到
rembg下载的模型文件(通常在用户目录的.u2net文件夹下,如u2net.onnx)。 - 在项目脚本同级目录下创建一个文件夹(例如
u2net_models),并将模型文件复制进去。 - 在 Python 脚本的开头,添加代码判断是否在 PyInstaller 打包环境下运行 (
if hasattr(sys, '_MEIPASS'))。如果是,则设置环境变量U2NET_HOME指向打包后程序内部的模型文件夹路径 (os.path.join(sys._MEIPASS, 'u2net_models'))。这样rembg就能找到模型了。 - 使用
PyInstaller命令时,通过--add-data "local_model_folder_name:target_folder_name_in_exe"参数将模型文件夹包含进打包文件。 - 重要: 为了确保
onnxruntime被正确打包,必须使用--hidden-import参数明确告知 PyInstaller 包含它及其必要的子模块。
- 手动找到
- PyInstaller 打包命令示例(单文件,无控制台,包含模型数据和
onnxruntime):pyinstaller --noconsole --onefile --add-data "u2net_models:u2net_models" --hidden-import "onnxruntime" --hidden-import "onnxruntime.capi._pybind_state" image_matting_app.py - 如果需要调试(会显示命令行窗口):
pyinstaller --onefile --add-data "u2net_models:u2net_models" --hidden-import "onnxruntime" --hidden-import "onnxruntime.capi._pybind_state" image_matting_app.py - 使用
--onefile参数生成单个可执行文件。
- 挑战:
-
测试与优化:
- 在不同图片上测试抠图效果和程序稳定性。
- 优化图片显示逻辑,确保图片能正确缩放并适应预览框。
- 添加错误处理和用户提示(如文件选择错误、处理失败等)。
- 确保按钮在不同状态下(如处理中、处理完成)的可用性(
state=tk.DISABLED或state=tk.NORMAL)。
-
文档编写:
- 创建
README.md文件,介绍软件功能、使用的技术以及简要的创作和打包过程。
- 创建
如何运行
-
直接运行
.exe(推荐):- 在
dist文件夹中找到image_matting_app.exe文件 (使用上述包含--hidden-import "onnxruntime"的 PyInstaller 命令生成后)。 - 双击运行即可。
- 在
-
通过 Python 源码运行 (需要 Python 环境):
- 确保已安装 Python。
- 克隆或下载本项目。
- 在项目根目录下打开终端/命令提示符。
- 安装依赖:
pip install rembg Pillow onnxruntime - 运行脚本:
python image_matting_app.py
新增注意事项:
- 模型文件准备:
- 手动创建
u2net_models文件夹 - 下载模型文件到该目录:
mkdir u2net_models curl -L https://github.com/danielgatis/rembg/releases/download/v0.0.0/u2net.onnx -o u2net_models/u2net.onnx - 确保文件路径为
项目根目录/u2net_models/u2net.onnx
- 手动创建
注意事项
- 抠图效果依赖于
rembg库及其使用的模型,对于复杂背景或与人像颜色相近的背景,效果可能有所差异。 - 首次运行脚本(非
.exe)时,rembg可能会自动下载所需的模型文件,请确保网络连接。对于.exe文件,模型已打包在内。 - 处理较大图片或在性能较低的电脑上运行时,抠图过程可能需要一些时间,请耐心等待。