数字人项目里最容易被低估的一步,是源图。模型、口型、TTS 都能调,但源图如果是一张灰蒙蒙的室内照,后面所有环节都在为一个错误的起点打补丁。我们做过一批「照片改黑底 + 立体化」的交付,踩过的坑很集中:肉眼看着是黑的背景,测出来 mean 28.3;AI 直出的图提亮之后,白衬衫变成橙黄色;水印被当成人物圈进前景,提亮后从灰点变成 255 的纯白点。
这篇文章把整条链路拆成两步,并给出四个可以量出来的验收闸门。它不是一个「prompt 大全」,而是我们交付时真正拿来判合格的那套东西。
很多人以为改黑底是一步:把图丢给模型,让它「背景变黑、人物变立体」。实测下来,AI 这一步只擅长做风格与光——它会把皮肤处理得更像 3D 角色渲染、加上轮廓光、把明暗关系拉开;但它不保证背景是纯黑,也不保证水印消失。背景归零、提亮、抹水印,必须由本地脚本做确定性收尾。
| 步骤 | 负责什么 | 不负责什么 | 成本 |
|---|---|---|---|
| 第 1 步 · img2img | 3D 渲染质感、轮廓光、明暗体积 | 背景纯度、水印、色偏 | 单次约 5–10 积分 |
| 第 2 步 · 本地精修 | 背景绝对归零、提亮、去色偏、锐化 | 人物长相(不改) | 零成本,秒级 |
之所以坚持不自建本地 Flux / SDXL:这类需求是低频的,部署一套出图环境要占显存、要调采样器、要维护模型版本,综合成本远高于按次调用。低频需求买算力,高频需求才自建。
| 参数 | 取值 | 错了会怎样 |
|---|---|---|
| 尺寸 | 1024×1536(竖版) | 方图会把人物压扁,竖版才够数字人画幅 |
background | opaque(不透明) | 留空可能输出透明背景:alpha=0 在下游合成里不是「黑」,是「没有」 |
input_fidelity | 0.6 | 调高更像原人但立体感弱;调低 3D 风格更夸张、开始偏离本人 |
prompt 里有两句话必须同时在,缺一句效果就塌一半:
另外值得写进 prompt 的还有「smooth ceramic-like skin shading」和「high-contrast sculpted modeling」——前者给皮肤,后者给衣物褶皱的体积。这两句是 3D 渲染感与普通美颜的分界线。
本地精修不是「加个滤镜」,它有确定的顺序和系数。顺序错了,后面全部白做。
| # | 动作 | 实际系数 | 作用 |
|---|---|---|---|
| 1 | 抠图 | 阈值 24 → 形态学 → 最大连通域 → 填洞 → GrabCut 精修 → 腐蚀 2px → 羽化 | 拿到一张边缘干净的 alpha |
| 2 | 背景归零 | out = fg × alpha,mask 外强制 0 | 顺带抹掉背景上的水印与灰雾 |
| 3 | 提亮 | LAB 的 L 通道:L + (1−L)^1.6 × 0.20 | 抬阴影、不爆高光(幂次 1.6 让暗部提得多、亮部提得少) |
| 4 | 高光去色 | L > 0.86 的区域,a/b 向 128 靠拢 55% | 白衣服提亮后不发黄 |
| 5 | 立体增强 | CLAHE 1.5 + 大半径 unsharp(σ20 × 0.22)+ 小半径锐化(σ1.3 × 0.10),只作用在 alpha_sharp(再腐蚀 9px 的 alpha)上 | 给体积感与面料质感,且不让边缘长光晕 |
第 5 条里的「再腐蚀 9px」是关键细节:锐化与局部对比度增强会把边缘像素往外推,如果不把作用区域再收一圈,人物轮廓外侧会浮出一圈亮边,黑底上特别明显。宁可少增强一点,也不要光晕。
这是整篇文章最该抄走的部分。「看起来挺黑」在交付里不算数,下面四条都能一行代码量出来。
| 判据 | 阈值 | 测法 |
|---|---|---|
| 背景纯度 | mask 外 mean < 10(目标 0) | gray[alpha < 0.04] 的均值 |
| 四角背景 | 四个角各 200×200 全部 < 10 | 逐角裁剪取均值 |
| 人物提亮 | 相对原图 p50 提升 40% 以上 | gray[alpha > 0.5] 的中位数,前后对比 |
| 水印 | 无残留 | 右下角逐块看,特别关注 >240 的孤立亮点 |
这里有个反直觉的坑:测背景不能用「整幅边带」。我们一开始取画面四周一圈的像素均值,得到 28.3,判定背景不达标、反复加了三次黑化。后来改成按 mask 外区域测,同一张图的真实背景读数是 0.00。原因很简单:人物撑满画面时,边带里本来就混着人物的手臂和肩线,它把读数整个污染了。同一张图,两种测法得出完全相反的结论——测法错了,后面所有判断都是错的。
坑一:抠图阈值太低,把背景灰雾和水印圈进人物。阈值取 14 时,右下角水印区(均值 17)被判成前景,提亮之后水印从 210 的灰点变成 255 的纯白点,比原来更显眼。改成 24 越过它才对。正确做法是先量背景各区域的亮度,再定阈值,不要拿一个通用值套所有图。
坑二:锐化会放大 AI 生成的压缩伪影。小半径锐化给到 0.28 时,面料上出现肉眼可见的网格噪纹——那是模型输出里本来就有的高频噪声被锐化拉起来了。收敛到 0.10,质感留在,噪纹不显。
坑三:提亮会放大原图色偏。白衬衫提亮后偏橙黄,因为原图白平衡本身就偏暖,提亮把偏色一起放大了。解法不是调白平衡(会把肤色弄冷),而是只对高光区去色:L > 0.86 的地方把色度往中性拉 55%。肤色在中低亮度区,不受影响。
坑四:增强从 mask 边缘外溢成光晕。见上一节第 5 条,必须按再腐蚀过的 alpha 作用。
img2img 有个稳定行为:它会把人物放得更大。一张全身照进去,很可能出来是半身,甚至裁到腰。对静态物料这不是问题,对数字人渲染源图就是大问题——下游是按固定构图做嘴部对齐的,源图裁到腰,人脸比例全变。
所以交付流程里加一步确认:先给客户看构图取舍,再出成品。另外两个交付细节:
把「背景 must be 纯黑」换成「背景 must be 纯白/透明」,四条判据的结构完全不变:先定义可测的口径,再定阈值,再写检测代码,最后才调参数。我们后来把这套方法用到了数字人待机素材、口播素材的验收上,同样是先量帧差、再定阈值,而不是靠肉眼看「像不像在动」。
如果你手上也有一批照片要转成数字人源图或黑底物料,可以直接把上面四条判据当成验收清单来用;需要连图一起做,我们的企业服务里有「数字人源图黑底立体化」这一档,按张计价,交付时附四条判据的实测读数与 BEFORE/AFTER 对照。相关阅读:数字人待机与口播素材的制作铁律。
Q:为什么不能只用 AI 一次出图,非要本地再跑一遍?
A:因为 AI 不保证背景是纯黑。实测直出图的背景常有灰雾,且在暗部提亮后更明显;本地脚本用 mask 外强制归零,把背景做到 mean 0,这是确定性的,不依赖模型心情。
Q:input_fidelity 设 0.6 是固定的吗?
A:0.6 是「像本人」和「够立体」的平衡点。要求更保真可以往上调,但立体感会下降;要做风格化海报可以往下调,代价是开始偏离本人。不要一次调太多,每次改 0.1 看结果。
Q:测背景为什么不能用整幅边带?
A:人物撑满画面时,边带里混着人物像素。我们同一张图用整幅边带测得 28.3,按 mask 外区域测得 0.00——测法错了会得出相反的结论。
Q:白衣服提亮发黄,能不能直接调白平衡?
A:不建议。调白平衡会把肤色一起弄冷。只对 L > 0.86 的高光区做去色(向中性拉 55%),肤色在中低亮度区,不受影响。
Q:能直接拿去当数字人渲染源图吗?
A:可以,但要先确认构图。img2img 常把人物放大(全身变半身、裁到腰),而下游人脸对齐是按固定构图做的。确认后再用 1080×1920 的补边版,竖版黑边实测 mean 0,天然无缝。