上周帮朋友的小店做淘宝主图,50 张商品照片要把背景全换成纯白色。朋友问:"你会 PS 吧?帮我抠个图呗。"我用钢笔工具试了一张,5 分钟起步,50 张就是 4 个多小时。后来花 3 分钟写了段 Python,50 张图全部自动抠完,效果比手动描的还干净。这篇文章就把这件事拆开讲:单张抠图、批量处理、证件照换底、电商白底图,以及毛发边缘的 Alpha Matting 技巧和 Segment Anything 模型。全程本地运行,零 API 费用。
先看传统方式和 rembg 的对比:
| PS 钢笔工具 | 3~10 分钟 | 无 | 取决于手稳 | 高 |
| PS 快速选择/魔棒 | 30 秒~2 分钟 | 无 | 一般,毛发灾难 | 中 |
| remove.bg 等在线工具 | 5 秒 | 有(收费) | 好 | 低,但要钱 |
| Python + rembg | 2~5 秒 | 批量无上限 | 好 | 会装 pip 就行 |
关键区别:rembg 完全免费、本地运行、批量无限制,图片不用传到别人的服务器上,商业素材和客户照片不用担心泄露。
原理:U²-Net 怎么把前景"看"出来
不展开论文,只说思路。rembg 的核心是一套叫 U²-Net 的深度学习模型:
整个过程就是:输入一张图 → 模型预测蒙版 → 输出透明背景图。
rembg 内置了好几个模型,最常用这几个:
| u2net | 170MB | 通用之王,效果最均衡(默认) |
| u2netp | 4MB | 轻量快速,效果稍差 |
| u2net_human_seg | 170MB | 专为人像优化,头发边缘更好 |
| isnet-general-use | 约 180MB | ISNet 模型,细节保留强 |
首次使用某个模型时会自动下载,之后就存在本地了,不需要联网。代码和模型分别来自 rembg 的 GitHub 仓库 和 U²-Net 论文(arXiv: 2005.09007)。
安装与第一段代码
装三个包,没有别的依赖:
pip install rembg pillow onnxruntime
- rembg:抠图核心库
- pillow:Python 图片处理标准库
- onnxruntime:模型推理引擎
最简版本真的只要 3 行:
from PIL import Image
from rembg import remove
# 打开图片 → 去除背景 → 保存
img = Image.open("input.jpg")
result = remove(img)
result.save("output.png")
三行。没省略。没 trick。跑完你就能拿到一张透明背景的 PNG。这里 remove() 内部会自己加载默认的 u2net 模型,单张图无所谓;批量处理就别这么写了,见下一节。
批量处理:50 张图几分钟
批量场景下最重要的是预加载模型——如果每张图都让 remove() 重新加载一次,170MB 的模型光加载就得好几秒,总时间能翻 3 倍:
import os
from pathlib import Path
from PIL import Image
from rembg import remove, new_session
input_dir = "./product_photos"
output_dir = "./product_photos_cutout"
os.makedirs(output_dir, exist_ok=True)
# 支持的图片格式
valid_ext = {".jpg", ".jpeg", ".png", ".bmp", ".webp"}
# 预加载模型(重要!避免每张图片重复加载)
session = new_session("u2net")
image_files = [
f for f in Path(input_dir).iterdir()
if f.suffix.lower() in valid_ext
]
for i, img_path in enumerate(image_files, 1):
img = Image.open(img_path).convert("RGB")
result = remove(img, session=session)
out_name = img_path.stem + "_nobg.png"
result.save(os.path.join(output_dir, out_name))
print(f"[{i}/{len(image_files)}] ✅ {img_path.name}")
print(f"🎉 全部完成!输出目录:{output_dir}")
配套脚本 day01_remove_bg.py 把单张、批量、精细抠图、证件照换底、白底图都整合好了,带注释,直接运行即可。
进阶:精细边缘、换底色、白底图
Alpha Matting:毛发救星
处理猫咪、长发人像、毛绒玩具这类有"模糊边缘"的物体时,普通的二值蒙版会让边缘看起来硬邦邦的。开启 alpha_matting=True 后,rembg 会在边缘区域做更精细的半透明计算,让毛发丝一根根自然地保留下来:
result = remove(
img,
alpha_matting=True, # 开启!
alpha_matting_foreground_threshold=240, # 前景判定阈值
alpha_matting_background_threshold=10, # 背景判定阈值
alpha_matting_erode_size=10, # 边缘腐蚀半径
)
三个参数的直觉理解:
- 前景阈值:越高越严格,只有"非常确定是前景"的像素才保留
- 背景阈值:越低越严格,只有"非常确定是背景"的像素才去除
- 腐蚀半径:越大,边缘越向内收缩,适合去背景色渗入的情况
证件照换底色
抠出人像后填一层纯色背景,就是证件照换底。配套脚本里的 id_photo_change_bg() 就是这个思路:用 u2net_human_seg 人像模型抠图 → 新建纯色 RGBA 背景 → bg.paste(result, (0, 0), result) 透明混合。常用底色:蓝色 (0, 102, 204)、红色 (255, 0, 0)、白色 (255, 255, 255)。
想练手的话,把它改成命令行工具:输入图片路径和颜色(r g b),输出换好底色的证件照;再加个参数支持自定义输出尺寸(一寸 295×413、二寸 413×579)。
电商白底图
同样的套路,背景换成纯白,保存成高质量 JPEG(quality=95),就是淘宝/拼多多/1688 的商品主图格式。配套脚本的 product_white_bg() 直接可用。
CPU 够用,GPU 更快
rembg 默认用 CPU 推理,单张 2~5 秒完全够用;批量几百张或对速度要求极高时,GPU 能快 5~10 倍:
# 先确保装了 CUDA 版 onnxruntime
pip install rembg[gpu] onnxruntime-gpu
代码完全不用改,rembg 会自动检测并使用 GPU。
模型选择策略:
| 日常抠图、社交媒体素材 | u2net(默认) | 均衡 |
| 实时预览、移动端部署 | u2netp | 快,4MB 就能跑 |
| 人像、证件照 | u2net_human_seg | 头发边缘更自然 |
| 复杂背景、商品 | isnet-general-use | 细节保留好 |
运行效果
以 input.jpg 为例,配套脚本跑完会得到这几类产物(下图为本机实跑结果):
!在这里插入图片描述
运行日志:
!在这里插入图片描述
透明背景抠图:
!在这里插入图片描述
Alpha Matting 精细抠图(适合毛发、半透明边缘):
!在这里插入图片描述
证件照换蓝底:
!在这里插入图片描述
电商白底图:
!在这里插入图片描述
费用与许可
| rembg 库 | 免费,MIT 开源协议 |
| 模型权重 | 免费,首次自动下载 |
| GPU 推理 | 本地显卡,无额外费用 |
| 在线 API(remove.bg 等) | 约 ¥0.1~0.5/张(对比用) |
| 每月批量 1000 张成本 | ¥0 |
商用合规性:rembg 是 MIT 协议,商用无限制;U²-Net 模型是 Apache 2.0 协议,商用无限制;ISNet 模型是学术研究用途,商用需要确认许可。对比一下:用 remove.bg 的 API 处理 1000 张图大约 ¥100~500,用 rembg,成本是零。
延伸:Segment Anything
如果你需要的是"分割图中某个物体"而不是"一键去背景",可以看看 Meta 在 2023 年开源的 Segment Anything Model(SAM)。两者思路不同:rembg 自动判断"什么是前景",一键出结果;SAM 用点、框、文字提示指定"分割这个区域",再精确分割出来。类比:rembg 像自动挡汽车,SAM 像手动挡——更灵活,但需要更多操作。
# pip install segment-anything opencv-python
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator
import cv2
# 加载 SAM 模型
sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")
mask_generator = SamAutomaticMaskGenerator(sam)
# 生成所有可能的分割区域
image = cv2.imread("input.jpg")
masks = mask_generator.generate(image)
print(f"检测到 {len(masks)} 个分割区域")
# 每个 mask 包含:segmentation(布尔矩阵)、area(面积)、bbox(边界框)等
SAM 的模型文件比较大(ViT-H 约 2.4GB),首次使用需要下载,适合需要更精细控制的场景;日常简单抠图用 rembg 就够了。相关资料:SAM 官网、SAM GitHub。2024 年 Meta 又开源了 SAM 2,扩展到了视频分割,可以追踪视频中的物体,对视频分割感兴趣可以关注。
另外两个练手方向:一是批量水印添加器,在抠图基础上用 Pillow 的 ImageDraw 和 ImageFont 给每张图右下角加半透明文字水印(如店铺名),支持自定义位置、字号、透明度;二是视频抠图,pip install opencv-python 后用 cv2.VideoCapture 逐帧读取、对每帧调用 remove() 生成绿幕效果短视频,加分项是用多线程/多进程加速、加进度条显示。
收尾
核心就一句话:
from rembg import remove
result = remove(Image.open("input.jpg"))
result.save("output.png")
记住四条:批量处理一定要预加载 session,别每次重新加载模型;毛发/半透明场景开 alpha_matting;人像用 u2net_human_seg;完全本地运行,零成本,MIT 商用无忧。把 input.jpg 换成你自己的图跑一遍,剩下的就是看效果了。
参考文档:Pillow(Pillow 官方文档)、onnxruntime(onnxruntime 官方文档)。
网硕互联帮助中心




评论前必须登录!
注册