Superside Grow Mask With Blur
Grow it, blur it, get an inverted copy for free
- mask
- mask
- mask_inverted
If you've done any masked inpainting, you already know the ritual: the mask from your detector or selector is never quite right. It hugs the subject too tight, its edge is a hard binary cliff, and if you feed that straight into an inpaint you get a visible seam. This node is the standard fix - grow or shrink the mask, blur its edge so the re-render blends, and hand you the inverted mask as a bonus output. No API, no key, no model call.
It's the in-house equivalent of kj-nodes' GrowMaskWithBlur, and it implements the same contract faithfully, which matters if you're swapping one pack for the other in an existing graph. The core inputs:
mask- native MASK type in, MASK out.expand- grow (positive) or shrink (negative) the mask by this many pixels, −16384 to +16384. This is the knob that turns a face-tight mask into a face-and-shoulder mask so the inpaint has context to blend against.blur_radius- the Gaussian blur applied to the mask edge, 0 to 100. This is what kills the hard seam: a blurred mask means the inpaint transitions instead of abutting.tapered_corners- on by default; softens the corners as the mask grows rather than squaring them off.
Then the pack's own additions to the kj-node contract: incremental_expandrate (expand grows more per pixel as it goes, for a tapered overall shape), lerp_alpha (how much to blend the grown mask with the original), decay_factor (0–1, fades mask intensity over distance), and an optional fill_holes toggle that closes gaps inside the mask. You'll rarely touch the first three - they exist because the original node had them and the pack is keeping the contract identical - but fill_holes is genuinely handy when a mask comes back with a hole in the middle of the subject.
Two outputs: mask (the processed mask) and mask_inverted - the same mask flipped, which is exactly what you need for an exclusion composite. That's a nice touch: one node gives you both the "edit here" and the "protect here" masks without a second node.
The workflow it's built for: a region selector or detector produces a rough mask, this grows it by a margin and blurs it, the result feeds an inpaint node (or the pack's Flux Pro Fill / Z-Image inpaint), and the mask_inverted output protects the parts you don't want touched. The pack also notes something subtle: GrowMaskWithBlur is one of the two mask nodes that preserve gray - meaning partial-opacity masks from Superside Portrait Sections survive through it, so a 50% gray region stays 50% gray instead of being thresholded to binary. That gray-preservation is what makes the partial-opacity retouch trick work downstream.
Install - ComfyUI Manager (search "comfyui-superside-nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/Superside/comfyui-superside-nodes
pip install -r requirements.txt
Restart ComfyUI, find it under Superside. No key, no downloads. If you already run kj-nodes, this is redundant but harmless; if you can't install kj-nodes on a locked-down box, this is the same node without the extra pack.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| mask | MASK | — | |
| expand | INT | 0-16384–16384 | — |
| incremental_expandrate | FLOAT | 0.00–100 | — |
| tapered_corners | BOOLEAN | true | — |
| flip_input | BOOLEAN | false | — |
| blur_radius | FLOAT | 0.00–100 | — |
| lerp_alpha | FLOAT | 1.000–1 | — |
| decay_factor | FLOAT | 1.000–1 | — |
| fill_holesopt | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| mask | MASK | — |
| mask_inverted | MASK | — |