python实现的图片人像抠图工具

292 阅读5分钟

图片人像抠图工具

这是一个使用 Python 开发的桌面应用程序,可以方便地从图片中抠出人像,去除背景。

功能介绍

  • 选择图片: 用户可以点击"选择图片"按钮,从本地文件系统中选择 JPG, JPEG, PNG, BMP, GIF 格式的图片。
  • 实时预览: 选择图片后,原始图片会显示在左侧预览框中。
  • 一键抠图: 点击"开始抠图"按钮,程序会自动识别人像并去除背景。处理后的图片会显示在右侧预览框中。
  • 保存图片: 抠图完成后,用户可以点击"保存图片"按钮,将去除背景后的图片(带透明通道)保存为 PNG 文件。
  • 状态提示: 程序底部有状态栏,会显示当前操作状态或提示信息。
  • 用户友好: 简洁的图形用户界面,易于操作。

技术栈

  • Python: 主要编程语言。
  • Tkinter: 用于构建图形用户界面 (GUI)。
  • Pillow (PIL): 用于图像的加载、处理和显示。
  • rembg: 核心库,用于实现背景去除功能。它使用了预训练的深度学习模型(如 U2Net)来识别人像。
  • onnxruntime: rembg 依赖此库来运行其底层的 ONNX 格式深度学习模型。
  • PyInstaller: 用于将 Python 脚本打包成可执行的 .exe 文件,方便在没有 Python 环境的 Windows 电脑上运行。

创作过程

  1. 需求分析:

    • 目标是创建一个简单易用的抠图工具,用户可以直接运行 .exe 文件。
    • 核心功能是人像背景去除。
    • 需要有图片选择、预览和保存功能。
  2. 技术选型:

    • GUI 库选择了 Python 内置的 tkinter,因为它轻量且无需额外安装复杂的依赖(除了 Pillow)。
    • 图像处理选择了 Pillow,功能强大且与 tkinter 配合良好。
    • 抠图功能调研后选择了 rembg,它使用方便,效果也相对不错,并且支持多种模型。
    • 打包工具选择了 PyInstaller,是 Python 常用的打包方案。
  3. 环境搭建:

    • 安装 Python。
    • 使用 pip 安装 rembg, Pillow, PyInstaller, onnxruntime.
  4. 核心功能实现 (rembg):

    • 首先测试 rembg 库的基本用法,确保能够成功去除图片背景。
    • rembg.remove(image_bytes) 是关键函数。
  5. GUI 设计与实现 (tkinter):

    • 设计界面布局:包含选择图片、开始抠图、保存图片三个主要按钮,以及左右两个图片预览区域(原始图和效果图),底部添加状态栏。
    • 编写 select_image 函数:使用 filedialog.askopenfilename 获取图片路径,使用 Pillow 加载图片,并使用 ImageTk.PhotoImagetkinter 标签中显示。
    • 编写 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 获取保存路径,使用 Pillowsave() 方法保存处理后的图片(建议保存为 PNG 以支持透明背景)。
  6. 打包成 .exe (PyInstaller):

    • 挑战: rembg 依赖于预训练的 ONNX 模型文件以及 onnxruntime 库。直接打包时,PyInstaller 可能不会自动包含这些模型或 onnxruntime 的所有必要部分,导致打包后的程序无法运行。
    • 解决方案:
      1. 手动找到 rembg 下载的模型文件(通常在用户目录的 .u2net 文件夹下,如 u2net.onnx)。
      2. 在项目脚本同级目录下创建一个文件夹(例如 u2net_models),并将模型文件复制进去。
      3. 在 Python 脚本的开头,添加代码判断是否在 PyInstaller 打包环境下运行 (if hasattr(sys, '_MEIPASS'))。如果是,则设置环境变量 U2NET_HOME 指向打包后程序内部的模型文件夹路径 (os.path.join(sys._MEIPASS, 'u2net_models'))。这样 rembg 就能找到模型了。
      4. 使用 PyInstaller 命令时,通过 --add-data "local_model_folder_name:target_folder_name_in_exe" 参数将模型文件夹包含进打包文件。
      5. 重要: 为了确保 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 参数生成单个可执行文件。
  7. 测试与优化:

    • 在不同图片上测试抠图效果和程序稳定性。
    • 优化图片显示逻辑,确保图片能正确缩放并适应预览框。
    • 添加错误处理和用户提示(如文件选择错误、处理失败等)。
    • 确保按钮在不同状态下(如处理中、处理完成)的可用性(state=tk.DISABLEDstate=tk.NORMAL)。
  8. 文档编写:

    • 创建 README.md 文件,介绍软件功能、使用的技术以及简要的创作和打包过程。

如何运行

  1. 直接运行 .exe (推荐):

    • dist 文件夹中找到 image_matting_app.exe 文件 (使用上述包含 --hidden-import "onnxruntime" 的 PyInstaller 命令生成后)。
    • 双击运行即可。
  2. 通过 Python 源码运行 (需要 Python 环境):

    • 确保已安装 Python。
    • 克隆或下载本项目。
    • 在项目根目录下打开终端/命令提示符。
    • 安装依赖: pip install rembg Pillow onnxruntime
    • 运行脚本: python image_matting_app.py

新增注意事项:

  • 模型文件准备:
    1. 手动创建 u2net_models 文件夹
    2. 下载模型文件到该目录:
      mkdir u2net_models
      curl -L https://github.com/danielgatis/rembg/releases/download/v0.0.0/u2net.onnx -o u2net_models/u2net.onnx
      
    3. 确保文件路径为 项目根目录/u2net_models/u2net.onnx

注意事项

  • 抠图效果依赖于 rembg 库及其使用的模型,对于复杂背景或与人像颜色相近的背景,效果可能有所差异。
  • 首次运行脚本(非 .exe)时,rembg 可能会自动下载所需的模型文件,请确保网络连接。对于 .exe 文件,模型已打包在内。
  • 处理较大图片或在性能较低的电脑上运行时,抠图过程可能需要一些时间,请耐心等待。

1.png