Image Fractal Brownian Motion
Pick Your Noise Primitive, Layer It, Done
- image
- mask
- IMAGE
If the pack's Perlin node is "smooth organic texture," this is the one-stop shop for choosing your texture flavor. Image Fractal Brownian Motion builds the same kind of layered fractal noise - fBm, for short - but lets you pick the base primitive: simplex, perlin, or worley. Perlin gives you the smooth gradient look, simplex is its slightly cheaper, slightly more organic cousin, and Worley produces the cellular, bubble, crackled patterns you'd recognize from lava lamps and lizard skin. One node, three texture personalities.
fBm itself is the workhorse of procedural graphics: take a base noise, add it at increasing frequencies with decreasing amplitude, and you get detail at every scale that still reads as one coherent material. It's why mountains look mountainous and clouds look cloudy instead of either flat or static-y. If you want to inject that into an image - subtle surface variation, a background texture, texture blending - this is the node.
How it works
The octaves parameter is the number of layers stacked on top of each other; lacunarity is how fast the frequency climbs between layers, and persistence is how fast the amplitude shrinks. Worley-specific knobs (feature_points, distance_metric, jitter) only do anything when base_noise = worley, so you can ignore them the rest of the time. The normalized result is scaled by the image's standard deviation times strength, keeping the knob meaningful across different inputs. channel_mode shares one field across channels or reseeds per channel; temporal_mode locks the pattern across video frames or animates it.
The inputs that matter
image- target image.base_noise-simplex(default),perlin, orworley.octaves- layer count; 4–6 is the sweet spot.strength- intensity, relative to image std.channel_mode/temporal_mode- per-channel vs shared, and frame-locked vs animated.
Output is the perturbed IMAGE.
Installing it
Part of Skoogeer-Noise. Manager → search "Skoogeer-Noise", or:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
Restart ComfyUI. Deps are the ComfyUI-standard torch, numpy>=1.26, einops, pyyaml>=6.0.3; no model downloads.
Common gotchas
The trap is dialing octaves up in search of detail and wondering why your machine is chugging - every octave is another full-res pass, and the cost adds up fast, especially with Worley (which has to scan feature points). Also, base_noise changes more than the texture: the whole character of the field flips, so tune frequency after you pick a base, not before. And if you go per_channel on an RGB image, each color channel gets an independent pattern - great for rainbow textures, confusing if you wanted monochrome grain and didn't realize why the hue was drifting.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image to enrich with fractal Brownian motion. | |
| seed | INT | 00–18446744073709550000 | Seed for the base noise generator. |
| base_noise | COMBO | simplex | Noise primitive accumulated by the fBm stack. |
| frequency | FLOAT | 2.000.01–64 | Fundamental frequency for simplex/perlin bases (acts as a multiplier for Worley). |
| feature_points | INT | 161–4096 | Base feature point count (used when base noise is Worley). |
| octaves | INT | 51–12 | Number of fBm layers to accumulate. |
| persistence | FLOAT | 0.500–1 | Amplitude multiplier between fBm layers. |
| lacunarity | FLOAT | 2.01–6 | Frequency multiplier between fBm layers. |
| distance_metric | COMBO | euclidean | Distance metric used when the base noise is Worley. |
| jitter | FLOAT | 0.350–1 | Feature jitter amount for Worley base noise. |
| strength | FLOAT | 0.500–5 | Scale of the normalized fBm field relative to the image's standard deviation. |
| channel_mode | COMBO | shared | Shared fBm field per sample or reseeded per channel. |
| temporal_mode | COMBO | locked | locked reuses the same fBm per frame; animated reseeds each frame. |
| maskopt | MASK | Optional mask (often image-sized) to limit the noise injection to masked areas. The mask is resized to the image resolution (bicubic when downscaling). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |