Image Noise
Seeded Grain for Images, Without the Guesswork
- image
- mask
- image
Adding noise to an image in ComfyUI is one of those things you'd think would be trivial, and then you discover that "random" isn't reproducible, or your noise strength means nothing because the image and the noise are on totally different scales. Image Noise from the Skoogeer-Noise pack fixes both: it's a seeded Gaussian-noise adder where strength is expressed relative to the image's own standard deviation, so 1.0 always means "about as much noise as the image already contains" no matter what you feed it. The name is the whole job description.
You reach for this in the obvious places: adding film grain, breaking up banding in flat gradients, jittering a generated image before it goes into a ControlNet or an upscaler, or testing how much perturbation an image survives before it stops looking like the same picture. Because it's seeded and the seed offsets per batch item, the same graph re-runs give you the same grain, and batches stay deterministic regardless of size - that's the part most DIY noise nodes get wrong.
How it works
Under the hood it's refreshingly simple. The node draws a torch.randn tensor with the same shape as your image, then scales it by the image's standard deviation times strength before adding. Because the scale is computed per-sample from the actual input, a dark, flat image and a bright, textured one both get noise that's proportional to what's already there - strength means the same thing across wildly different inputs. The generator is seeded on CPU with a masked 64-bit seed, so results are reproducible, and batch index is folded into the seed so each item in a batch is deterministic on its own.
The inputs that matter
image- your input tensor (BHWC, or a 5D video tensor if you're feeling fancy).seed- the reproducibility knob. Same seed, same noise, forever.strength- relative to the image's std, so1.0≈ the image's own variance. Start at0.1–0.3for subtle grain;1.0is a lot.mask(optional) - limits the noise to masked areas. It gets resized to image resolution, bicubic when downscaling.
Output is a single image (IMAGE) you can wire straight into whatever comes next.
Installing it
It ships in the Skoogeer-Noise pack, so install the pack, not this node alone. Easiest is ComfyUI Manager: search for "Skoogeer-Noise" and install. Or, from the terminal:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
Then restart ComfyUI. Dependencies are torch, numpy>=1.26, einops, and pyyaml>=6.0.3 - ComfyUI almost certainly has all of those already, so there are no extra downloads and no model files to fetch. This is one of the rare custom nodes where install is genuinely painless.
Common gotchas
The trap is thinking of strength as an absolute amount. It isn't - it's a multiple of the input's standard deviation. Crank it to 1.0 on a clean synthetic image and you'll get something you could barely call the same picture. Also note the mask gets resized to the image resolution, so a low-res mask isn't a problem, but a hard-edged mask edge stays hard-edged. And if you're here because you wanted to add sampler noise to a latent before KSampler, this is the wrong node - that's Latent Noise's job, and there's one in this pack too.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image to receive additional Gaussian noise. | |
| seed | INT | 00–18446744073709550000 | Seed for generating repeatable noise. |
| strength | FLOAT | 1.000–10 | Noise strength relative to the image's standard deviation. |
| maskopt | MASK | Optional mask (often image-sized) to limit the noise addition to masked areas. The mask is resized to the image resolution (bicubic when downscaling). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |