Files
2024-07-04 11:34:32 +08:00

3.4 KiB

Documentation

SaltMaskRegionSplit节点旨在隔离和分割给定掩码集中的不同区域,基于连通性有效地将它们分割成不同的区域。这个节点在图像处理和计算机视觉任务中特别有用,可以帮助识别和分析复杂图像中的独立区域或对象。

Input types

Required

  • masks
    • masks参数是SaltMaskRegionSplit节点的核心输入,它代表要被分割成不同区域的输入掩码。这个参数对确定分割结果至关重要,因为它直接影响掩码中不同区域的隔离。通过处理这些输入掩码,节点能够识别和分离出独立的连通区域,从而实现有效的区域分割。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor

Output types

  • region1
    • 代表从输入掩码中分离出的第一个区域。这个输出可能对应于图像中最大或最显著的连通区域。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor
  • region2
    • 代表从输入掩码中分离出的第二个区域。这个输出可能对应于图像中第二大或第二显著的连通区域。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor
  • region3
    • 代表从输入掩码中分离出的第三个区域。这个输出继续按重要性或大小顺序提供下一个独立区域。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor
  • region4
    • 代表从输入掩码中分离出的第四个区域。这个输出提供了另一个独立的连通区域,进一步细化了区域分割。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor
  • region5
    • 代表从输入掩码中分离出的第五个区域。这个输出继续提供更多的独立区域,有助于全面分析复杂图像。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor
  • region6
    • 代表从输入掩码中分离出的第六个区域。这是最后一个输出区域,完成了对输入掩码中主要连通区域的分割。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU
  • Common nodes: unknown

Source code

class SaltMaskRegionSplit:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "masks": ("MASK",),
            }
        }

    CATEGORY = f"{NAME}/Masking/Filter"

    RETURN_TYPES = ("MASK", "MASK", "MASK", "MASK", "MASK", "MASK")
    RETURN_NAMES = ("region1", "region2", "region3", "region4", "region5", "region6")

    FUNCTION = "isolate_regions"

    def isolate_regions(self, masks):
        region_outputs = []

        for mask in masks:
            pil_image = ImageOps.invert(mask2pil(mask.unsqueeze(0)))
            mask_array = np.array(pil_image.convert('L'))

            num_labels, labels_im = cv2.connectedComponents(mask_array)

            outputs = [np.zeros_like(mask_array) for _ in range(6)]

            for i in range(1, min(num_labels, 7)):
                outputs[i-1][labels_im == i] = 255

            for output in outputs:
                output_pil = Image.fromarray(output)
                region_tensor = pil2mask(output_pil)
                region_outputs.append(region_tensor)

        regions_tensor = torch.stack(region_outputs, dim=0).view(len(masks), 6, *mask.size())
        return tuple(regions_tensor.unbind(dim=1))