Chapter 08

图生图 · Inpaint / Outpaint / Hi-Res

纯文生图只是热身——工业级 AI 生图 90% 的时间在"改图":把一张照片风格化、修局部瑕疵、把方图扩成横图、把 1024 放大到 4K。这章讲四种"图变图"任务的原理与 ComfyUI 工作流。

一、四种任务的差异

img2img(图生图)
输入一张图 + prompt,让模型按新 prompt 重绘——保留构图,换画风/换材质/加细节。用 denoise 控制改多少。
Inpaint(局部重绘)
输入图 + mask(遮罩),只重绘 mask 区域。消除物体、换表情、改衣服、修六指。
Outpaint(扩图)
输入图 + 周围 padding + mask,让模型在原图周围"延伸画布"。方图变横图,局部 crop 复原场景。
Upscale(放大/高分修复)
把 1024 图放大到 2048/4096,同时加细节——Hi-Res Fix 和 Ultimate SD Upscale 是两大主流方案。

二、img2img:denoise 的精确语义

第 4 章讲过 denoise,这里再补一个数学细节:denoise 决定"起点有多少噪声"。

文生图:起点 = 100% 纯噪声,走 30 步到成品 ┌──────────────────────────────┐ │████████████████ ─▶ 图像│ └──────────────────────────────┘ 100% 0% img2img denoise=0.5:起点 = 原图加 50% 噪声,走 15 步(= 30×0.5) ┌───────┬──────────────────────┐ │███████│ 原图像素内容 │ ─▶ 改了 50% 的图 └───────┴──────────────────────┘ 50% 50%(原内容) img2img denoise=0.2:起点 = 原图加 20% 噪声,走 6 步 ┌──┬──────────────────────────┐ │██│ 原图像素内容 │ ─▶ 几乎等于原图,微调细节 └──┴──────────────────────────┘ 20% 80%

所以:denoise 越低 → 原图保留越多 → 实际采样步数也越少。这是"改得少 = 跑得快"的物理原因。

三、ComfyUI 的 img2img 工作流

Load Image ──▶ VAE Encode ──▶ LATENT(来源:原图) │ ▼ Load Checkpoint ──▶ KSampler(denoise=0.6,其他参数同文生图) ▲ │ CLIP Text Encode 正向/负向 ──────┘ │ ▼ VAE Decode ──▶ Save Image

和文生图唯一的差别:LATENT 不是 Empty Latent Image,而是从 VAE Encode(原图)

denoise 对应不同场景的经验值
0.2-0.3:Hi-Res Fix 第二阶段、轻度美化;0.4-0.55:换风格但保构图;0.6-0.75:大改画风、换材质;0.8-0.95:基本重画,仅保留颜色和构图大致位置;1.0 = 文生图。

四、Inpaint(局部重绘)

Inpaint = "告诉模型只改这一块"。它需要两个额外输入:mask(黑白图,白色 = 要改的区域)和可选的 Inpaint 专用模型

1. 工作流骨架

Load Image(原图) ──┐ ├─▶ VAE Encode (for Inpaint) ──▶ LATENT Load Image(mask) ───┘ └─ 注入 mask 信息 │ ▼ Load Checkpoint ──▶ KSampler ──▶ VAE Decode ──▶ 结果 │ denoise=0.8-1.0 (Inpaint 要大改)

关键节点:VAE Encode (for Inpaint)——它把原图 + mask 一起编码,告诉 latent "这些区域要重生成"。

2. 两种 mask 来源

MaskEditor 手绘
Load Image 节点上右键 → Open in MaskEditor,用画笔刷出要改的区域。适合少量手动精细修改(擦消某物/改表情)。
自动语义分割
ComfyUI-Impact-PackComfyUI-segment-anything-2:用自然语言指定要改的对象("hair", "face", "shirt"),自动生成 mask。批量换装/换发色神器。

3. 普通 Checkpoint vs Inpaint 专用 Checkpoint

模型类型文件特征效果
普通 Checkpoint + Inpaint常规 SDXL 模型能跑,但边缘融合一般,denoise 0.7+ 时边界可能"突兀"
Inpaint 专用 Checkpoint文件名含 inpaint训练时就教过"补洞",边界自然,mask 边缘过渡柔和
Differential DiffusionComfyUI 节点技术不用专门模型,用"差分去噪"让边缘更自然(下一节)

4. Differential Diffusion(2024 新姿势)

传统 Inpaint 的问题:mask 内完全重画,mask 外完全不动——边缘硬切。Differential Diffusion 的思路:按 mask 的灰度值分层 denoise,白区 100% 重画,灰区 50%,黑区 0%,自然过渡。

工作流:
Load Image ──▶ VAE Encode ──▶ LATENT
                                  │
                                  ▼
Load Checkpoint ──▶ DifferentialDiffusion(节点) ──▶ MODEL'
                                  │
                                  ▼
带 mask 的 latent ──▶ KSampler(denoise=1.0)──▶ 结果

效果:即使换了衣服,领口和身体过渡自然,不像传统 Inpaint 那样"贴"上去

5. 经典场景

五、Outpaint(扩图)

原理和 Inpaint 一样——只不过 mask 是"原图周围的 padding"。ComfyUI 有专门节点 Pad Image for Outpainting:

1. Load Image(原图 1024×1024)
2. Pad Image for Outpainting:
   left=0, top=0, right=512, bottom=0, feathering=40
   输出:1536×1024 的图(右边 512 是纯色)+ mask(右 512 白,左 1024 黑)
3. VAE Encode (for Inpaint)
4. KSampler(denoise=1.0)——让模型填那块 padding
5. prompt 写要延伸的内容:"extended landscape, mountains, wider view"

feathering(羽化)参数让边界渐变——设 40 表示边界 40 像素渐变,避免"生硬拼接感"。

Outpaint 的"无中生有"陷阱
模型会根据原图猜延伸内容——人像右侧 padding 可能生成一个诡异的第二个人。用 prompt 明确指定延伸内容(如 "solid wall background"),或者一次只扩一个方向,比一次扩四周更稳。

六、Hi-Res Fix:两阶段放大主流方案

为什么要 Hi-Res Fix?SDXL 原生 1024,直接出 2048 会构图崩坏("双头人"常见)。分两阶段:先 1024 出图,再放大到 2048 低 denoise 润色

完整工作流

阶段 1:1024 出图 Empty Latent (1024×1024) ──▶ KSampler #1 ──▶ LATENT_1K steps=25 denoise=1.0 cfg=6 阶段 2:latent 放大 + 低 denoise 二次采样 LATENT_1K ──▶ Upscale Latent By(×1.5,1024→1536) ↓ 或 VAE Decode ──▶ Upscale Image By(×2,ESRGAN) ──▶ VAE Encode ──▶ LATENT_2K │ ▼ KSampler #2 steps=15 denoise=0.4-0.55 同 sampler/scheduler/cfg │ ▼ VAE Decode ──▶ 2K 成品

两种放大路线对比

路线放大器优点缺点
Latent 放大Upscale Latent By快、显存省质量一般,纯线性插值
像素放大 + 回 latentESRGAN / 4x-UltraSharp / RealESRGAN-x4plus细节更丰富多一步 VAE 编解码,慢
ESRGAN 模型的选择
放到 ComfyUI/models/upscale_models/。主流:
· 4x-UltraSharp:照片/现实风首选,锐利
· 4x-AnimeSharp / 4x-RealESRGAN-Anime:动漫专用,避免把线条放大成锯齿
· RealESRGAN_x4plus:通用平衡
· 4x_foolhardy_Remacri:平衡细节与真实感,后期润色常用
节点:Upscale Image (using Model)

denoise 的选择

第二阶段的 denoise 是 Hi-Res Fix 的灵魂参数:

七、Ultimate SD Upscale(超高分辨率神器)

Hi-Res Fix 放大到 2-3 倍没问题,想放大到 4K/8K?Ultimate SD Upscale——把大图切成多个 tile,每个 tile 单独跑 img2img,最后拼回去。

原理

4K 图(4096×4096)切成 4×4 = 16 个 1024 tile ┌──┬──┬──┬──┐ │ 1│ 2│ 3│ 4│ ├──┼──┼──┼──┤ │ 5│ 6│ 7│ 8│ 每个 tile 单独喂 KSampler ├──┼──┼──┼──┤ denoise=0.3,prompt 相同 │ 9│10│11│12│ tile 之间重叠 128px 避免接缝 ├──┼──┼──┼──┤ │13│14│15│16│ └──┴──┴──┴──┘

安装与节点

Manager 装 ComfyUI_UltimateSDUpscale,节点叫 Ultimate SD Upscale:

输入:
  image:        原图
  model, positive, negative: 正常的模型和 prompt
  upscale_model:       ESRGAN 模型(先放大 4×)
  tile_width / tile_height: 1024(SDXL) 或 768(SD1.5)
  mask_blur:   16(接缝羽化)
  tile_padding: 32
  seam_fix_mode: "Half Tile Offset Pass"(消接缝秘技)
  denoise:     0.25-0.35(非常低)
  steps:       18-25

关键:配合 ControlNet Tile

Ultimate SD Upscale 最佳拍档是 ControlNet Tile(第 7 章场景 5 的"未完待续"在这)——每个 tile 跑 img2img 时,用 CN Tile 确保生成内容严格贴合原 tile 结构,避免某个 tile "自由发挥"出错误的物体。

完整配方:
Load Image(1K 原图)
  ──▶ Upscale Image By(ESRGAN 4×,得到 4K 低质图)
  ──▶ Ultimate SD Upscale
        │ model = Juggernaut XL
        │ positive = 原 prompt + "ultra detailed, 8k"
        │ 带 ControlNet Tile(strength=0.7)
        │ denoise = 0.3
        ──▶ 4K 精细成品
Ultimate SD Upscale 常见错误
① denoise 设太高(> 0.5):每个 tile 会"自由创作",可能在墙上画出眼睛、在天空加不存在的飞机。
② 不配 CN Tile:某些 tile 里"一半人脸 + 一半背景",模型只看局部容易把背景也识别成人脸。
③ tile 太小(512):接缝变多,拼合痕迹明显。SDXL 用 1024 tile。

八、Face Detailer:人脸专修神器

大图里人脸经常模糊——因为脸只占整图小比例,分辨率不够。FaceDetailer(在 ComfyUI-Impact-Pack 里)自动检测人脸,裁下来放大到 512-1024 单独 img2img,再贴回去。

原图(人脸只占 128×128) │ ├─▶ BBOX Detector(检测人脸) │ └─▶ 裁出 512×512 │ └─▶ KSampler(denoise=0.4, prompt="detailed face, eyes, ...") │ └─▶ 精细化的脸 │ │ └────────── 缝合 ───────┘ │ ▼ 原图(人脸精细化)

配合:ADetailer(WebUI 生态移植)、Face Fix,效果类似。商用人像出图基本都要过这一步

九、Flux Fill:Flux 原生的 Inpaint

Flux 的 Inpaint 玩法和 SDXL 略不同,BFL 专门发布了 Flux.1 Fill dev 模型——原生支持 Inpaint/Outpaint,质量比用普通 Flux + mask 高。

ComfyUI/models/unet/flux1-fill-dev.safetensors  (~12GB)

工作流(区别):
Load Diffusion Model(flux1-fill-dev)
  ├─▶ InpaintModelConditioning(带原图+mask 的条件)
  │     ├─ positive / negative
  │     ├─ pixels(原图)
  │     ├─ mask
  ──▶ KSampler
       cfg=1, FluxGuidance=30(Fill 专用高 guidance)
       steps=25-30

十、一个实战长工作流:商品图 4K 精修

需求:1024 的产品初稿 → 精修人脸/产品细节 → 放大到 4K 用于广告。

第 1 步:文生图(第 2-5 章讲过) KSampler #1 → 1024×1024 初稿 第 2 步:Face Detailer(如果有人) BBox Detector → 裁脸 → KSampler #2(denoise=0.4) → 贴回 第 3 步:Inpaint 修饰(如需) 人工选瑕疵 → VAE Encode for Inpaint → KSampler #3(denoise=0.8) (可选)Differential Diffusion 让边缘自然 第 4 步:Hi-Res Fix 到 2K ESRGAN 2× → VAE Encode → KSampler #4(denoise=0.45, steps=15) → 2048×2048 第 5 步:Ultimate SD Upscale 到 4K ESRGAN 2× → 切 tile → 每 tile KSampler(denoise=0.3) + ControlNet Tile(strength=0.7) → 4096×4096 最终成品 总耗时:~ 90-120s(RTX 4090,SDXL) 总 VRAM 峰值:~ 14GB

十一、反模式

  1. img2img denoise 1.0 + 轻微风格描述:等于文生图,原图白传。
  2. Inpaint denoise < 0.5:mask 区域改不动,只模糊化。Inpaint 大多要 0.8+。
  3. Outpaint 一次扩四周:模型难以同时合理补上下左右四个方向。一次扩一向。
  4. Hi-Res Fix 第二阶段 denoise=1.0:等于 2K 文生图,"双头人"概率回升。
  5. Ultimate Upscale 不配 CN Tile:tile 间"脑补"冲突,物体破碎。
  6. 放大后再 Face Detailer:4K 图的人脸还是"放大了的模糊",顺序要反:1K 先 Face Detailer 再放大。
  7. ESRGAN 模型放错目录:models/upscale_models/,不是 models/checkpoints/
  8. Inpaint 忘了 feathering:Outpaint/Inpaint 边缘"刀切"痕迹,用户一眼识破 AI。
  9. 4K 整图跑 img2img:一般 VAE 会 OOM,且模型没训练过 4K 原生,质量反而差。必须用 tile 方案。

十二、本章小结

记住:
① 四种"图变图"任务:img2img 整体重绘、Inpaint 局部、Outpaint 扩画、Upscale 放大——核心区别是"改多少"和"改哪里"。
② Inpaint 的灵魂是 VAE Encode (for Inpaint) + mask,denoise 一般 0.8-1.0。Differential Diffusion 和 Inpaint 专用模型让边缘更自然。
③ Hi-Res Fix 是"1024 出图 → 1.5-2× 放大 → 低 denoise 二次采样"标准两阶段流程,denoise 0.45-0.55 是甜点。
④ Ultimate SD Upscale + ControlNet Tile 是 4K/8K 出图工业标准。tile 1024、denoise 0.3、seam fix 必开。
⑤ FaceDetailer 是商用人像最后一道工序,把脸单独拎出来精修再贴回去。