90 lines
2.7 KiB
Markdown
90 lines
2.7 KiB
Markdown
---
|
|
tags:
|
|
- Mask
|
|
---
|
|
|
|
# Split Regions
|
|
## Documentation
|
|
- Class name: `SaltMaskRegionSplit`
|
|
- Category: `SALT/Masking/Filter`
|
|
- Output node: `False`
|
|
|
|
The SaltMaskRegionSplit node is designed to isolate and split different regions within a given set of masks, effectively segmenting them into distinct areas based on connectivity.
|
|
## Input types
|
|
### Required
|
|
- **`masks`**
|
|
- The input masks to be segmented into distinct regions. This parameter is crucial for determining the segmentation outcome, as it directly influences the isolation of different areas within the masks.
|
|
- Comfy dtype: `MASK`
|
|
- Python dtype: `torch.Tensor`
|
|
## Output types
|
|
- **`region1`**
|
|
- Comfy dtype: `MASK`
|
|
- Represents the first isolated region from the input masks.
|
|
- Python dtype: `torch.Tensor`
|
|
- **`region2`**
|
|
- Comfy dtype: `MASK`
|
|
- Represents the second isolated region from the input masks.
|
|
- Python dtype: `torch.Tensor`
|
|
- **`region3`**
|
|
- Comfy dtype: `MASK`
|
|
- Represents the third isolated region from the input masks.
|
|
- Python dtype: `torch.Tensor`
|
|
- **`region4`**
|
|
- Comfy dtype: `MASK`
|
|
- Represents the fourth isolated region from the input masks.
|
|
- Python dtype: `torch.Tensor`
|
|
- **`region5`**
|
|
- Comfy dtype: `MASK`
|
|
- Represents the fifth isolated region from the input masks.
|
|
- Python dtype: `torch.Tensor`
|
|
- **`region6`**
|
|
- Comfy dtype: `MASK`
|
|
- Represents the sixth isolated region from the input masks.
|
|
- Python dtype: `torch.Tensor`
|
|
## Usage tips
|
|
- Infra type: `GPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
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))
|
|
|
|
```
|