搞AI绘画这几年,Stable Diffusion(简称SD)已经成了我工作流里离不开的工具。不管是给电商图换背景、修老照片,还是做设计提案的创意探索,最常用到也最容易被忽视的一个功能,就是inpaint(局部重绘/图片修复)。很多人只知道“涂一下mask它就能补出来”,但一旦修出来的东西颜色不对、边缘生硬、内容跟原图不搭,就不知道该调哪里了。
这篇就以inpaint修复图片为切入点,把SD的原理和实际操作串起来讲一遍。核心目标不是让你会背几个术语,而是搞清楚:扩散模型里到底发生了什么,mask是怎么约束生成的,denoising strength为什么那么敏感,以及真正修图时每一步该怎么做、踩过的坑有哪些。适合刚入门SD小白、卡在中级阶段想深入理解的玩家,以及要做图片修复实际业务的从业者参考。
1. 先用inpaint当引子:SD到底在“修”什么
1.1 扩散模型的两条路:加噪与去噪
Stable Diffusion的核心,本质上就是一个“去噪”模型。理解了这个,inpaint的原理就通了一大半。
训练阶段,模型拿到一张真实图片,不断往里面叠加高斯噪声,直到图片彻底变成一片雪花点。这个把干净图一步步变脏的过程叫前向扩散(forward diffusion)。接着,模型要学会干反活儿——给它一张满是噪声的图,让它一步步把噪声去掉,还原出原本的图像。这个还原过程叫反向扩散(reverse diffusion)。
打个比方:你有一幅画,被人拿笔刷一层层涂满了白漆。训练时就是制造这些“涂白漆”的状态,而生成时就是让AI学会从一片白里重新把下面的画“推测”出来。去噪过程要经历很多步,每一步模型都会猜“这一步应该去掉多少噪声、保留多少结构”。
那inpaint是怎么回事?你涂掉的mask区域,就相当于是被人为划掉的画面。SD要做的,不是整张图重画,而是根据周围保留区域的语义信息,去“推测”被划掉的部分本来应该长什么样。本质上它还是去噪,只是它只对mask内的区域去噪,同时用周围像素和文本提示词当参考。
1.2 为什么叫Stable,它稳在哪
“Stable”不是指模型输出稳定不出错——恰恰相反,它只是想表达“扩散过程稳定”。SD是在潜在空间(latent space)里做扩散的,而不是直接在像素空间里做。
像素空间里一张512x512的RGB图,数据量是512x512x3,直接在这么高维空间里跑扩散模型,训练和推理都慢得惊人。SD的做法是先用一个自编码器(VAE)把图片压缩成64x64x4的潜在张量,维度缩小了差不多48倍,然后在这个小得多的压缩空间里做加噪、去噪。最后再从latent解码回像素图。
可以这么理解:你要在一栋大楼里修改设计方案,SD不是直接拿实物砌墙拆墙,而是先画一张图纸,在图纸上改,改完再按图纸施工。这张图纸就是latent,施工队就是VAE的解码器。
这个设计带来的直接好处是:GPU显存占用小、推理速度快、生成质量还高。这也是SD能跑在消费级显卡上的根本原因。理解这一点,你也就理解了为什么很多inpaint参数都跟“潜空间操作”有关——后面讲实操的时候会反复提到。
1.3 三块核心组件:VAE、U-Net、文本编码器
如果要把SD拆开来看,大体上就是三个核心部件:
- VAE(变分自编码器):负责图像和latent之间的编码与解码。它决定了图片被压缩成什么样、解码回来是不是清晰。
- U-Net:真正的“去噪主力”。输入带噪的latent、当前时间步t、文本条件向量,输出预测的噪声。
- 文本编码器(Text Encoder):把自然语言提示词变成向量,让U-Net理解你要画什么。
这里面,inpaint修复图片时真正起作用的核心是U-Net。因为你要修复的图片经过VAE编码成latent后,mask区域本身就是一个被污染的状态。U-Net要根据可见区域、提示词和噪声步数,一步步把被污染的区域给“洗”出来。
还有一点容易被忽略:文本编码器不只是把你的英文提示词变成一串数字,它对修复内容的影响极大。比如你涂掉了一个路牌,如果提示词里写了“empty street”,模型就会倾向于让那个位置变成空马路;如果写“park bench”,它可能就给补一个长椅。提示词是语义引导,mask是空间约束,二者在去噪过程中是协同工作的。
1.4 分类器自由引导(CFG):怎么让模型“照着话做”
如果你用过SD,一定见过CFG Scale这个参数,默认值7。它是什么意思?
在去噪的每一步,U-Net其实会同时算两个方向的预测:一个是完全按照文本条件去做“有条件的去噪”,一个是忽略文本条件去做“无条件的去噪”。两者都猜一个结果,然后把它们线性组合。CFG就是这个组合的权重。
CFG越高,模型越有意去贴合提示词,但过高了会过曝、发灰、甚至变脏;CFG太低,模型就放飞自我,画出来的东西跟你想要的没关系了。
放在inpaint场景里,CFG同样关键。修复一个区域时,如果提示词写得很明确(比如“红色消防栓”),CFG可以稍微高一点,让模型严格执行;如果只希望它顺势补背景(比如“草地边缘”),CFG控制在5-7左右就行,太高反而会在本应“自然过渡”的地方画出奇怪的轮廓。
2. inpaint修复图片的技术原理拆解
2.1 mask机制:你划的每一笔都是空间约束
inpaint的核心输入,除了图片本身,还有一张mask图。mask是二值化的——你涂过的区域是白色(表示需要重绘),没涂的是黑色(表示保留原样)。
在WebUI里,你直接用鼠标在图片上涂抹,工具会自动生成这张mask图。在ComfyUI或者底层代码里,你可以用任何图像处理工具(如Photoshop、Python的PIL)手工制作mask。
mask为什么会这么重要?因为它在去噪约束里起到一个“空间门控”的作用。U-Net去噪时,对于mask外的区域,每一步都直接强制保留原图的latent;对于mask内的区域,则可以自由地去噪重建。这就像你要给一栋老房子翻新一个房间——不在改造范围内的部分不许动,改造范围内的部分,你要根据整栋楼的结构去设计新房间的内容。
实际操作中,有一个很容易踩的坑:mask边缘的选择太粗糙。很多人用WebUI涂抹时习惯快速刷一笔,导致边缘锯齿化,修复出来的区域和原图有明显硬切感。解决办法是使用“mask blur”参数(后面会详细说),以及涂抹时尽量覆盖到需要过渡的中间区域,而不是只涂一个精确轮廓。
2.2 两种inpaint实现思路:普通图生图与专用inpaint模型
很多初学SD的人不知道,inpaint其实有两种实现路线。
第一种:普通图生图inpaint。它没有专门训练的mask输入通道,而是把原图中mask区域遮盖掉或加噪声,然后当成带噪的latent输入给常规的U-Net去噪。这个过程里,mask信息是通过“把mask区域变模糊/变噪声+整体重绘强度控制”隐式传递的。WebUI默认的inpaint选“原图”或“潜空间噪声”,走的就是这种路线,优点是通用、可控性强,缺点是边缘融合不一定完美,需要手动调mask blur等参数。
第二种:专用inpaint模型。官方和社区训练过专门的inpaint版本(比如SD 1.5 Inpainting),它U-Net的第一层输入是5通道——4通道的带噪latent,加上1通道的mask图。相当于直接把“哪些地方要修”硬编码进模型里去学习,边缘和语义理解会更自然。如果你在WebUI里看到模型名带“inpainting”字样,或者下载模型时看到“_inpainting.safetensors”后缀,优先选它修图会少很多麻烦。
实操上我一般推荐:普通修图用专用inpaint模型,如果没下载,就用普通模型配WebUI的inpaint功能,也能修得不错,但要注意denoising strength和mask blur的配合。
2.3 denoising strength到底在控制什么
denoising strength(重绘幅度)是inpaint里调节手感最明显的参数,也是新手最容易调崩的参数。
它的本质是:在去噪开始时,对输入latent加入多少噪声。数值0.5意味着把原图区域污染掉一半的噪声再开始去噪,数值1则代表几乎完全抛弃原来的信息,从纯噪声开始重绘。
对整张图生图而言,denoising 0.3~0.5适合微调风格、改颜色,0.6~0.8适合大幅重绘。但在inpaint场景里,这个参数的作用范围主要集中在mask区域内。所以即便你把denoising拉到0.8,mask外的区域依然保持不变——除非你选择了“重绘非蒙版内容”这种反向模式。
修图时的参考选择:
- denoising 0.3~0.4:适合在保留原轮廓的基础上润色(比如去掉皱纹、修补污点、小裂痕)
- denoising 0.5~0.6:适合补全中等缺失区域(如去掉路人、修复草地、改变局部物体)
- denoising 0.7以上:适合大范围重绘(如换姿势、换主体内容、彻底改造背景)
如果你修复完发现输出图有点“糊”,大概率是denoising太低,修补区域没有足够噪声去激活U-Net生成细节的能力,模型只能拿残存的模糊信息去猜测;如果发现输出跟原图完全不搭,大概率是denoising太高,模型等于把那一块当空白重画了。
2.4 为什么修复结果有时候颜色发灰发闷
颜色问题是修复图片最常遇到的Bug级别体验。花了大半天修完,结果那块颜色跟周围完全不在一个层次。
原因通常是两个:一是在潜空间修复后,VAE解码出来的结果天然会比像素级填充“微灰”,因为latent空间里颜色分布与像素空间并不完全一致;二是提示词里没有描述该区域的具体颜色、材质和光照,模型只能猜一个平均色彩。
解决办法也比较粗暴但有效:在提示词里写得越具体越好,别只写“修复”,要把这一块内容、周围环境光、色调全写进去。比如你修复一个草地缺角,提示词可以是“green grass, sunny day, natural lighting, high detail, matching surroundings”,并且CFG保持正常值。同时,可以把“color correction”这个常见词加进去——虽然它不是一个参数,但模型在训练时见过相关概念,能稍微改善色彩偏移。
另一个实用小招:如果修完整体颜色偏灰,可以在出图后加一层低强度(denoising 0.2~0.3)的图生图重绘,提示词加color grading / vibrant colors,把整体色调拉回来。这属于后期补偿,不是什么高端操作,但实测救过很多次图。
3. inpaint修复图片实操:以WebUI为例从零修一张图
3.1 环境准备与模型选择
实操前,你需要一个能跑的SD环境。如果是新手,推荐直接用秋叶整合包或官方SD WebUI;如果你习惯节点式工作流,ComfyUI也完全可以,只是界面逻辑不同,参数概念相通。下面的步骤用WebUI演示,因为它的inpaint界面所见即所得,更适合讲解。
模型方面,我建议准备两个:
- 普通SD 1.5或SDXL模型(如realisticVision、MeinaMix、DreamShaper),用于修复写实照片或设计图
- 专门inpaint模型(如sd-v1-5-inpainting、SDXL-inpaint模型),用于对融合度要求高的任务
如果只装一个也行,普通模型配合WebUI的inpaint功能能应付大多数场景,但要接受边缘过渡可能不够完美的现实。
3.2 具体操作步骤
第一步:打开img2img标签页,切到Inpaint子标签
在WebUI里点击“图生图”,上方标签选择“局部重绘”(Inpaint),然后把要修复的图片拖进去。
第二步:涂抹mask
用右上角的画笔工具,在图片上涂掉你希望重绘的区域。这里有两个细节:
- 涂抹时不用太精确,稍微扩大一点范围,给模型一点自由发挥的余地,边缘会更自然
- 如果你要保留某个细微结构(比如人脸的五官),mask一定要避开那个区域,否则模型会重画,结果难以预料
第三步:设置核心参数
第一次尝试,建议用这个参数组:
- 采样器(Sampler):DPM++ 2M Karras
- 步数(Steps):28
- 宽高:与原图一致
- CFG Scale:7
- 重绘幅度(Denoising strength):0.5
- 蒙版模糊(Mask blur):8
- 蒙版模式:重绘蒙版内容
- 蒙版区域内容处理:潜空间噪声
- 重绘区域:仅蒙版区域(如果你只是想局部修,这个会更快;选“整张图片”则把全图latent一起送进U-Net,色彩过渡更自然但慢)
第四步:写提示词
提示词要同时描述以下几点:要修复区域的内容、区域的材质颜色、与周围环境的衔接关系。
比如我要修复一张公园照片里被撕掉了一块的草地,提示词写:
“green grass, natural texture, matching surrounding grass color, sunny outdoor lighting, high resolution, sharp details, seamless blend”
负面提示词写常见干扰项:“blurry, low quality, color mismatch, artifact, hard edge, unnatural”
第五步:生成与迭代
点生成,看结果。如果满意就结束;如果不满意,根据问题类型去调参数。通常第一版出来后,可以把这张输出图再次拖进inpaint,只对不完美的局部进行二次修复。迭代两三次,效果就会达到可用的水准。
3.3 参数调试的思路:不同情况怎么改
修图不是一锤子买卖,需要根据目标灵活调参。我做了一个表格,方便对照:
| 修复目标 | 建议denoising强度 | 建议mask blur | 提示词侧重点 |
|---|---|---|---|
| 去水印/文字 | 0.4~0.5 | 4~6 | 背景纹理、周围环境 |
| 去路人 | 0.5~0.6 | 8~12 | 地面/墙面/背景延续 |
| 老照片裂痕 | 0.3~0.4 | 6~8 | 质感、色彩、复古感 |
| 换物体内容 | 0.6~0.75 | 4~6 | 新物体的外观与细节 |
| 人脸/五官修复 | 0.25~0.35 | 2~4 | 面部细节、光影、年龄特征 |
这里顺便说一下mask blur。它是对mask边缘做高斯模糊,数值越大,mask边界越柔和,生成内容与周围融合越自然。但过大也不行——比如你只想修一个小点,mask blur拉满会把模糊范围扩到很大,导致模型把周围不该动的地方也轻微重构。
我个人经验是:大面积背景修复时mask blur给到8-12,小物体替换给到4-6,人脸精细修给到2-4。优先让边缘不突兀,比内容细节更重要——人眼对边缘割裂特别敏感。
3.4 ComfyUI里的inpaint有何不同
如果你在ComfyUI里做inpaint,流程会更接近底层逻辑:你会看到一个VAE Encode节点把图片转成latent,一个Load Image节点做mask,然后通过“Set Latent Noise Mask”或inpaint专用的采样节点把mask注入到去噪过程中。
跟WebUI的差别在于,ComfyUI给了你更多自由。你可以直接在mask图里用Photoshop做精细处理,也可以用ControlNet的inpaint模型进一步约束轮廓,还能把修复过程拆成“先修大区域,再缩小范围精修”的多级流程。
ComfyUI适合那些已经在WebUI上修图修出感觉、觉得节点式工作流更可控的人。新手不建议一上来就折腾ComfyUI,先在WebUI里理解参数与结果的关系,再迁移到ComfyUI会轻松得多。
4. 常见问题与排查技巧实录
4.1 修复区域与周围颜色断层
这是最典型的问题。修出来的区域单独看没问题,但跟原图放在一起就“各说各话”。问题通常出在提示词对颜色和光照描述不足,以及denoising强度不适配。
排查顺序:
- 把提示词补得更具体,特别是颜色、环境光方向、材质反光程度
- 适当调低denoising到0.4左右,让模型更尊重原有色调
- 把mask模糊调高到8以上
- 如果还是断层,输出后把这版图再放进inpaint,只对边缘过渡区做一次0.25左右的低强度修复
大多数情况下,第四步能救回来。别指望一次出完美图,二次修复是常规操作。
4.2 修复出来的物体长得离谱
有次我想修掉照片里一个路人,结果模型在路人的位置画出了一只姿势诡异的动物。原因很直接:提示词没有明确“这个区域应该是空的背景”,模型只能自由发挥。
解决办法是:提示词里把背景写明确。比如“empty stone path, no people, no animals, no objects, clear background”。另外,denoising降到0.45~0.55,让模型基于原有画面的结构尽可能补全而不是重新创造。
如果你想修补的是一个明确的物体而不是去掉东西,那提示词要正面描述该物体,并且可以提到“white balance”和“perspective”来辅助一致性。
4.3 修复后边缘明显有拼接感
边缘拼接感通常来自mask边界太过锐利,或者修复区域和原图之间没有共享足够的上下文。
我的建议是:把mask涂抹范围扩大一点,让模型有更多上下文可以参考;mask blur在4-8之间多试验;如果选的“仅蒙版区域”,改成“整张图片”试一次——整张图片模式下,U-Net会同时处理整张latent,mask外的原图信息能更充分地被用上,融合度会更好,只会稍微慢一点。
4.4 同样参数修两张图,结果一个稳一个崩
SD有随机性。每次生成都从随机噪声开始,即使参数完全一样,结果也会有差异。想要可复现性,需要固定随机种子(seed)。
实操中修重要图片时,我一般会先用同一个seed跑多个denoising值,锁定最顺眼的组合,再在这个基础上微调提示词,最后固定seed正式出图。社区流传的“换seed大法”其实就是用来跳出坏生成结果的常用招。
4.5 显存不足或跑得很慢
inpaint比起文生图,多出了VAE编码、mask处理等步骤,对显存占用稍微高一点。如果你的显卡只有4-6G显存,建议:
- 图片尺寸控制在1024x1024以内(除非是明确的高清修复需求)
- 重绘区域选“仅蒙版区域”,不要选“整张图片”
- 使用SD 1.5系列模型而不是SDXL,后者更吃显存
- 加--medvram或--lowvram启动参数(WebUI)
- 如果修的图特别大,可以先用低分辨率完成粗修,再用“高清修复/放大”功能放大到目标尺寸
4.6 常见问题速查表
| 现象 | 最可能原因 | 首选解决方案 |
|---|---|---|
| 颜色断层 | 提示词缺色彩/光照描述 | 补细节提示词+降denoising |
| 边缘硬切 | mask blur不足 | 提高mask blur到8以上 |
| 内容乱画 | 提示词没说清该补什么 | 明确背景/物体描述 |
| 出图偏灰暗 | latent解码+VGG色彩偏移 | 二次低强度颜色校正 |
| 修复区域太生硬 | denoising过高 | 降到0.4~0.5 |
| 修完细节全糊 | denoising过低 | 提到0.6左右 |
| 生成结果不可控 | seed随机性 | 固定seed多试几次 |
| 显存爆了 | SDXL+大图+整图模式 | 关掉整张图片模式或降分辨率 |
4.7 一个老照片修复的完整流程示例
顺便分享一个我自己常做的老照片修复流程,适合有裂痕、折痕的旧图:
- 先用图生图放大(或extras里的upscale)把图片分辨率拉到舒适尺寸
- 在inpaint里把每一条裂痕、划痕、污点都涂上mask
- denoising调0.35、mask blur调4,负面提示词写“scratch, crack, dust, noise”
- 逐条修复,每次只修一个区域的裂纹,以免干扰其他部位细节
- 全部修完后,把整张图用0.2-0.3的denoising跑一次轻图生图,起一个“去压缩噪点、统一颗粒感”的作用
- 最后再用放大模型提升分辨率
整套流程下来,老照片的裂痕可以消掉八成以上,人脸还能保留原人物的神韵。最核心的技巧就是不贪心,一个区域一个区域修,宁慢勿崩,因为一次全图修复往往得反复返工,效率反而更低。
5. 从inpaint延伸到更多玩法:SD的生态与进阶方向
5.1 inpaint + ControlNet:让修复更可控
如果你已经熟练使用inpaint,下一步强烈建议试试ControlNet,尤其是它的inpaint模块和lineart/canny模块。
ControlNet本质上是一种给U-Net注入额外空间控制条件的机制。在inpaint场景里,你可以先用canny提取原始图片的线稿,再配合inpaint修复,这样模型在恢复内容时会被线稿约束住轮廓,修复出来的物体不会跑形。
具体用法:ControlNet单元选择“inpaint”预处理器,上传原图+mask,模式选“ControlNet is more important”或Balanced,CFG调整到7。这样修复一个桌子、一把椅子时,结构更有保障,不会画成畸形体块。
5.2 高清修复与inpaint的协同工作流
很多人在inpaint修完图后发现细节不够,直接用hires.fix又会导致整张图被重绘、伤及已经修好的区域。正确思路是:
- 用inpaint修完所有瑕疵
- 在img2img里把出图拖进去,denoising调0.3,开启hires.fix或使用放大模型
- 放大后再把局部还不满意的小瑕疵拿出来做一次轻量inpaint
这样“粗修→放大→精修→再放大”的循环,能得到细节丰富同时保留原有内容的成品图,比直接全局重绘好得多。
5.3 AIGC修图的商业落地思考
从AIGC行业视角看,inpaint只是SD功能金字塔里最底层但最刚需的一块。它在社交平台的自动修图工具、电商图批量处理、影楼后期、老照片修复服务里都有直接应用。相比文生图的“不确定性”,inpaint本质是一个“受控生成”任务,商业落地的稳定性要好得多。
比如很多电商店主需要把一张商品图的背景换掉、把摄影棚里的支架抹掉,这类需求用inpaint只要几分钟就能处理完。而做老照片修复的独立开发者,甚至可以基于SD的inpaint工作流出成品工具,配合fal.ai或replicate的API做成线上SaaS。这也是AIGC从业者一个比较现实且低门槛的收入方向。
如果你在考虑往AIGC方向深入学习,inpaint很适合作为第一个精通的技能点。它能让你同时理解扩散机制、模型条件控制、后处理流程,而且试错成本低,每天修几张图就能积累出对参数的直觉。之后再延伸到ControlNet、LoRA训练、ComfyUI工作流开发,会顺很多。
5.4 关于SD生态工具的个人推荐
最后分享几个我目前常用的工具组合,供参考:
- 日常体验与修图:SD WebUI(秋叶整合包),适合快速上手、涂抹式操作
- 批量与精细流程:ComfyUI,工作流可以保存复用,适合稳定产出
- 模型来源:Civitai(社区模型丰富)、HuggingFace(官方权重)
- 辅助工具:Photoshop做复杂mask、Topaz Gigapixel做高清放大、Lightroom做色彩校正
这些工具配合起来,能打通“修复→放大→调色→交付”的完整链路,实际商用完全够用。
6. 写在最后的经验心得
修图画这个事,做得越久越会发现:参数是死的,思路是活的。同一张图,让三个人修,可能补出来的内容完全不一样,因为提示词的选择、mask的范围、denoising的判断都带有很强的个人倾向。我建议新手不要急着追求一次成型,把每次修复都当成一次实验,记录下参数与结果的关系。修个几十张图之后,你看到一张待修复图,基本就能猜到该用多少denoising、mask blur给多大,不会再依赖试错。
我自己最深刻的体会是:修复图的成败,三成靠模型和参数,七成靠观察力。你得先看懂原图的光影方向、色彩规律、透视关系,才能写出真正能引导模型的提示词。很多“翻车”其实不是因为AI不行,而是你没告诉AI这个位置该长什么样。
如果你第一次上手就用inpaint修了张图出来,哪怕效果一般,也恭喜你已经站在了理解SD的门槛上。接下来你可以去试试ControlNet、试试LoRA、试试自己写一套ComfyUI工作流。这条路走通之后,AIGC能带给你的创作自由度,要比单次修图大得多。