Files
CavinHuang-comfyui-nodes-docs/docs/SaltMaskAdaptiveThresholdingRegion.md
2024-07-04 11:34:32 +08:00

2.8 KiB

Documentation

  • Class name: SaltMaskAdaptiveThresholdingRegion
  • Category: SALT/Masking/Filter
  • Output node: False

该节点对一组遮罩图像应用自适应阈值处理,根据局部像素值的变化将其转换为二值图像。它旨在通过动态调整整个图像的阈值,增强不同照明区域中特征的可见性。

Input types

Required

  • masks
    • 需要进行自适应阈值处理的输入遮罩。这些遮罩将使用局部自适应阈值转换为二值图像。
    • Comfy dtype: MASK
    • Python dtype: List[torch.Tensor]

Optional

  • block_size
    • 用于计算每个像素阈值的局部区域大小。它决定了阈值处理过程对局部照明变化的适应性。
    • Comfy dtype: INT
    • Python dtype: List[int] or int
  • constant
    • 从block_size计算的平均值或加权平均值中减去的常数。这用于微调阈值处理过程。
    • Comfy dtype: INT
    • Python dtype: List[int] or int

Output types

  • MASKS
    • 包含应用自适应阈值处理后的区域的输出张量,增强了遮罩中的局部特征。
    • Comfy dtype: MASK
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU
  • Common nodes: unknown

Source code

class SaltMaskAdaptiveThresholdingRegion:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "masks": ("MASK",),
            },
            "optional": {
                "block_size": ("INT", {"default": 11, "min": 3, "max": 255, "step": 2}),
                "constant": ("INT", {"default": 2, "min": 0, "max": 10, "step": 1}),
            }
        }

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

    RETURN_TYPES = ("MASK",)
    RETURN_NAMES = ("MASKS",)

    FUNCTION = "adaptive_thresholding"

    def adaptive_thresholding(self, masks, block_size=11, constant=2):
        if not isinstance(block_size, list):
            block_size = [block_size]
        if not isinstance(constant, list):
            constant = [constant]

        block_size = [closest_odd(val) for val in block_size]
        
        regions = []
        for i, mask in enumerate(masks):
            pil_image = mask2pil(mask.unsqueeze(0))
            image_array = np.array(pil_image.convert('L'))
            
            current_block_size = block_size[i if i < len(block_size) else -1]
            current_C = constant[i if i < len(constant) else -1]
            
            adaptive_thresh = cv2.adaptiveThreshold(image_array, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                                    cv2.THRESH_BINARY, current_block_size, current_C)

            adaptive_pil = ImageOps.invert(Image.fromarray(adaptive_thresh))
            region_tensor = pil2mask(adaptive_pil)
            regions.append(region_tensor)

        regions_tensor = torch.cat(regions, dim=0)
        return (regions_tensor,)