Latent Frequency Split
Separate a latent's detail from its shapes
- latent
- mask
- low_pass
- high_pass
Every image has two halves: the broad, soft stuff (lighting, large shapes, composition) and the fine stuff (texture, edges, grain). Latent Frequency Split pulls those apart in latent space, handing you a low_pass band containing the first half and a high_pass band containing the second. Once they're separated, you can treat them differently - and that's where all the interesting workflows come from.
Sharpening is the classic example: boost the high-pass band on the way back in, and edges snap without the whole image getting crunchy. Denoising is the reverse - attenuate the high band and keep the structure. But the more creative use is cross-latent surgery: take the low-pass from latent A and the high-pass from latent B, recombine, and get "A's shapes with B's texture." That's a genuinely latent-space-only move; in pixel space you'd call it frequency-domain compositing and it'd cost a lot more than this does.
How it works
The mechanism is one Gaussian blur and one subtraction:
- low_pass = Gaussian-blur the latent with
sigmaas the radius. - high_pass =
latent - low_pass.
Set sigma to the frequency cutoff you care about. Higher sigma = a heavier blur = more detail gets pushed into the high band (because the low band keeps less of it). At sigma <= 0 the node short-circuits: low_pass is the input and high_pass is zeros, which is a clean way to check your wiring. It handles 4D and 5D latents the same way the pack's other filters do.
The outputs are two LATENT values, low_pass and high_pass, and here's the important part: the split is lossless in the sense that low_pass + high_pass reconstructs the original exactly. So you can split, do nothing, and merge - you get your latent back bit for bit. Every edit happens in the gap between.
Installing it
Part of the Skoogeer-Noise pack. ComfyUI Manager: search "Skoogeer-Noise", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
# restart ComfyUI
Standard deps, no downloads.
Gotchas
LatentFrequencySplit→LatentFrequencyMergeshould be identity. If you're not getting your original back, one of the gains in the merge node isn't at 1.0, or you edited a band in between.- The high band looks like nothing. It's supposed to - a high-pass of an image is mostly invisible gray with edges. Judge it by what it does when recombined, not by how it previews.
- Don't confuse this with the conditioning frequency split also in the pack. That one separates text-embedding tokens; this one works on latents. Different data, different workflow.
- Flux.2 users: patchified latents are 2x2-blocked, so the Gaussian blur smears across patch blocks. Unpatchify → split → patchify, per the pack README, if you're on Flux.2.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | Latent to decompose into low/high frequency bands. | |
| sigma | FLOAT | 1.50–20 | Radius of the Gaussian used for the low-pass. Higher values move detail into the high band. |
| maskopt | MASK | Optional mask (often image-sized) to limit the split to masked areas. The mask is resized to latent resolution (bicubic when downscaling). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| low_pass | LATENT | — |
| high_pass | LATENT | — |