82 lines
2.8 KiB
Markdown
82 lines
2.8 KiB
Markdown
---
|
|
tags:
|
|
- Mask
|
|
- MaskEnhancement
|
|
- MaskRegion
|
|
---
|
|
|
|
# Countour Mask Regions Extraction
|
|
## Documentation
|
|
- Class name: `SaltMaskContourExtraction`
|
|
- Category: `SALT/Masking/Filter`
|
|
- Output node: `False`
|
|
|
|
This node is designed for extracting contours from mask regions using multiple threshold values. It applies a series of thresholds to identify and draw contours around regions of interest within the masks, effectively highlighting their boundaries.
|
|
## Input types
|
|
### Required
|
|
- **`masks`**
|
|
- The input masks for which contours are to be extracted. These masks serve as the primary data on which the contour extraction process is applied.
|
|
- Comfy dtype: `MASK`
|
|
- Python dtype: `torch.Tensor`
|
|
### Optional
|
|
- **`thresholds`**
|
|
- A list of threshold values used to identify contours within the masks. Each threshold value defines a specific level of intensity for which contours are detected and drawn, allowing for a multi-faceted analysis of the mask regions.
|
|
- Comfy dtype: `INT`
|
|
- Python dtype: `List[int]`
|
|
## Output types
|
|
- **`MASKS`**
|
|
- Comfy dtype: `MASK`
|
|
- The output consists of tensors representing the extracted contours from the input masks. These tensors highlight the boundaries of regions within the masks, based on the specified threshold values.
|
|
- Python dtype: `torch.Tensor`
|
|
## Usage tips
|
|
- Infra type: `GPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class SaltMaskContourExtraction:
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"masks": ("MASK",),
|
|
},
|
|
"optional": {
|
|
"thresholds": ("INT", {"default": 128, "min": 0, "max": 255, "step": 1}),
|
|
}
|
|
}
|
|
|
|
CATEGORY = f"{NAME}/Masking/Filter"
|
|
|
|
RETURN_TYPES = ("MASK",)
|
|
RETURN_NAMES = ("MASKS",)
|
|
|
|
FUNCTION = "contour_extraction"
|
|
|
|
def contour_extraction(self, masks, thresholds=[50, 100, 150, 200]):
|
|
regions = []
|
|
|
|
if not isinstance(thresholds, list):
|
|
thresholds = [thresholds]
|
|
|
|
for mask in masks:
|
|
pil_image = ImageOps.invert(mask2pil(mask.unsqueeze(0)))
|
|
image_array = np.array(pil_image.convert('L'))
|
|
|
|
combined_contours = np.zeros_like(image_array)
|
|
|
|
for threshold in thresholds:
|
|
_, thresh_image = cv2.threshold(image_array, threshold, 255, cv2.THRESH_BINARY)
|
|
contours, _ = cv2.findContours(thresh_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
|
cv2.drawContours(combined_contours, contours, -1, (255, 255, 255), 1)
|
|
|
|
contour_pil = Image.fromarray(combined_contours)
|
|
region_tensor = pil2mask(contour_pil)
|
|
regions.append(region_tensor)
|
|
|
|
regions_tensor = torch.cat(regions, dim=0)
|
|
return (regions_tensor,)
|
|
|
|
```
|