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

news2025/1/4 9:54:10

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

在这里插入图片描述

一、代码

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

import torch
import numpy as np


class ImgCombMask:
    """
    自定义节点:将图像中的指定掩膜区域替换为黑色。

    功能说明:
    - 输入的图像和掩膜必须是张量格式(Tensor)。
    - 掩膜为二值化张量,白色区域(值 > 0.5)将被视为需要遮盖的区域。
    - 输出的图像会保持输入图像的形状。
    """

    @classmethod
    def 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.device
        mask = 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的官方示例代码

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

    @classmethod
    def 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  # 是否为输出节点,默认为 False

    CATEGORY = "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 - image
        return (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.coloradmin.cn/o/2269424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ学习笔记(持续更新中......)

目录 1. 单机搭建 2. 测试RocketMQ 3. 集群搭建 4. 集群启动 5. RocketMQ-DashBoard搭建 6. 不同类型消息发送 1.同步消息 2. 异步消息发送 3. 单向发送消息 7. 消费消息 1. 单机搭建 1. 先从rocketmq官网下载二进制包,ftp上传至linux服务器&#xff0c…

【二】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务

提示:如果是天地图底图参考这篇文章 【一】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务_arcgis js api 调用三维地图服务-CSDN博客 需求: 前端开发实现底图(wkid:3857,web墨卡托)&#x…

PDF怎么压缩得又小又清晰?5种PDF压缩方法

PDF 文件在日常办公与学习中使用极为频繁,可想要把它压缩得又小又清晰却困难重重。一方面,PDF 格式本身具有高度兼容性,集成了文字、图像、矢量图等多样元素,压缩时难以兼顾不同元素特性,稍不注意,文字就会…

数据结构与算法之动态规划: LeetCode 62. 不同路径 (Ts版)

不同路径 https://leetcode.cn/problems/unique-paths/description/ 描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接,推广链接,网站导航,显示小组件,显示信息提要,背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

如何利用java爬虫获得AMAZON商品详情

在数字化时代,数据的价值不言而喻,尤其是对于电商平台而言,获取商品的详细信息对于优化用户体验、制定营销策略至关重要。亚马逊作为全球最大的电商平台之一,拥有海量的商品信息。本文将介绍如何使用Java编写爬虫程序,…

人工智能基础软件-Jupyter Notebook

简介: Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。 Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直…

数据库系列之分布式数据库下误删表怎么恢复?

数据的完整性是数据库可用性的基本功能,在实际应用数据库变更操作过程中可能因为误操作导致误删表或者truncate操作影响业务的正常访问。本文介绍了分布式数据库中在误删表场景下的数据恢复方案,并进行了对比。 1、数据库误删表恢复方案 应用数据的完整…

【分布式缓存中间件Memcached原理与应用】

分布式缓存中间件(以 Memcached 为例) 一、分布式缓存中间件概述 (一)概念 分布式缓存中间件是一种用于存储频繁访问的数据副本的软件系统,它位于应用程序和数据源(通常是数据库)之间。通过在…

No.2十六届蓝桥杯备战|练习题4道|数据类型|字符型|整型|浮点型|布尔型|signed|unsigned(C++)

B2002 Hello,World! - 洛谷 #include <iostream> using namespace std; int main() { cout << "Hello,World!" << endl; return 0; }打印飞机 #include <iostream> using namespace std;int main() {cout << " …

mysql系列7—Innodb的redolog

背景 本文涉及的内容较为底层&#xff0c;做了解即可&#xff0c;是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过&#xff1a;数据和索引保存在磁盘上…

小程序租赁系统开发的优势与应用探索

内容概要 在如今这个数码科技飞速发展的时代&#xff0c;小程序租赁系统开发仿佛是一张神奇的魔法卡&#xff0c;能让租赁体验变得顺畅如丝。想象一下&#xff0c;无论你需要租用什么&#xff0c;从单车到房屋&#xff0c;甚至是派对用品&#xff0c;只需动动手指&#xff0c;…

太速科技-135-4路250Msps 16bit AD采集PCIe卡

4路250Msps 16bit AD采集PCIe卡 一、板卡概述 板卡为四路250M频率采集卡&#xff0c;可以实现四路高速的模拟数据转换到PCI-E总线上。板载两颗250M采样频率的高性能AD芯片&#xff08;ADS42LB69&#xff09;&#xff0c;数据输出模式为LVDS&#xff08;DDR&#xff09…

如何恢复永久删除的PPT文件?查看数据恢复教程!

可以恢复永久删除的PPT文件吗&#xff1f; Microsoft PowerPoint应用程序是一种应用广泛的演示程序&#xff0c;在人们的日常生活中经常使用。商人、官员、学生等在学习和工作中会使用PowerPoint做报告和演示。PowerPoint在人们的学习和工作生活中占主导地位&#xff0c;每天都…

Windows电脑带有日历的桌面备忘记事工具

工作计划、备忘清单、会议文件等怎么能化繁琐为简约&#xff0c;统统存储在一个记事工具中呢&#xff1f;Windows电脑上的备忘记事工具哪一款好用呢&#xff1f;推荐大家可关注敬业签&#xff0c;敬业签是一款集备忘、提醒和日历等功能于一体的桌面记事工具&#xff0c;可悬挂桌…

SSA-Transformer拿捏!麻雀搜索算法优化-Transformer多特征分类预测/故障诊断

SSA-Transformer拿捏&#xff01;麻雀搜索算法优化-Transformer多特征分类预测/故障诊断 目录 SSA-Transformer拿捏&#xff01;麻雀搜索算法优化-Transformer多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SSA-Transformer麻雀搜索…

STM32G070CB的USART1_RX引脚

简介 在使用STM32G070CBT6 的 USART1时&#xff0c;发现把 PA10作为 USART1_RX引脚时&#xff0c;接收不到数据。 问题排查 更换pin脚 使用PB6/PB7作为USART1_TX/RX&#xff0c; USART1 工作正常。 使用PA9/PB7作为USART1_TX/RX&#xff0c; USART1 同样工作正常。 示波器…

鸿蒙工程签名编译和上架

作为一个开发者&#xff0c;当你把自己的应用开发完了&#xff0c;准备上架到应用市场的时候&#xff0c;就需要用签名文件进行编译和应用上架了&#xff0c;本文介绍如何把一个鸿蒙工程进行签名编译和上架。 在平时开发中&#xff0c;我们可能关注签名不多&#xff0c;大家一般…

S7-1200 SCL PEEK 和 POKE 指令使用

使用S7-1200 SCL 编程语言的 PEEK 和 POKE 指令&#xff0c;可以实现对 I/O、M 存储器和数据块的读取或写入。 而通过 POKE_BLK 指令&#xff0c;还可以实现数据区域的复制或移动。 指令适用条件&#xff1a; 只用于 SCL 编程语言&#xff1b;软件从STEP7 Basic/Pro V11 SP2起…

绘制三元图、颜色空间图:R语言代码

本文介绍基于R语言中的Ternary包&#xff0c;绘制三元图&#xff08;Ternary Plot&#xff09;的详细方法&#xff1b;其中&#xff0c;我们就以RGB三色分布图为例来具体介绍。 三元图可以从三个不同的角度反映数据的特征&#xff0c;因此在很多领域都得以广泛应用&#xff1b;…