Z-Image Inpainting 工作流:遮罩编辑与物体替换完全指南

Z-Image Inpainting 工作流:遮罩编辑与物体替换完全指南

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 提供更精确的局部控制。

💎 相关推荐

蜜源APP推出全新版本,优惠权益再升级
365bet体育在线注册

蜜源APP推出全新版本,优惠权益再升级

📅 10-19 👁️ 8318
歇后语为时已晚的上一句是什么
英国365bet日博

歇后语为时已晚的上一句是什么

📅 08-10 👁️ 4982
想问下小红帽的皮肤有几率复刻么之前没拿到
365app安卓客户端下载

想问下小红帽的皮肤有几率复刻么之前没拿到

📅 09-16 👁️ 4512