云计算百科
云计算领域专业知识百科平台

Day 01 :AI 抠图:3 行代码去掉图片背景

上周帮朋友的小店做淘宝主图,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 的深度学习模型:

  • 训练阶段(已经替你做完了):给模型看了几百万张图,告诉它"这些像素属于前景物体,那些属于背景",模型慢慢学会分辨物体边界。
  • 推理阶段(你用的部分):把图片喂给模型,模型给每个像素打一个分——“这个像素属于前景的概率是多少”,最后生成一张 Alpha 蒙版(白色=前景,黑色=背景,灰色=边缘过渡区域)。
  • 合成阶段:用这张蒙版做透明处理,背景变透明,前景保留。
  • 整个过程就是:输入一张图 → 模型预测蒙版 → 输出透明背景图。

    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 官方文档)。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Day 01 :AI 抠图:3 行代码去掉图片背景
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!