Nodes/ComfyUI-ImageBag/Film Grain Noise
ComfyUI Node

Film Grain Noise

One slider between you and the plastic AI look

By NHLStenden·Created about a year ago·Updated 8 months ago· 1
Film Grain Noise
  • image
  • IMAGE
strength0.15

The two-second version

Feed it any image, drag one slider, get the same image back with subtle photographic noise. That's the whole node - two inputs, one output, no model, no texture file, no heavy dependencies. If your final render comes out of the last KSampler looking airbrushed and sterile - waxy skin, smooth gradients, that unmistakable "this never touched a camera" sheen - this is the cheapest way to kill it.

Why film grain earns its place

The photorealism playbook has a quiet step most people skip: adding subtle noise in post makes an image read as captured rather than generated. Some people bake grain in with a LoRA, but that spends prompt budget and locks the look in at generation time - you can't dial it back afterward. Post-processing grain is the flexible version: it's the last thing you do, so you can tune it against the finished image and even A/B it by toggling the node. WAS Node Suite has a film-grain option too, so this isn't a unique feature; what ImageBag's version sells is that it's one clean node with a single strength control.

How it works

The source code is refreshingly short, and the mechanism is worth knowing because it's smarter than "add random noise." It estimates luminance per pixel, then scales the noise amplitude so dark areas get more noise and highlights get less - the same way real sensor noise is most visible in underexposed shadows. On top of that luminance noise it adds a much weaker chroma component, added to red and subtracted from blue, which is what produces the occasional colored speckle instead of a flat gray wash. It runs under torch.no_grad() on whatever device your tensors are on, so it's effectively free - no VRAM concern, works on batches too (each frame gets independent noise).

The inputs that matter

There are only two:

  • image - any IMAGE tensor, batch-friendly, standard ComfyUI 0-1 float range.
  • strength - default 0.15, range 0 to 1. Zero is a passthrough. At 0.15 the grain is genuinely subtle: enough to lift the plastic flatness, not enough to see static. Around 0.3–0.4 it starts reading as heavy ISO; past that it's TV static.

The output is a single IMAGE at the same resolution, which you wire straight into a Save Image or Preview node, or into a final compositing step.

Install

The pack is tiny and ships no models. From the README:

cd ComfyUI/custom_nodes
git clone https://github.com/NHLStenden/ComfyUI-ImageBag.git

Then restart ComfyUI. It's also worth a quick search for "ImageBag" in ComfyUI Manager; if it's not in the catalog (it's a small, lightly-maintained project), the clone above works regardless. Its requirements.txt lists torch and numpy - both already present in any ComfyUI install, so there is nothing heavy to fetch.

Where people get burned

The honest caveat: this is Gaussian noise with a luminance tilt, not a real film-stock grain texture. Real grain has a specific spectral character that reads as "Portra" or "HP5"; this reads as "sensor noise," which is exactly what the node's own docs claim. If you want the look of actual film stock, you're better off with a film-grain LoRA or a texture overlay - this node is the subtle-capture-noise lane.

Two practical traps: apply it after any upscaling or denoise, because those steps will smooth the grain right back out, and don't judge it on a downscaled preview - grain that looks invisible in the node preview can be exactly right at full res. When in doubt, leave the default alone; 0.15 is a good starting point and the whole point is that you can stop fiddling.

Categoryimage/noise

Inputs (2)

NameTypeDefaultDescription
imageIMAGE
strengthFLOAT0.150–1

Outputs (1)

NameTypeDescription
IMAGEIMAGE