Latent Perlin Fractal Noise
Smooth, structured variation instead of TV static
- latent
- mask
- LATENT
Plain Gaussian noise is the boring option for perturbing a latent: it's flat, uncorrelated static. Perlin noise is the opposite - it's smooth noise, built from a lattice of gradients, so nearby pixels move together. Add a few octaves of it on top of each other and you get the classic fractal "clouds on a mountain range" look that game devs have been using for terrain since the 90s. This node takes that pattern and injects it into your latent, scaled relative to the latent's own standard deviation.
Why would you want that in a diffusion workflow? Because smooth, structured variation reads as intentional variation once it goes through the sampler. A low strength Perlin bump on a latent nudges the image toward soft, cloud-like detail or gentle color drift; a higher one starts pulling out wave, bark, or flame-like textures depending on your frequency. If you're doing img2img variation hunting and plain noise keeps giving you dead flat copies or chaos, Perlin is the middle path - it decorrelates your latents while keeping spatial structure intact.
The inputs you'll actually set
The fBm-style controls are the classic Perlin stack, and they're all exposed:
frequency(default 2) - the base lattice frequency. Lower = big, broad features; higher = finer detail. This is your main "scale" dial.octaves(default 4) - how many noise layers stack up. Each octave doubles the frequency (vialacunarity) and halves the amplitude (viapersistence). More octaves = richer, more natural detail, marginally slower.persistence(0.5) andlacunarity(2.0) - the classic Perlin pair. Leave them alone until you know what you're doing; the defaults are the community-standard values for a reason.strength(0.5) - how hard the noise hits, scaled relative to the latent's standard deviation rather than in raw units. 0.5 is a gentle nudge; 1.0 is a firm shove.channel_mode-sharedreuses one noise field across all channels (coherent, keeps the RGB relationships intact),per_channelreseeds per channel (more chaotic, more colorful breakup).
seed makes it repeatable, and the optional mask input limits the injection to a region (resized to latent resolution). The single LATENT output drops back into your graph wherever the original latent was headed - typically into a sampler or a VAE decode.
One quirk worth knowing: for 5D latents (B, C, T, H, W - video/flow-matching shape), this node generates genuine 3D Perlin across (T, H, W), so the noise stays temporally coherent by construction. That's why it has no temporal_mode parameter - the image-only siblings do. If you want per-frame reseeding, that's what the Simplex node's temporal_mode: animated is for.
Installing and using it
It's part of the Skoogeer-Noise pack. Install via ComfyUI Manager (search "Skoogeer-Noise"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
then restart ComfyUI. No models to download - the pack's only deps (torch, numpy, einops, pyyaml) are all ComfyUI staples. On Flux.2, remember the latent-noise wrap: Unpatchify Flux.2 Latent → your noise node → Patchify Flux.2 Latent, or the 2x2 patchified channels produce block artifacts.
Common issues
The two failure modes are "nothing happened" and "everything melted." Nothing happened almost always means strength is too low relative to the latent's std - these latents have small variance, so trust the relative scaling and bump strength rather than cranking frequency. Melted usually means frequency and octaves both got cranked; drop octaves back to 3–4 and lower strength. And if your whole image shifts hue rather than gaining structure, flip channel_mode from per_channel back to shared.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | Latent that will be perturbed with fractal Perlin noise. | |
| seed | INT | 00–18446744073709550000 | Seed controlling the procedural noise pattern. |
| frequency | FLOAT | 2.000.01–64 | Base lattice frequency. Higher values produce finer details. |
| octaves | INT | 41–12 | Number of noise layers to accumulate. |
| persistence | FLOAT | 0.500–1 | Amplitude multiplier between octaves. |
| lacunarity | FLOAT | 2.01–6 | Frequency multiplier between octaves. |
| strength | FLOAT | 0.500–5 | Scales the normalized noise relative to the latent's standard deviation. |
| channel_mode | COMBO | shared | Shared noise across channels or unique noise per channel. |
| maskopt | MASK | Optional mask (often image-sized) to limit the noise injection to masked areas. The mask is resized to latent resolution (bicubic when downscaling). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |