Extensions/ComfyUI-UniversalRemove
ComfyUI Extension

ComfyUI-UniversalRemove

Self-contained ComfyUI remove core extension with region editing and mask processing for image inpainting. (Description by CC)

By fengwk·Created 2 months ago·Updated 2 months ago· 0
fengwk/ComfyUI-UniversalRemove
Nodes
On cloudLocal install
Stars0
Updated2 months ago
Readme

ComfyUI-UniversalRemove

一个自包含的 ComfyUI remove 核心扩展。

设计目标

  • 不硬编码任何本地路径
  • 不依赖其他自定义节点
  • 只使用 ComfyUI 常见核心类型:IMAGE / MASK / STRING / INT / FLOAT
  • 面向 图像批 / 视频帧批 工作,适合作为通用 remove 流程的中间层

当前提供的节点

0. UR Demo Image

生成一个无需外部图片文件的测试图像,主要用于示例工作流和安装验证。

1. UR Remove Prompt Builder

输入目标描述,输出三路提示词:

  • segmentation_prompt
  • remove_positive_prompt
  • remove_negative_prompt

用途:

  • segmentation_prompt 给任意文本选目标模块
  • remove_positive_prompt 给关键帧修复模型
  • remove_negative_prompt 给关键帧修复模型的负向提示

2. UR Region Editor

交互式前端 region 编辑器,输出标准 regions_json

支持:

  • 加载本地图片作为编辑背景
  • 加载本地视频作为编辑背景并拖动时间轴
  • 使用当前视频时间写入关键帧编号
  • 绘制矩形区域
  • 绘制圆形区域
  • 绘制多边形区域
  • 删除选中区域
  • 清空全部区域

注意:背景图片 / 视频只用于前端交互预览,不会写进 workflow。真正可移植、可复用的是输出的 regions_json

3. UR Boxes To Mask Batch

把 JSON 形式的矩形框转换成 MASK 批次。

支持:

  • xyxy
  • xywh
  • 归一化坐标
  • 三种广播模式:
    • repeat_to_batch
    • single_frame_only
    • hold_after_frame

用途:

  • 手工框选移除区域
  • 从外部工具导入 bbox

4. UR Regions To Mask Batch

把关键帧 region JSON 转换成整段图像批 / 视频帧批的 MASK

支持:

  • rect
  • circle
  • polygon
  • 单关键帧
  • 多关键帧
  • 四种广播模式:
    • repeat_to_batch
    • single_frame_only
    • hold_after_frame
    • hold_until_next_keyframe

用途:

  • 用 JSON 描述“关键帧上的圈选区域”
  • 为视频帧批生成对应 mask
  • 后续接 UR Mask Processor / UR Keyframe Prep / UR Soft Composite

5. UR Mask Processor

对 mask 做 remove 常用处理:

  • 扩张
  • 高斯羽化
  • 预览叠加

6. UR Keyframe Prep

从图像批中选出关键帧,并准备 remove 输入:

  • 选关键帧
  • 对应 mask 对齐
  • 按最长边缩放
  • pad 到指定倍数
  • 用填充色生成 filled_frame

其中 filled_frame 可以直接送进任意关键帧修复 / inpaint / edit 模型。

7. UR Soft Composite

一个不依赖 BrushNet 的软融合节点,用于把修复结果融合回原图 / 原视频帧批。

推荐工作流

这个扩展刻意只负责 remove 核心流程,不强绑某个检测器、分割器、视频模型或视频 IO 节点。

A. 手工框选 remove

Frames/Image Batch
  -> UR Region Editor
  -> UR Regions To Mask Batch
  -> UR Mask Processor
  -> UR Keyframe Prep
  -> 关键帧修复模型
  -> (可选) 视频传播模型
  -> UR Soft Composite
  -> Output

B. 提示词驱动 remove

Frames/Image Batch
  -> UR Remove Prompt Builder
  -> 任意文本选目标模块(输出 MASK)
  -> UR Mask Processor
  -> UR Keyframe Prep
  -> 关键帧修复模型
  -> (可选) 视频传播模型
  -> UR Soft Composite
  -> Output

为什么没有内置“文本直接找目标”

这是刻意的设计边界:

  • remove 核心流程应该通用、可复用
  • 文本找目标属于检测 / 分割 / 跟踪能力
  • 这部分通常意味着额外模型、额外权重、额外依赖

因此当前版本先把 remove 主流程做成稳定、自包含、无外部节点硬依赖的核心层。

如果后续要继续扩展,最自然的下一步是在这个扩展内部新增:

  • UR Prompt Mask Locator
  • UR Video Track Mask
  • UR Model Bundle

但这些应当作为后续迭代,而不是在 V1 就把依赖链做死。

安装方式

把整个目录放进:

  • ComfyUI/custom_nodes/ComfyUI-UniversalRemove

然后重启 ComfyUI。

示例工作流

当前已提供一个可直接导入的最小工作流:

  • example_workflows/Universal Remove - Interactive Region Editor.json

这个 workflow 的特点:

  • 只依赖 ComfyUI core + 本扩展
  • 可直接导入并运行,不需要额外图片文件
  • 可用 UR Region Editor 交互绘制 regions_json
  • 也可以手工编辑 regions_json
  • 可预览:
    • mask preview
    • filled keyframe
    • soft composite result

这个示例是 remove 核心流程示例,不内置外部检测模型或修复模型,因此更适合作为:

  • remove 管线起点
  • 接入你自己的 inpaint / edit / video propagation 模型前的可运行 scaffold

测试

仓库内已提供基础单元测试:

  • tests/test_universal_remove.py

运行方式:

uv pip install --python /path/to/ComfyUI/.venv/bin/python -r requirements-dev.txt
/path/to/ComfyUI/.venv/bin/python -m pytest tests/test_universal_remove.py

视频输入与关键帧圈选

当前扩展不内置视频读取器,但已经内置 UR Region Editor 前端交互式圈选 UI。

推荐接法是:

任意视频读取节点 / 你的脚本
  -> IMAGE frame batch
  -> UR Region Editor 输出 regions_json
  -> UR Regions To Mask Batch

也就是说,本扩展支持的是:

  • 输入视频拆帧后的 IMAGE 批次
  • 通过 frame_index 指定关键帧
  • 通过 UR Region Editor 鼠标绘制或手写 regions_json 描述关键帧上的圈选区域
  • 输出整段帧批可用的 MASK

UR Region Editor 的本地视频背景只用于交互定位,不替代实际视频读取节点;真正进入后端计算的是上游 IMAGE frame batch 和编辑器输出的 regions_json

region JSON 示例

单关键帧矩形 + 圆形

[
  {"type": "rect", "frame_index": 0, "x": 160, "y": 120, "w": 260, "h": 140},
  {"type": "circle", "frame_index": 0, "cx": 520, "cy": 250, "r": 70}
]

多关键帧多边形

[
  {
    "type": "polygon",
    "frame_index": 0,
    "points": [[120, 160], [240, 150], [280, 260], [150, 290]]
  },
  {
    "type": "polygon",
    "frame_index": 48,
    "points": [[180, 170], [310, 160], [350, 280], [210, 310]]
  }
]

配合 broadcast_mode=hold_until_next_keyframe 时,第一个关键帧 mask 会使用到下一个关键帧之前,第二个关键帧 mask 会使用到结尾。

bbox JSON 示例

xyxy

[
  [100, 120, 420, 220],
  [520, 50, 700, 160]
]

xywh

[
  {"x": 100, "y": 120, "w": 320, "h": 100},
  {"x": 520, "y": 50, "w": 180, "h": 110}
]

备注

这个扩展当前最适合做:

  • 通用 remove 流程骨架
  • 去水印 / 去字幕 / 去 logo
  • 有上游 mask 时的角色移除 / 物体移除

如果你下一步要做“文本直接选目标并跟踪整段视频”,建议继续在这个目录里加新节点,而不是让核心 remove 节点反向依赖别的 custom nodes。