Files
CavinHuang-comfyui-nodes-docs/docs/BitwiseAndMaskForEach.md
T
2024-05-26 20:35:16 +08:00

3.0 KiB

Documentation

BitwiseAndMaskForEach节点的'doit'方法对段进行位运算,使用掩码确定重叠区域。它处理每个基础段与一组掩码段,识别重叠区域,并对非重叠区域应用掩码以消除它们。此方法对于细化分割结果至关重要,确保只保留真正重叠的区域。

Input types

Required

  • base_segs
    • 'base_segs'参数是一系列将由节点处理的分割对象集合。它至关重要,因为它构成了与掩码段进行位运算的基础。该参数直接影响节点执行的结果,决定了哪些段被考虑用于重叠检测。
    • Comfy dtype: SEGS
    • Python dtype: List[SEG]
  • mask_segs
    • 'mask_segs'参数由作为位运算掩码的分割对象组成。它至关重要,因为它定义了操作后要保留的区域。该参数在塑造节点的最终输出方面起着重要作用,通过指定要考虑重叠并应在操作后保留的区域。
    • Comfy dtype: SEGS
    • Python dtype: List[SEG]

Output types

  • result
    • 'result'输出是经过位运算处理的分割对象列表。它只包含基础段和掩码段之间有重叠的段。这个输出很重要,因为它代表了操作后细化的分割数据。
    • Comfy dtype: SEGS
    • Python dtype: Tuple[str, List[SEG]]

Usage tips

  • Infra type: CPU

Source code

class BitwiseAndMaskForEach:

    @classmethod
    def INPUT_TYPES(s):
        return {'required': {'base_segs': ('SEGS',), 'mask_segs': ('SEGS',)}}
    RETURN_TYPES = ('SEGS',)
    FUNCTION = 'doit'
    CATEGORY = 'ImpactPack/Operation'

    def doit(self, base_segs, mask_segs):
        result = []
        for bseg in base_segs[1]:
            cropped_mask1 = bseg.cropped_mask.copy()
            crop_region1 = bseg.crop_region
            for mseg in mask_segs[1]:
                cropped_mask2 = mseg.cropped_mask
                crop_region2 = mseg.crop_region
                intersect_region = (max(crop_region1[0], crop_region2[0]), max(crop_region1[1], crop_region2[1]), min(crop_region1[2], crop_region2[2]), min(crop_region1[3], crop_region2[3]))
                overlapped = False
                for i in range(intersect_region[0], intersect_region[2]):
                    for j in range(intersect_region[1], intersect_region[3]):
                        if cropped_mask1[j - crop_region1[1], i - crop_region1[0]] == 1 and cropped_mask2[j - crop_region2[1], i - crop_region2[0]] == 1:
                            overlapped = True
                            pass
                        else:
                            cropped_mask1[j - crop_region1[1], i - crop_region1[0]] = 0
                if overlapped:
                    item = SEG(bseg.cropped_image, cropped_mask1, bseg.confidence, bseg.crop_region, bseg.bbox, bseg.label, None)
                    result.append(item)
        return ((base_segs[0], result),)