如何用两个节点让ComfyUI图像修复提速10倍:InpaintCrop与InpaintStitch源码解析
如何用两个节点让ComfyUI图像修复提速10倍:InpaintCrop与InpaintStitch源码解析
【免费下载链接】ComfyUI-Inpaint-CropAndStitchComfyUI nodes to crop before sampling and stitch back after sampling that speed up inpainting项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Inpaint-CropAndStitch
修一张4K大图,把整张图喂给采样器,一次出图等上3分钟并不夸张;而这只为了抹掉照片角落里的一根电线。ComfyUI图像修复插件 ComfyUI-Inpaint-CropAndStitch 的解法很直接:先裁剪、再采样、最后拼接——只让掩码圈出的局部区域通过模型,修完再无缝贴回去。本文拆解其核心节点 InpaintCropImproved 与 InpaintStitchImproved 的工作原理,看它是如何让修复提速一个量级的。
全景俯视图:一张图看懂"局部修复"全链路
从输入到输出,数据只走一条流水线:
原图 + 掩码 → 掩码预处理 → 圈定上下文区域 → 智能裁剪 + 缩放 → 局部采样修复 → 缩放回原尺寸 → 掩码混合拼接 → 输出成品
关键差异在于:未掩码的部分从头到尾不经过 VAE 编解码,也就不会被模型"二次创作",保真度天然更高。裁剪节点除了输出局部图,还会附带一个装满元数据的STITCHER对象——它记录了画布在哪、修复图该贴到哪、原始图又该从哪裁回。拼接节点拿到它,就能完成一次精准的"物归原位"。
图1:官方高分辨率修复工作流,可见裁剪→采样→放大→拼接的完整链路
看清了整体轮廓,现在把镜头拉近,看看一次点击背后究竟发生了什么。
一次任务的完整旅程:掩码进入后的六步流水线
第一步:掩码"体检"与预处理
掩码就像修图软件里的套索选区,但它往往不干净:有孔洞、边缘太硬、甚至带着半透明的灰。裁剪节点按固定顺序打理它——填孔(把被完全包围的区域也纳入掩码)、按像素膨胀、可选反转、高斯模糊(让后续拼接边缘柔和)、高通滤波(忽略低于阈值的"假掩码",避免用户在不知情时把浅灰当成白色)。
第二步:圈定上下文区域
模型修复局部时也需要"上下文"来判断画什么。节点先算出掩码的外接矩形,再用context_from_mask_extend_factor把它向外扩一圈(默认1.2倍),最后与可选的optional_context_mask取并集。这一步决定了"模型能看到多少周围环境",是画质的关键。
第三步:裁剪 + 对齐目标分辨率
拿到上下文区域后,crop_magic_im开始施展"魔法":把区域拉伸到目标宽高比、处理越界、必要时用边缘像素延伸画布(外画修复),最后缩放到模型期望的分辨率,比如 SD1.5 的 512×512、SDXL 或 Flux 的 1024×1024。
第四步:局部采样
此时模型处理的只是一小块图。计算量随像素数非线性增长,处理十分之一区域往往能省下几倍甚至十几倍的时间——这就是提速的根源。
第五步:缩放回原尺寸
修复图在拼接前要先缩放回裁剪时的原始尺寸,缩放方向不同会自动选用放大或缩小算法(默认 bicubic / bilinear),避免画质损失。
第六步:掩码加权混合回填
拼接节点把修复图按模糊后的掩码做alpha 混合贴回画布,再裁出原始图像区域。掩码边缘是渐变的,所以接缝处是"软过渡",肉眼几乎看不出修补痕迹。
放大镜:两个值得细品的巧思
InpaintCrop裁剪原理:给相框配照片的宽高比魔法
把上下文区域塞进目标分辨率时,最粗暴的做法是直接拉伸——但那样画面会变形。源码的做法是先算目标宽高比,再把裁剪框扩到匹配的比例,相当于"照片不动,把相框扩到合适大小":
# 裁剪前先算"目标宽高比",避免把图拉变形 target_ratio = target_w / target_h # 模型期望的比例,如 512/512=1 context_ratio = w / h # 当前上下文区域的比例 if context_ratio < target_ratio: # 上下文"太矮",按目标比例把宽度撑到与高度匹配 new_w = int(h * target_ratio) new_x = x - (new_w - w) // 2 # 居中扩展,四周都留上下文 else: # 上下文"太宽",同理把高度补上去 new_h = int(w / target_ratio) new_y = y - (new_h - h) // 2扩完如果越出图像边界,就用图像边缘像素向外延伸(而不是镜像),既满足模型的填充倍数要求(output_padding默认32),也不会出现诡异的镜像纹理。拼接时STITCHER记录的三组坐标(原始图在画布中的位置、修复图在画布中的位置)保证了一切严丝合缝——旧版本曾有1像素错位,新版已彻底修复。
CPU与GPU模式切换:同一份菜谱的两个厨子
项目用策略模式抽象出ProcessorLogic基类,派生出 CPU 与 GPU 两个实现,对外暴露完全相同的接口。CPU 版本基于 PIL 和 SciPy(灰色膨胀、高斯滤波),兼容性最好;GPU 版本则用 PyTorch 原生算子重写了热点:
# GPU 上用最大池化近似形态学膨胀,比逐像素循环快一个量级 kernel = ceil(pixels / 4 * 1.5 + 1) | 1 # 膨胀核大小(强制奇数) dilated = max_pool2d(pad(mask, 'reflect'), kernel) # 反射填充防止边缘发黑高斯模糊也换成了卷积核实现。据官方说明,在处理瓶颈场景(如视频修复)下,GPU 模式比 CPU 模式快30~100倍。选择逻辑只发生在inpaint_crop开头几行,节点内部对用户完全透明。
实战组合拳:三种模型工作流配置
安装只需把仓库克隆到 ComfyUI 的custom_nodes目录:
git clone https://gitcode.com/gh_mirrors/co/ComfyUI-Inpaint-CropAndStitch然后用官方提供的示例工作流直接开跑:
- SD1.5 标准流程:
Load Image → Inpaint Crop → InpaintModelConditioning → KSampler → VAE Decode → Inpaint Stitch,配合"裁剪后放大到512×512再采样",玻璃瓶这类场景修复得又快又自然。 - Flux + ControlNet 流程:在 Flux 工作流中接入裁剪节点,配合 ControlNet Inpainting 条件控制,适合追求高质量细节的场景。
- 高分辨率修复流程:先小图采样,再用 4x 放大模型放大、做 hiRes 修复,最后拼回原图——这是"局部修复 + 超分"组合的典型用法。
图2:SD1.5 工作流与修复前后对比,掩码区域被水彩玻璃瓶自然填充
图3:Flux + 条件控制的修复工作流,体现了高质量细节恢复能力
取舍与调优:快与好的平衡艺术
- 上下文留多少?
context_from_mask_extend_factor越大,模型看到的环境越多、语义越准,但裁剪图也越大、采样越慢。从1.2起步,按效果逐步上调。 - 降采样防"双头"伪影:掩码区域过大时,先降采样再采样,可避免模型画出两个头、两个身体;修完拼回时自动放大,视觉无损失。
- 强制目标分辨率:开启
output_resize_to_target_size,让每种模型都工作在它最舒服的分辨率上(SD1.5 用512、SDXL/Flux 用1024)。 - CPU与GPU模式切换的最佳实践:默认 CPU 保证兼容;当节点成为瓶颈(如批量视频修复)时切到 GPU,输入需能装进显存,可换来30倍以上的吞吐。
- 掩码务必纯白:若修复后还能透出原图,多半是掩码带了灰阶——即使人眼看不出,也要确保边界是 255,255,255。
启发与延伸
这个插件的价值不止于"快":它把"在整图上采样"这件昂贵的全局操作,降维成了"局部采样 + 无损回填",同时让模型始终工作在理想分辨率下。沿着这个思路,还有三个方向值得自己动手探索:
- 把裁剪节点接到视频修复流程里,配合批量掩码,看看 GPU 模式能省下多少显存与时间;
- 用
optional_context_mask精确控制上下文区域,实验"模型该看什么、不该看什么"对画质的影响; - 在
crop_magic_im之后插入任意放大模型(不只是官方4x Ultrasharp),构建自己的超分修复管线。
裁剪之后你还会贴什么回去?欢迎在实践中给出你的答案。
【免费下载链接】ComfyUI-Inpaint-CropAndStitchComfyUI nodes to crop before sampling and stitch back after sampling that speed up inpainting项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Inpaint-CropAndStitch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
