SpliceLatents
Change the color, keep the texture — by splicing noised latents
- sigmas
- lower
- upper
- LATENT
This is the flagship node of SpliceTools, and the pitch is one sentence: it takes the low-frequency content of one latent and the high-frequency content of another, and fuses them in latent space. The README's example is the clearest - change a character's hair color while keeping every strand of fine detail intact. Same texture, different underlying content. Do that with plain img2img and you regenerate the hair strands along with the color; do it with a mask and you fight edges forever. SpliceLatents sidesteps both by working on frequency, not on pixels or regions.
How it works
At the step where you run it, your latent is a mix of real content and noise. The trick is that a Gaussian blur acts as a low-pass filter: blur the latent and what's left is approximately the "clean" content; subtract the blur and you get the high-frequency residual - the noise and fine texture. So SpliceLatents:
- Blurs both input latents with a Gaussian kernel.
- Keeps the blurred (low-frequency) version of the lower latent.
- Keeps the residual (high-frequency) part of the upper latent.
- Adds them back together.
The output is blur(lower) + (upper − blur(upper)). Lower-frequency stuff - color, lighting, broad structure - comes from lower; everything fine comes from upper. That's the "splice."
Two controls matter here. radius (INT, default 4) sets the blur kernel window - bigger radius means more of the image counts as "low frequency," so more gets swapped. The kernel's actual sigma is pulled from the last value of the sigmas you feed in, i.e. the noise level of the latents you're splicing, which is why it wants a live SIGMAS wire rather than a fixed number. wetness (FLOAT, 0–1, default 1) blends between the full splice and just adding the two latents. And texture_override (None/Upper/Lower) lets you force the texture channel wholesale from one side when the blur-based split picks the wrong grain - handy for SD 1.5 latents where that channel carries a lot of the surface detail.
Inputs, outputs, and how you actually wire it
lower(LATENT, optional) - the latent whose low-frequency content you keep.upper(LATENT, optional) - the latent whose high-frequency texture you keep.sigmas(SIGMAS, required),radius,wetness,texture_override.- Output: a single LATENT.
At least one of lower/upper must be connected; disconnect the other and it's treated as zeros, which is a legitimate way to use it. The workflow this was built for is the renoise (flip sigmas) pattern: you sample partway, re-noise the result, and sample again - splicing between the two passes so the model only regenerates what you actually want to change. That's why it wants live sigmas: it needs to know how much noise is in the latents at that exact point in the schedule.
Installing it
SpliceTools is pure Python - no requirements.txt, no model downloads, nothing but torch and ComfyUI's own helpers. ComfyUI Manager (search SpliceTools) or:
cd ComfyUI/custom_nodes
git clone https://github.com/AustinMroz/ComfyUI-SpliceTools
Restart and you'll find it under latent → advanced.
Where it bites
Be honest about what this is: it's an experimental node whose author openly says the default numbers are "likely flawed" and that results "produce haloing artifacts which are still being investigated." The halo - a soft dark/light fringe around high-contrast edges - is a direct result of the blur-based frequency split being an approximation rather than a true decomposition. If halos drive you mad, reach for its sibling SpliceDenoised, which does the exact version when your sampler exposes a denoised output. Also note the output is just the samples: any noise_mask on the inputs does not carry through, so don't plan on masks surviving this node.
For the one job it does - swap color/lighting while keeping texture - nothing in stock ComfyUI does it quite like this. Just budget a little time for tuning radius and wetness before it looks clean.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| sigmas | SIGMAS | — | |
| radius | INT | 4 | — |
| wetness | FLOAT | 1.00–1 | — |
| texture_override | COMBO | 3 options: None, Upper, Lower | |
| loweropt | LATENT | — | |
| upperopt | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |