给任意一张证件照(你自己的或别人的,不依赖原来的底色)方便地更换背景底色: 标准 白/蓝/红、莫兰迪色系、淡色系,以及 渐变灰 等创意渐变底色。 发丝边缘会自动去除原底色光晕,蓝底换白底也不会留下蓝边。
全程本地运行,照片不上传任何服务器。
- 🎯 自动抠图换底,不依赖文件名/原底色
- 🎨 纯色:标准白(#FFFFFF)/蓝(#438EDB)/红(#D6020A) 预设 + 任意十六进制自定义
- 🌸 莫兰迪、淡色系等创意配色板(可在
idphoto/palettes.json里随意扩展) - 🌫️ 渐变:影楼式径向「渐变灰」+ 自定义线性/径向两色渐变
- ✂️ 发丝边缘去污(compositing-inversion),消除原底色光晕
- 🖥️ 网页拖拽界面 + 命令行批量,两种用法共用一套核心逻辑
依赖用 uv 管理(已锁定 Python 3.12):
uv sync # 安装依赖(首次运行会创建 .venv)首次抠图时会自动下载模型(默认
u2net_human_seg,约 168MB,从 GitHub 下载)。
uv run python -m idphoto.app浏览器打开终端里显示的本地地址(默认 http://127.0.0.1:7860 ):拖入照片 → 选底色 (纯色 / 渐变,预设可一键填入并微调)→ 点「生成」→ 右上角下载。
# 预设/莫兰迪/淡色,按名称选
uv run python -m idphoto.cli IDCard_blue.png --preset 证件白
uv run python -m idphoto.cli IDCard_blue.png --preset 雾霾蓝
# 自定义纯色(十六进制)
uv run python -m idphoto.cli IDCard_blue.png --color "#C48E84"
# 预设渐变 / 自定义渐变
uv run python -m idphoto.cli IDCard_blue.png --gradient 渐变灰
uv run python -m idphoto.cli IDCard_blue.png --grad-radial "#FCFCFC,#C9CDD2"
uv run python -m idphoto.cli IDCard_blue.png --grad-linear "#E2F0EE,#6FB0A8:vertical"
# 批量处理整个文件夹,输出到 out/
uv run python -m idphoto.cli ./photos --batch --color "#FFFFFF" -o out
# 高质量模型 + 精修边缘(更慢)
uv run python -m idphoto.cli IDCard_blue.png --model birefnet-portrait --refine| 参数 | 说明 |
|---|---|
--color HEX |
自定义纯色,如 #FFFFFF |
--preset 名称 |
预设/莫兰迪/淡色 中的颜色名 |
--gradient 名称 |
预设渐变名,如 渐变灰 |
| `--grad-linear "A,B[:vertical | horizontal]"` |
--grad-radial "中心色,边缘色" |
自定义径向渐变 |
--model |
u2net_human_seg(默认/快)或 birefnet-portrait(更精细/慢) |
--refine |
开启 alpha matting 精修边缘 |
--no-decontaminate |
关闭边缘去污(默认开启) |
-o, --out |
输出文件(单张)或目录;不填则与原图同目录 |
--batch |
把 input 当作文件夹批量处理 |
编辑 idphoto/palettes.json,往 morandi / pastel / gradients 里加条目即可,
网页和命令行都会自动识别(每项含中文名 + hex)。
抠图(rembg) → 估计原底色 → 去污还原前景色 → 渲染新底色 → alpha 合成
关键在「去污」:证件照原底是近似纯色 B,对半透明发丝像素按合成公式反解
F = (C − (1−α)·B) / α 还原真实前景色,再叠到新底色上,从源头消除彩色光晕。
模型说明:默认 u2net_human_seg(GitHub 托管、快、轻、效果已很好);
birefnet-portrait 发丝更精细但模型约 900MB、推理更慢。BiRefNet 权重若需从
Hugging Face 下载,代码已默认走 hf-mirror.com 镜像(适配 HF 被墙的网络)。
uv run pytest抠图与合成全部在本地完成,证件照不会上传到任何第三方服务。