diff --git a/modules/impact/core.py b/modules/impact/core.py index 8e7a0b5..3bfb477 100644 --- a/modules/impact/core.py +++ b/modules/impact/core.py @@ -892,7 +892,7 @@ class ONNXDetector: pass -def mask_to_segs(mask, combined, crop_factor, bbox_fill, drop_size=1, label='A', crop_min_size=None, detailer_hook=None): +def mask_to_segs(mask, combined, crop_factor, bbox_fill, drop_size=1, label='A', crop_min_size=None, detailer_hook=None, is_contour=True): drop_size = max(drop_size, 1) if mask is None: print("[mask_to_segs] Cannot operate: MASK is empty.") @@ -961,8 +961,13 @@ def mask_to_segs(mask, combined, crop_factor, bbox_fill, drop_size=1, label='A', crop_region = detailer_hook.post_crop_region(mask_i.shape[1], mask_i.shape[0], bbox, crop_region) if w > drop_size and h > drop_size: + if is_contour: + mask_src = separated_mask + else: + mask_src = mask_i + cropped_mask = np.array( - separated_mask[ + mask_src[ crop_region[1]: crop_region[3], crop_region[0]: crop_region[2], ] diff --git a/modules/impact/segs_nodes.py b/modules/impact/segs_nodes.py index cfae3f3..f213212 100644 --- a/modules/impact/segs_nodes.py +++ b/modules/impact/segs_nodes.py @@ -911,6 +911,7 @@ class MaskToSEGS: "crop_factor": ("FLOAT", {"default": 3.0, "min": 1.0, "max": 100, "step": 0.1}), "bbox_fill": ("BOOLEAN", {"default": False, "label_on": "enabled", "label_off": "disabled"}), "drop_size": ("INT", {"min": 1, "max": MAX_RESOLUTION, "step": 1, "default": 10}), + "fill_inside": ("BOOLEAN", {"default": False, "label_on": "enabled", "label_off": "disabled"}), } } @@ -919,11 +920,11 @@ class MaskToSEGS: CATEGORY = "ImpactPack/Operation" - def doit(self, mask, combined, crop_factor, bbox_fill, drop_size): + def doit(self, mask, combined, crop_factor, bbox_fill, drop_size, fill_inside=False): if len(mask.shape) == 3: mask = mask.squeeze(0) - result = core.mask_to_segs(mask, combined, crop_factor, bbox_fill, drop_size) + result = core.mask_to_segs(mask, combined, crop_factor, bbox_fill, drop_size, is_contour=fill_inside) return (result, ) @@ -936,6 +937,7 @@ class MaskToSEGS_for_AnimateDiff: "crop_factor": ("FLOAT", {"default": 3.0, "min": 1.0, "max": 100, "step": 0.1}), "bbox_fill": ("BOOLEAN", {"default": False, "label_on": "enabled", "label_off": "disabled"}), "drop_size": ("INT", {"min": 1, "max": MAX_RESOLUTION, "step": 1, "default": 10}), + "fill_inside": ("BOOLEAN", {"default": False, "label_on": "enabled", "label_off": "disabled"}), } } @@ -944,11 +946,11 @@ class MaskToSEGS_for_AnimateDiff: CATEGORY = "ImpactPack/Operation" - def doit(self, mask, combined, crop_factor, bbox_fill, drop_size): + def doit(self, mask, combined, crop_factor, bbox_fill, drop_size, fill_inside=False): if len(mask.shape) == 3: mask = mask.squeeze(0) - segs = core.mask_to_segs(mask, combined, crop_factor, bbox_fill, drop_size) + segs = core.mask_to_segs(mask, combined, crop_factor, bbox_fill, drop_size, is_contour=fill_inside) all_masks = SEGSToMaskList().doit(segs)[0] @@ -958,7 +960,7 @@ class MaskToSEGS_for_AnimateDiff: result_mask = utils.to_binary_mask(result_mask, 0.1) - return MaskToSEGS().doit(result_mask, False, crop_factor, False, drop_size) + return MaskToSEGS().doit(result_mask, False, crop_factor, False, drop_size, fill_inside) class ControlNetApplySEGS: