Z-Image Inpainting 工作流:遮罩编辑与物体替换完全指南
关键词:z-image inpainting mask workflow
目录
引言
Inpainting 基础原理
遮罩创建技术
Diffusers Inpainting Pipeline
ComfyUI 遮罩工作流
物体替换策略
多步 Inpainting 复杂编辑
边缘融合技术
质量保持技巧
实践案例
常见问题与解决
引言
Inpainting(图像修复/填充)是 AI 图像编辑中最常用的技术之一。与 Outpainting(向外扩展画布,见 ZI-015)和通用编辑工作流(见 ZI-038)不同,Inpainting 专注于在已有图像的指定区域内生成新内容,同时保持周围区域的完整性。
本文深入讲解 Z-Image 的 Inpainting 能力,涵盖从遮罩创建到高级工作流的完整技术栈。
Inpainting 基础原理
技术原理
Z-Image 的 Inpainting 基于扩散模型的条件生成机制:
遮罩编码:输入图像的遮罩区域被编码为噪声,非遮罩区域保留原始像素
条件注入:原始图像(含遮罩信息)作为条件输入到 DiT 架构中
提示词引导:文本提示词指导遮罩区域的内容生成
迭代去噪:通过采样过程逐步去噪,生成与周围内容协调的新内容
Inpainting vs Outpainting vs General Edit
对比项
Inpainting
Outpainting (ZI-015)
General Edit (ZI-038)
操作区域
图像内部遮罩区域
图像外部扩展区域
全图或部分区域
遮罩必要性
必需
可选
可选
主要用途
物体替换/移除
画布扩展
风格变化/细节调整
内容约束
周围区域约束强
边缘区域约束
提示词约束为主
边缘处理
需要精细融合
需要自然过渡
视需求而定
遮罩创建技术
方法 1:手动绘制遮罩
最简单直接的遮罩创建方式。
import numpy as np
from PIL import Image, ImageDraw
# 创建遮罩
mask = Image.new('L', (1024, 1024), 0) # 黑色背景
draw = ImageDraw.Draw(mask)
# 绘制遮罩区域(白色 = 需要 inpaint 的区域)
# 椭圆遮罩
draw.ellipse([200, 150, 400, 500], fill=255)
# 矩形遮罩
draw.rectangle([500, 100, 900, 600], fill=255)
# 多边形遮罩
draw.polygon([(100, 100), (500, 50), (600, 400), (200, 500)], fill=255)
适用场景:规则形状物体、简单几何区域
优点:精确控制、无额外依赖
缺点:耗时、不规则物体困难
方法 2:AI 自动分割
利用 SAM(Segment Anything Model)或其他分割模型自动创建遮罩。
from segment_anything import sam_model_registry, SamPredictor
import torch
# 加载 SAM 模型
sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")
sam.to(device="cuda")
predictor = SamPredictor(sam)
# 设置输入图像
predictor.set_image(np.array(image))
# 点提示自动分割
input_points = np.array([[350, 300]]) # x, y
input_labels = np.array([1]) # 1 = 前景
masks, scores, logits = predictor.predict(
point_coords=input_points,
point_labels=input_labels,
multimask_output=True
)
# 选择最高分遮罩
best_mask = masks[np.argmax(scores)]
适用场景:不规则物体、复杂形状
优点:精确轮廓、速度快
缺点:需要额外模型加载
方法 3:ComfyUI 遮罩节点
ComfyUI 内置多种遮罩创建节点:
Image → SAMDetectorSEGS → SAMConvertMaskToImage → 遮罩输出
↓
Bounding Box / Point Prompt → 精确遮罩
ComfyUI 中的常用遮罩节点:
Create Masks from Image:基于颜色/亮度创建遮罩
SAMDetectorSEGS:使用 SAM 进行实例分割
Merge Masks:合并多个遮罩
Invert Mask:反转遮罩
Mask Blur:遮罩边缘模糊(用于融合)
Grow Mask:遮罩扩展/收缩
方法 4:语义分割遮罩
使用预训练语义分割模型创建语义级遮罩:
from transformers import AutoImageProcessor, AutoModelForSemanticSegmentation
processor = AutoImageProcessor.from_pretrained("nvidia/segformer-b0-finetuned-ade-512-512")
model = AutoModelForSemanticSegmentation.from_pretrained("nvidia/segformer-b0-finetuned-ade-512-512")
inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)
# 提取特定类别(如"person"、"car")的遮罩
适用场景:按语义类别批量创建遮罩
优点:批量处理、语义理解
缺点:类别有限制
Diffusers Inpainting Pipeline
ZImageInpaintPipeline 使用
Z-Image 在 diffusers 库中提供了专门的 Inpainting Pipeline:
from diffusers import ZImageInpaintPipeline
import torch
# 加载 Inpainting Pipeline
pipe = ZImageInpaintPipeline.from_pretrained(
"Tongyi-ZImage/Z-Image-Turbo",
torch_dtype=torch.float16
)
pipe = pipe.to("cuda")
# 准备输入
image = image.convert("RGB").resize((1024, 1024))
mask = mask.convert("L").resize((1024, 1024))
# Inpainting
result = pipe(
prompt="a modern sports car in the parking spot",
image=image,
mask_image=mask,
strength=1.0, # Inpainting 固定为 1.0
guidance_scale=7.5, # CFG 引导强度
num_inference_steps=28, # 推理步数
width=1024,
height=1024
).images[0]
关键参数说明
参数
默认值
说明
strength
1.0
Inpainting 中固定为 1.0(遮罩区域完全重新生成)
guidance_scale
7.5
提示词引导强度,范围 3.0-12.0
num_inference_steps
28
采样步数,20-50 推荐
mask_blur
4
遮罩边缘模糊程度,影响融合效果
strength_schedule
"linear"
强度调度方式
mask_blur 参数详解
mask_blur 控制遮罩边缘的模糊程度,直接影响融合质量:
mask_blur=0:锐利边缘,可能产生明显接缝
mask_blur=2-4:轻度模糊,适合物体替换
mask_blur=6-10:中度模糊,适合背景修改
mask_blur>10:强模糊,适合大面积修复
ComfyUI 遮罩工作流
基础 Inpainting 工作流
┌─────────────┐
│ Load Image │──── 图像 ───┐
└─────────────┘ │
↓
┌─────────────┐ ┌──────────────┐
│ Create Mask │────→→ │ KSampler │──── 生成结果
└─────────────┘ │ (inpaint) │
└──────────────┘
↑
┌─────────────┐ │
│ Load Model │──── 模型 ───┘
└─────────────┘
┌─────────────┐
│ Text Prompt │──── 提示词 ──→ (KSampler)
└─────────────┘
ComfyUI JSON 工作流示例
{
"4": {
"class_type": "VAELoader",
"inputs": {
"vae_name": "zimage_vae.safetensors"
}
},
"6": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "z-image-turbo.safetensors"
}
},
"8": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "a vintage leather sofa, warm lighting, photorealistic",
"clip": ["6", 1]
}
},
"10": {
"class_type": "LoadImage",
"inputs": {
"image": "living_room.jpg",
"upload": "image"
}
},
"12": {
"class_type": "CreateMaskFromImage",
"inputs": {
"image": ["10", 1],
"channel": "alpha"
}
},
"14": {
"class_type": "InpaintModelConditioning",
"inputs": {
"positive": ["8", 0],
"negative": ["8", 1],
"vae": ["4", 0],
"pixels": ["10", 0],
"mask": ["12", 0]
}
},
"16": {
"class_type": "KSampler",
"inputs": {
"model": ["6", 0],
"positive": ["14", 0],
"negative": ["14", 1],
"latent": ["14", 2],
"seed": 42,
"steps": 28,
"cfg": 7.5,
"sampler_name": "euler_ancestral",
"scheduler": "normal",
"denoise": 1.0
}
},
"18": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["16", 0],
"vae": ["4", 0]
}
},
"20": {
"class_type": "SaveImage",
"inputs": {
"images": ["18", 0]
}
}
}
高级工作流:带 ControlNet 的 Inpainting
原始图像 + 遮罩 → InpaintModelConditioning
↓
KSampler(带 ControlNet)
↓
ControlNet(Depth / Canny)
↓
VAE Decode → 结果
物体替换策略
策略 1:精确替换
适用于替换图像中的特定物体:
使用 SAM 或手动创建精确遮罩
提示词描述新物体的详细特征
使用中等 guidance_scale(7-9)
遮罩边缘轻微模糊(mask_blur=3-5)
提示词模板:
原:a person sitting on a chair
遮罩:椅子区域
新提示词:a vintage wooden rocking chair with brass accents, warm oak finish
策略 2:上下文感知替换
考虑周围环境进行智能替换:
创建稍大的遮罩(包含部分上下文)
提示词描述整体场景而非单一物体
降低 guidance_scale(5-7)增加灵活性
使用较大的 mask_blur(6-8)
策略 3:多物体替换
同时替换多个不连续区域:
分别创建多个遮罩
合并遮罩(ComfyUI Merge Masks 节点)
提示词包含所有新物体描述
可能需要多步生成
# 合并多个遮罩
mask1 = create_mask_for_object(image, "person")
mask2 = create_mask_for_object(image, "car")
combined_mask = (mask1 | mask2).astype(np.uint8) * 255
多步 Inpainting 复杂编辑
分步处理策略
对于复杂编辑,单次 Inpainting 往往不够,需要多步处理:
步骤 1:移除不需要的物体
遮罩 → 提示词 "empty space matching surroundings"
↓
步骤 2:添加新内容
遮罩 → 提示词 "detailed new content description"
↓
步骤 3:细节优化
小遮罩 → 提示词 "refined details, high quality"
ComfyUI 多步工作流
原始图像
↓
[Inpaint Step 1: Object Removal]
↓ 中间结果
[Inpaint Step 2: Content Addition]
↓ 中间结果
[Inpaint Step 3: Detail Refinement]
↓
最终输出
迭代优化技巧
从大到小:先处理大区域,再逐步缩小遮罩范围
降低步数:后续步骤可减少推理步数(28→20→15)
增加模糊:后续步骤增加 mask_blur 以改善融合
一致性检查:每步检查颜色、光影、透视的一致性
边缘融合技术
技术 1:遮罩羽化
在遮罩边缘添加渐变过渡区:
import cv2
def feather_mask(mask, blur_radius=8):
"""遮罩羽化处理"""
blurred = cv2.GaussianBlur(mask, (0, 0), blur_radius)
return blurred
技术 2:边缘感知融合
使用 Poisson 融合或 alpha 融合:
import cv2
def poisson_blend(base_image, inpaint_result, mask, center_point):
"""Poisson 融合"""
blended = cv2.seamlessClone(
inpaint_result, base_image, mask, center_point,
cv2.NORMAL_CLONE
)
return blended
技术 3:ComfyUI 融合节点
Inpaint Result + Original Image → ImageBlend / ImageCompositeMasked
↓
Final Result
融合参数调优指南
编辑类型
mask_blur
融合方法
建议
物体移除
4-6
Alpha 融合
保留周围纹理
物体替换
3-5
Poisson 融合
保持边缘锐利
背景修改
6-10
渐变融合
自然过渡
文字添加
1-2
直接叠加
清晰边缘
质量保持技巧
1. 分辨率匹配
# 确保遮罩分辨率与图像一致
mask = mask.resize(image.size, Image.NEAREST) # 使用 NEAREST 避免模糊
2. 色彩一致性
Inpainting 后可能出现色彩偏差,使用以下方法校正:
from color_transfer import apply_transfer
# 从原始图像提取色彩分布
base_colors = extract_color_stats(original_image, around_mask_region)
# 将色彩分布转移到 inpaint 结果
result = apply_transfer(result_image, base_colors)
3. 避免内容重复
Z-Image Inpainting 有时会在遮罩边缘产生重复纹理,解决方法:
增加 mask_blur 值
在提示词中添加 "unique texture, no repeating patterns"
使用较高的 guidance_scale
4. 保持光影一致性
提示词中描述光源方向和颜色
参考原始图像的光照方向
使用 "matching lighting, consistent shadows" 等提示词
5. 透视一致性
确保新物体透视角度与原始场景匹配
对于建筑场景,使用 ControlNet Depth 辅助
实践案例
案例 1:物体移除
场景:从照片中移除不需要的路人
步骤:
1. 使用 SAM 标记路人区域
2. 轻微扩展遮罩(Grow Mask +5 像素)
3. 提示词:"clean background, matching surroundings, no people"
4. guidance_scale=7.5, steps=28, mask_blur=6
提示词:
Clean, empty street scene matching the surrounding environment,
photorealistic, high quality
案例 2:服装更换
场景:替换人物服装
步骤:
1. 精确分割服装区域(SAM + 手动调整)
2. 遮罩覆盖服装及少量身体区域
3. 提示词描述新服装
4. guidance_scale=9.0, steps=32, mask_blur=4
提示词:
wearing a red tailored suit with a white shirt,
professional photography, natural pose, matching lighting
案例 3:背景替换
场景:将室内场景替换为户外场景
步骤:
1. 分割前景人物(保留)
2. 遮罩覆盖整个背景
3. 提示词描述新背景
4. guidance_scale=6.5, steps=28, mask_blur=10
提示词:
beautiful tropical beach background, crystal clear ocean,
palm trees, golden sunset, cinematic lighting
案例 4:文字添加
场景:在产品照片中添加品牌标识
步骤:
1. 精确遮罩标识区域
2. 提示词描述文字内容和样式
3. guidance_scale=10.0, steps=30, mask_blur=1
提示词:
brand logo in clean sans-serif font, white text,
professional design, minimal style
常见问题与解决
问题 1:边缘出现明显接缝
原因:mask_blur 值过小或遮罩边缘过于锐利
解决:
增加 mask_blur 到 6-10
使用 Poisson 融合后处理
遮罩边缘添加渐变
问题 2:生成内容与周围不协调
原因:提示词缺少上下文描述
解决:
提示词中描述周围环境
降低 guidance_scale 增加灵活性
使用多步 Inpainting 逐步调整
问题 3:文字渲染不清晰
原因:Inpainting 区域过小或模型对文字生成不擅长
解决:
增大遮罩区域
使用专门的文字生成模型后处理
降低 mask_blur 到 0-2
问题 4:重复纹理/图案
原因:模型在遮罩区域过度平滑
解决:
提示词中添加 "detailed texture, varied pattern"
增加 guidance_scale
使用 ControlNet Texture 辅助
问题 5:色彩不一致
原因:Inpaint 区域色彩分布与原始图像不匹配
解决:
提示词中描述颜色
使用色彩转移后处理
在遮罩外保留足够的参考区域
总结
Z-Image 的 Inpainting 能力在开源模型中表现突出,配合 ComfyUI 的灵活工作流,可以实现从简单物体移除到复杂场景编辑的完整需求。关键成功因素包括:
精确遮罩:使用 SAM 或语义分割创建准确遮罩
合理参数:根据编辑类型调整 mask_blur 和 guidance_scale
多步处理:复杂编辑采用分步策略
融合技巧:边缘融合决定最终效果质量
上下文感知:提示词包含场景描述以确保一致性
与 Outpainting(ZI-015)相比,Inpainting 更强调遮罩精度和边缘融合;与通用编辑工作流(ZI-038)相比,Inpainting 提供更精确的局部控制。