Image Reaction-Diffusion
Grow Some Biology Into Your Image
- image
- mask
- IMAGE
Most "noise" tools add randomness. Image Reaction-Diffusion runs a simulation instead - the Gray-Scott reaction-diffusion model, the same equations that grow the patterns on fish, leopards, coral, and chemical beakers - and then injects the resulting pattern into your image. The result is texture that looks alive: spots, stripes, labyrinth-like corridors, branching coral forms. It's the most "emergent" node in the Skoogeer-Noise pack, and if you're making organic surfaces or background textures, it's worth knowing.
The model is a classic: two chemicals, U and V, diffuse across the grid while reacting with each other. Tiny changes in how fast U is fed in (feed_rate) or how fast V dies (kill_rate) flip the whole pattern between spots, stripes, and chaos. That sensitivity is the fun part - it's a treasure hunt for pattern parameters - and also the part that will eat an afternoon.
How it works
The node seeds a grid, runs iterations Gray-Scott steps (each step diffuses and reacts U and V), and ends up with a concentration pattern that's normalized and added to the image at strength relative to the image's standard deviation. The two big knobs are the classic F/K pair: feed_rate (F) and kill_rate (K). The defaults, F=0.036 and K=0.065, sit in the classic spot/stripe territory. channel_mode reuses one simulation for all channels or reruns it per channel (expensive); temporal_mode locks the pattern across video frames or reruns per frame.
The inputs that matter
image- target image.seed- initial chemical concentrations; changes the pattern.iterations- simulation length (1–2000). More steps = more evolved pattern, slower.feed_rate/kill_rate- the pattern-shape dials. Small changes, big differences.strength- how hard the pattern pushes into the image.
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 torch, numpy>=1.26, einops, pyyaml>=6.0.3 - nothing heavy to fetch.
Common gotchas
Patience is the main requirement. Each simulation is a loop over the whole grid, iterations times, and per_channel multiplies that by your channel count - a 2000-iteration, per-channel run on a big image is real compute, not a moment. The other trap is the F/K sensitivity: nudge feed_rate by 0.001 and your spots become stripes, which is a feature until you're chasing a specific look. And remember the pattern is added, so at high strength the texture dominates and the original image becomes a distant memory. Start low, preview, evolve.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image that will receive reaction-diffusion patterns. | |
| seed | INT | 00–18446744073709550000 | Seed for the initial chemical concentrations. |
| iterations | INT | 2001–2000 | Number of Gray-Scott simulation steps. |
| feed_rate | FLOAT | 0.0360–0.1 | Feed rate (F) controlling how quickly chemical U is replenished. |
| kill_rate | FLOAT | 0.0650–0.1 | Kill rate (K) regulating removal of chemical V. |
| diffusion_u | FLOAT | 0.160–1 | Diffusion rate for chemical U. |
| diffusion_v | FLOAT | 0.080–1 | Diffusion rate for chemical V. |
| time_step | FLOAT | 1.000.01–5 | Simulation time step used during integration. |
| strength | FLOAT | 0.750–5 | Scale of the normalized pattern relative to the image's standard deviation. |
| channel_mode | COMBO | shared | Reuse one simulation for all channels or rerun per channel. |
| temporal_mode | COMBO | locked | locked reuses the same pattern for every frame; animated reruns the simulation per frame. |
| maskopt | MASK | Optional mask (often image-sized) to limit the pattern injection to masked areas. The mask is resized to the image resolution (bicubic when downscaling). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |