Nodes/toobusy/2BZ Retouch Blend (skin-aware)
ComfyUI Node

2BZ Retouch Blend (skin-aware)

Add Texture Everywhere, Go Gentle on the Skin

By nicekriss·Created about a year ago·Updated a day ago· 21
2BZ Retouch Blend (skin-aware)
  • original
  • restored
  • skin_mask
  • image
  • used_mask
◄strength1.25►
◄skin_strength1.00►
◄blur_sigma3.0►
◄mask_grow8►
◄mask_feather8.0►

What it's for

Same job as 2BZ Frequency Detail Transfer - keep the original's shapes, transplant the restored image's fine texture - with one addition that turns out to matter a lot: a different strength inside a mask, normally skin.

Hair, fabric and metal want texture pushed hard; pores want it dialled back, because over-texturing a face is how a retouch makes someone look ten years older and rough. So this node takes a skin mask and interpolates the strength per pixel: strength outside, skin_strength inside, and it handles resizing, growing and feathering that mask for you - which saves you the mask-blur side quest of assembling the same thing out of Impact Pack nodes.

If you want the plain single-strength version with your own mask, that's 2BZ Frequency Detail Transfer.

How it works

It's the same frequency composite underneath: low = blur(original, σ) carries form and shading, high = restored − blur(restored, σ) carries texture, and the output is low + high × k. What makes it skin-aware is k: instead of a constant, it's strength + (skin_strength − strength) × m, where m is your mask scaled from any size to the image, dilated, then Gaussian-feathered and clamped. Where the mask is white you get skin_strength; where it's black, strength; the feather gives you the ramp between.

The mask is allowed to be a different size from the image - detect it on a small copy and let the node blow it up.

Inputs and outputs that matter

  • original / restored - the source frame and the 2BZ SeedVR2 Tile Restore output. Only the restored image's fine texture is used, so a restored version with slightly different proportions is fine and expected.
  • strength (default 1.25) - texture for everything that isn't in the mask. Under ~0.9 the result is softer than the original.
  • skin_strength (default 1.0) - texture inside the mask. This is your "the faces look older" dial, and it's the first thing to drop.
  • blur_sigma (default 3) - the texture/shape boundary. Smaller transfers only pore-level detail; large values start moving form.
  • mask_grow (default 8) / mask_feather (default 8.0) - pixels of dilation and Gaussian softening on the skin mask. Grow exists because a mask that ends at the jawline leaves a hard texture edge; feather exists for the same reason.
  • skin_mask (optional) - white = skin. Anything that emits a MASK works, including inpainting masks.

Outputs: image, and used_mask - the mask after grow and feather, exactly as the node computed it. Wire that into MaskToImage → Preview Image. It's the single fastest way to debug "why is my skin untouched".

Getting the skin mask

The author's own recipe, from the shipped example workflow, is core SAM3 Detect with the text prompt skin:8 - 8 being an instance cap, the same target:count grammar as everywhere else in SAM3. Two details that make it cheap:

  • Detect on a downscaled copy (ImageScaleToTotalPixels to ~2 MP), which the example does. The mask gets resized to the full image anyway.
  • If skin isn't caught: face:4, hand:4, neck:4, or skin:16 on a crowded sheet.

Worth copying from that example: two nodes, one at strength 1.25 / skin_strength 1.0 for the crisp version and a second at 1.0 / 0.9 for the safer one, saved side by side so you can pick.

Install

Part of the toobusy pack, added in v0.5.4 alongside SeedVR2 Tile Restore and Frequency Detail Transfer.

cd ComfyUI/custom_nodes
git clone https://github.com/nicekriss/toobusy.git toobusy

Manager works - search the pack title - but the registry copy can lag the repo, and the failure looks like a missing node rather than a failed install. Use Install via Git URL, or clone and git pull. Restart afterwards. No extra pip packages; the pack's core dependency list is empty. SAM3 Detect and SeedVR2 are ComfyUI core nodes, so keep ComfyUI current.

Where people get tripped up

Check used_mask first. Nearly every "it did nothing" report is a mask problem: wrong prompt, mask from the wrong frame, or a mask that arrived black-ish - partial mask values mean partial strength, which reads as no effect.

A hard mask edge shows up as a texture seam. The transition between textured and untextured skin is visible as a change in grain, not in brightness - that's what mask_feather is for. Push it up before you lower the strengths.

Don't fight bad texture with strength. If the restored image has craters on the forehead, skin_strength at 1.25 makes them worse; the fix is the restore, not the blend. And this is a texture transfer, not a repair - it can't add detail the restored image doesn't have, and it won't un-melt a face. That one needs the per-box re-render route.

Categorytoobusy/retouch

Inputs (8)

NameTypeDefaultDescription
originalIMAGEThe input image. Its shapes and shading are kept.
restoredIMAGE2BZ SeedVR2 Tile Restore output. Only its fine texture is used.
strengthFLOAT1.250–2Texture strength for hair, clothes, background. Below ~0.9 the image gets softer than the original.
skin_strengthFLOAT1.000–2Texture strength inside the mask (skin). Lower if faces look older or rough.
blur_sigmaFLOAT3.00.5–64Texture / shape boundary. Smaller moves only pore-level detail.
mask_growINT80–256Grow the skin mask by this many pixels.
mask_featherFLOAT8.00–128Soften the mask edge (gaussian sigma, pixels).
skin_maskoptMASKWhite = skin (e.g. SAM3 Detect with skin:8). Without it, strength applies everywhere.

Outputs (2)

NameTypeDescription
imageIMAGE—
used_maskMASK—