3.0 KiB
3.0 KiB
Documentation
- Class name: SaltMaskRegionLabeling
- Category: SALT/Masking/Filter
- Output node: False
该节点旨在标记掩码中的不同区域,将其转换为基于连通性的视觉上不同的区域,并将这些标记的区域输出为张量。它利用阈值处理和连通组件分析来分割和标记不同的区域,通过为每个区域分配唯一的颜色来增强掩码区域的可解释性。
Input types
Required
- masks
- 需要标记的输入掩码,每个掩码都会根据指定的阈值进行处理,以识别和标记连通区域。
- Comfy dtype: MASK
- Python dtype: List[torch.Tensor]
Optional
- threshold
- 用于对掩码进行二值化阈值处理的阈值列表,这对于分离要标记的区域至关重要。如果提供单个值,则将应用于所有掩码。
- Comfy dtype: INT
- Python dtype: List[int]
Output types
- images
- 包含标记区域的输出张量,每个区域被分配一个唯一的颜色以区分它与其他区域。这个修正解决了反馈中的问题,正确地将输出识别为标记图像的张量,而不仅仅是"regions_tensor"。
- Comfy dtype: IMAGE
- Python dtype: torch.Tensor
Usage tips
- Infra type:
GPU - Common nodes: unknown
Source code
class SaltMaskRegionLabeling:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"masks": ("MASK",),
},
"optional": {
"threshold": ("INT", {"default": 128, "min": 0, "max": 255, "step": 1}),
}
}
CATEGORY = f"{NAME}/Masking/Filter"
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("images",)
FUNCTION = "region_labeling"
def region_labeling(self, masks, threshold=[128]):
if not isinstance(threshold, list):
threshold = [threshold]
regions = []
for i, mask in enumerate(masks):
pil_image = ImageOps.invert(mask2pil(mask.unsqueeze(0)))
image_array = np.array(pil_image.convert('L'))
_, thresh_image = cv2.threshold(image_array, threshold[i if i < len(threshold) else -1], 255, cv2.THRESH_BINARY)
num_labels, labels_im = cv2.connectedComponents(thresh_image)
max_label = max(num_labels - 1, 1)
hues = np.linspace(0, 179, num=max_label + 1, endpoint=False, dtype=np.uint8)
label_hue = np.zeros_like(labels_im, dtype=np.uint8)
for i in range(1, num_labels):
label_hue[labels_im == i] = hues[i]
saturation = np.uint8(np.where(labels_im == 0, 0, 255))
value = np.uint8(np.where(labels_im == 0, 0, 255))
labeled_img = cv2.merge([label_hue, saturation, value])
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)
labeled_pil = Image.fromarray(labeled_img)
region_tensor = pil2tensor(labeled_pil)
regions.append(region_tensor)
regions_tensor = torch.cat(regions, dim=0)
return (regions_tensor,)