【ComfyUI + 自定义节点】图片叠加掩膜(mask)部分扣掉(变黑)

server/2024/12/28 15:04:22/

Comfyui的官方示例:https://github.com/comfyanonymous/ComfyUI/blob/master/custom_nodes/example_node.py.example

在这里插入图片描述

一、代码

( 逻辑:将图片对应掩膜覆盖的区域替换为黑色)
因为comfyui加载的图片后,转化为tensor

import torch
import numpy as npclass ImgCombMask:"""自定义节点:将图像中的指定掩膜区域替换为黑色。功能说明:- 输入的图像和掩膜必须是张量格式(Tensor)。- 掩膜为二值化张量,白色区域(值 > 0.5)将被视为需要遮盖的区域。- 输出的图像会保持输入图像的形状。"""@classmethoddef INPUT_TYPES(cls):"""定义节点的输入参数。"""return {"required": {"image": ("IMAGE",),  # 图像输入 (Tensor)"mask": ("MASK",),    # 掩膜输入 (Tensor)}}CATEGORY = "Custom/Image Processing"RETURN_TYPES = ("IMAGE",)  # 返回值类型为图像FUNCTION = "apply_mask"    # 节点主函数def apply_mask(self, image, mask):"""主逻辑:将掩膜覆盖的区域替换为黑色。参数:- image: 输入的图像张量,形状为 [Batch, Height, Width, Channels]。- mask: 输入的掩膜张量,形状为 [Batch, Height, Width] 或 [Batch, 1, Height, Width]。返回:- 处理后的图像张量,形状为 [Batch, Height, Width, Channels]。"""# 确保图像和掩膜在同一个设备上(CPU/GPU)device = image.devicemask = mask.to(device)# 调整图像维度为 [Batch, Channels, Height, Width]if len(image.shape) == 4:  # 如果图像格式为 [Batch, Height, Width, Channels]image = image.permute(0, 3, 1, 2)  # 转换为 [Batch, Channels, Height, Width]# 如果掩膜缺少通道维度,则添加通道维度if len(mask.shape) == 3:  # 掩膜格式为 [Batch, Height, Width]mask = mask.unsqueeze(1)  # 添加通道维度,变为 [Batch, 1, Height, Width]# 将掩膜二值化(值为 0 或 1)mask_binary = (mask > 0.5).float()  # 掩膜二值化:[Batch, 1, Height, Width]# 应用掩膜:将图像掩膜区域设置为黑色image = image * (1 - mask_binary)  # 被掩膜的区域会被设置为黑色# 恢复图像维度为 [Batch, Height, Width, Channels]image = image.permute(0, 2, 3, 1)  # 转换回 [Batch, Height, Width, Channels]return (image,)# 注册自定义节点
NODE_CLASS_MAPPINGS = {"ImgCombMask": ImgCombMask
}NODE_DISPLAY_NAME_MAPPINGS = {"ImgCombMask": "Image Combine with Mask to Black"
}

代码对应UI说明 (可改为任意自己喜欢)

Image Combine with Mask to Black 对应comfyui使用名

NODE_DISPLAY_NAME_MAPPINGS

= {
“ImgCombMask”: “Image Combine with Mask to Black”
}

在这里插入图片描述

CATEGORY

CATEGORY = "Custom/Image Processing"

在这里插入图片描述

comfyui_103">附录 comfyui的官方示例代码

class Example:"""示例节点类方法说明-------------INPUT_TYPES (dict):定义了主程序中节点的输入参数。IS_CHANGED:(可选)控制节点在输入参数未变化时是否仍然需要重新执行。属性说明----------RETURN_TYPES (`tuple`):返回值类型的元组,定义节点输出的每个元素的类型。RETURN_NAMES (`tuple`):(可选)定义返回值中每个元素的名称,方便后续引用。FUNCTION (`str`):节点的入口方法名称。例如,如果 `FUNCTION = "execute"`,则会调用 `Example().execute()`。OUTPUT_NODE ([`bool`] 可选):表示该节点是否是输出节点。例如 SaveImage 节点就是一个输出节点。如果是输出节点,后端会遍历执行所有连接到此节点的父节点。如果未定义此属性,则默认为 False。CATEGORY (`str`):定义节点在 UI 中所属的分类。DEPRECATED (`bool`):指示该节点是否已弃用。弃用的节点会在 UI 中隐藏,但在已有的工作流中仍然可以使用。EXPERIMENTAL (`bool`):指示该节点是否为实验性节点。实验性节点在 UI 中会被标记,并且可能在未来版本中发生重大变化或被移除。execute(s) -> tuple || None:节点的入口方法名称。此方法名称必须与属性 `FUNCTION` 的值一致。例如,如果 `FUNCTION = "execute"`,则此方法必须命名为 `execute`;如果 `FUNCTION = "foo"`,则必须命名为 `foo`。"""def __init__(self):pass@classmethoddef INPUT_TYPES(s):"""返回一个包含所有输入字段配置的字典。输入字段的类型(字符串)可以是以下几种:"MODEL", "VAE", "CLIP", "CONDITIONING", "LATENT", "IMAGE", "INT", "STRING", "FLOAT"。其中,"INT"、"STRING" 或 "FLOAT" 是特殊的值类型,通常用于节点的字段。返回值:`dict`:- 键 `input_fields_group`(`string`): 可以是 required(必需)、hidden(隐藏)或 optional(可选)。节点类中必须包含 `required` 属性。- 值 `input_fields` (`dict`): 包含输入字段的具体配置:* 键 field_name (`string`): 入口方法参数的名称。* 值 field_config (`tuple`):+ 第一个值为字符串,表示字段类型,或者是一个供选择的列表。+ 第二个值是配置字典,用于字段类型 "INT"、"STRING" 或 "FLOAT" 的具体设置。"""return {"required": {"image": ("IMAGE",),  # 输入图像类型"int_field": ("INT", {  # 整数类型字段"default": 0,  # 默认值"min": 0,  # 最小值"max": 4096,  # 最大值"step": 64,  # 滑块的步长"display": "number",  # 外观显示:数字输入框或滑块"lazy": True  # 只有在 check_lazy_status 方法中需要时才会被调用}),"float_field": ("FLOAT", {  # 浮点类型字段"default": 1.0,"min": 0.0,"max": 10.0,"step": 0.01,"round": 0.001,  # 指定四舍五入的精度,可以设置为 False 以禁用"display": "number","lazy": True}),"print_to_screen": (["enable", "disable"],),  # 下拉选项"string_field": ("STRING", {  # 字符串字段"multiline": False,  # 如果为 True,则输入框支持多行文本"default": "Hello World!",  # 默认值"lazy": True}),},}RETURN_TYPES = ("IMAGE",)  # 返回值类型为图像# RETURN_NAMES = ("image_output_name",)  # (可选)为返回值命名FUNCTION = "test"  # 入口方法的名称# OUTPUT_NODE = False  # 是否为输出节点,默认为 FalseCATEGORY = "Example"  # 节点在 UI 中的分类def check_lazy_status(self, image, string_field, int_field, float_field, print_to_screen):"""返回需要评估的输入字段名称列表。如果存在尚未评估的惰性输入字段,会调用此函数。只要返回的字段列表中包含尚未评估的字段,该函数就会再次被调用,直到所有字段评估完成。已评估的输入会作为参数传递给此函数;未评估的输入值将为 None。"""if print_to_screen == "enable":return ["int_field", "float_field", "string_field"]else:return []def test(self, image, string_field, int_field, float_field, print_to_screen):"""主逻辑方法,根据 FUNCTION 属性定义的入口方法。在此示例中,如果 print_to_screen 启用,则打印输入字段的信息。"""if print_to_screen == "enable":print(f"""Your input contains:string_field aka input text: {string_field}int_field: {int_field}float_field: {float_field}""")# 示例逻辑:反转图像的像素值image = 1.0 - imagereturn (image,)"""节点会在任何输入更改时重新执行,但可以使用此方法强制节点即使输入未更改时也重新执行。通过返回一个数字或字符串,比较当前值和上一次执行返回的值,如果不同则节点会重新执行。此方法在核心代码中用于 LoadImage 节点,其中返回的是图像的哈希值。如果图像哈希在两次执行之间发生变化,LoadImage 节点会重新执行。"""# @classmethod# def IS_CHANGED(s, image, string_field, int_field, float_field, print_to_screen):#     return ""# 设置 Web 目录,任何在该目录中的 .js 文件都会被前端加载为扩展
# WEB_DIRECTORY = "./somejs"# 添加自定义 API 路由,使用 router
from aiohttp import web
from server import PromptServer@PromptServer.instance.routes.get("/hello")
async def get_hello(request):return web.json_response("hello")# 导出节点的映射字典
# 注意:节点名称必须全局唯一
NODE_CLASS_MAPPINGS = {"Example": Example
}# 映射节点的友好名称(在 UI 中显示)
NODE_DISPLAY_NAME_MAPPINGS = {"Example": "示例节点"
}

http://www.ppmy.cn/server/153936.html

相关文章

XDP (eXpress Data Path):在操作系统内核中实现快速、可编程包处理

大家觉得有意义和帮助记得及时关注和点赞!!! 1 引言 1.1 现有方案(kernel bypass)存在的问题1.2 新方案:给内核网络栈添加可编程能力1.3 新方案(XDP)的优点1.4 本文组织结构2 相关工作 2.1 用户态轮询 vs. XDP2.2 内核…

USB Hub 检测设备

系列文章目录 xHCI 简单分析 USB Root Hub 分析 USB Hub 检测设备 文章目录 系列文章目录一、引言二、hub_eventshub_port_connect_changeusb_alloc_devusb_set_device_statehub_port_initusb_new_device 一、引言 USB Hub 检测设备 一文中讲到,当有 USB 插入时&…

【UE5.3.2】生成vs工程并rider打开

Rider是跨平台的,UE也是,当前现在windows上测试首先安装ue5.3.2 会自动有右键的菜单: windows上,右键,生成vs工程 生成的结果 sln默认是vs打开的,我的是vs2022,可以open with 选择 rider :Rider 会弹出 RiderLink是什么插

Elasticsearch 集群

集群结构 以三台物理机为例。在这三台物理机上,搭建了 6 个 ES 的节点,三个 data 节点,三个 master 节点(每台物理机分别起了一个 data 和一个 master),3 个 master 节点,目的是达到&#xff0…

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

本篇文章将介绍一个新的改进机制——SMFA(自调制特征聚合模块),并阐述如何将其应用于YOLOv11中,显著提升模型性能。随着深度学习在计算机视觉中的不断进展,目标检测任务也在快速发展。YOLO系列模型(You Onl…

软考-信息安全-网络安全体系与网络安全模型

4.1 网络安全体系概述 网络安全保障是一项复杂的系统工程,是安全策略,多种技术,管理方法和人员安全素质的综合。 4.1.1 网络安全体系概念 现代的网络安全问题变化莫测,要保障网络系统的安全,应当把相应的安全策略&a…

虚幻引擎是什么?

Unreal Engine,是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计,但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏,现在也用于电影的虚拟制片…

Android14 OTA升级速度过慢问题解决方案

软件版本:Android14 硬件平台:QCS6115 问题:OTA整包升级接近20min,太长无法忍受。 该问题为Android高版本的虚拟AB分区压缩技术所致,其实就是时间换空间,个人推测AB分区压缩会节约硬件存储空间&#xff0…