4.2 KiB
4.2 KiB
Documentation
- Class name: SEGSPaste
- Category: ImpactPack/Detailer
- Output node: False
- Repo Ref: https://github.com/ltdrdata/ComfyUI-Impact-Pack.git
SEGSPaste节点旨在将分割图中的片段集成到给定图像中,增强图像的视觉细节。它通过指定的羽化和alpha值对片段进行对齐和混合,确保了无缝和详细的结果。
Input types
Required
- image
- 输入图像,将把片段粘贴到该图像中。它作为整个操作的基础,片段将与此图像对齐并混合。
- Comfy dtype: IMAGE
- Python dtype: torch.Tensor
- segs
- 包含要粘贴到图像上的片段的分割数据。每个片段对于细节增强过程至关重要,有助于最终的视觉输出。
- Comfy dtype: SEGS
- Python dtype: List[SEG]
Optional
- feather
- 羽化参数控制粘贴片段时边缘的柔和度。它是实现片段与图像之间自然混合的重要因素。
- Comfy dtype: INT
- Python dtype: int
- alpha
- alpha参数调整粘贴片段的不透明度,允许控制与底层图像的可见性和混合强度。
- Comfy dtype: INT
- Python dtype: int
- ref_image_opt
- 一个可选的参考图像,为粘贴片段提供额外的上下文。它可以用来匹配片段与参考图像的光照或颜色。
- Comfy dtype: IMAGE
- Python dtype: torch.Tensor
Output types
- result
- 输出是增强后的图像,其中来自分割图的片段被无缝集成。它代表了细节增强过程的最终视觉结果。
- Comfy dtype: IMAGE
- Python dtype: torch.Tensor
Usage tips
- Infra type: GPU
Source code
class SEGSPaste:
@classmethod
def INPUT_TYPES(s):
return {'required': {'image': ('IMAGE',), 'segs': ('SEGS',), 'feather': ('INT', {'default': 5, 'min': 0, 'max': 100, 'step': 1}), 'alpha': ('INT', {'default': 255, 'min': 0, 'max': 255, 'step': 1})}, 'optional': {'ref_image_opt': ('IMAGE',)}}
RETURN_TYPES = ('IMAGE',)
FUNCTION = 'doit'
CATEGORY = 'ImpactPack/Detailer'
@staticmethod
def doit(image, segs, feather, alpha=255, ref_image_opt=None):
segs = core.segs_scale_match(segs, image.shape)
result = None
for (i, single_image) in enumerate(image):
image_i = single_image.unsqueeze(0).clone()
for seg in segs[1]:
ref_image = None
if ref_image_opt is None and seg.cropped_image is not None:
cropped_image = seg.cropped_image
if isinstance(cropped_image, np.ndarray):
cropped_image = torch.from_numpy(cropped_image)
ref_image = cropped_image[i].unsqueeze(0)
elif ref_image_opt is not None:
ref_tensor = ref_image_opt[i].unsqueeze(0)
ref_image = crop_image(ref_tensor, seg.crop_region)
if ref_image is not None:
if seg.cropped_mask.ndim == 3 and len(seg.cropped_mask) == len(image):
mask = seg.cropped_mask[i]
elif seg.cropped_mask.ndim == 3 and len(seg.cropped_mask) > 1:
print(f'[Impact Pack] WARN: SEGSPaste - The number of the mask batch({len(seg.cropped_mask)}) and the image batch({len(image)}) are different. Combine the mask frames and apply.')
combined_mask = (seg.cropped_mask[0] * 255).to(torch.uint8)
for frame_mask in seg.cropped_mask[1:]:
combined_mask |= (frame_mask * 255).to(torch.uint8)
combined_mask = (combined_mask / 255.0).to(torch.float32)
mask = utils.to_binary_mask(combined_mask, 0.1)
else:
mask = seg.cropped_mask
mask = tensor_gaussian_blur_mask(mask, feather) * (alpha / 255)
(x, y, *_) = seg.crop_region
mask.cpu()
image_i.cpu()
ref_image.cpu()
tensor_paste(image_i, ref_image, (x, y), mask)
if result is None:
result = image_i
else:
result = torch.concat((result, image_i), dim=0)
return (result,)