ComfyUI Node

Film Grain

The grain that makes AI images look like photographs

By jeremieLouvaert·Created 5 months ago·Updated 3 days ago· 101
Film Grain
  • image
  • image
iso400
strength0.50
color_grain0.30
seed0

Here's a paradox the photorealism crowd keeps rediscovering: the way to make a synthetic image read as a real photograph is often to add noise, not remove it. The modidex photorealism research has a whole section on it - amateur-photography LoRAs that add grain and imperfect lighting make Flux images look more real. Film Grain is that idea as a proper node: it adds luminance-dependent grain the way film actually produces it, instead of a flat, screen-flicker texture.

How it works

Real film grain isn't uniform. It's coarser in the shadows and finer in the highlights, because silver halide clumps cluster differently in dark versus light areas. This node reproduces that behavior as multi-octave, luminance-dependent noise - the noise amplitude scales with local brightness, which is exactly what film does. It's also:

  • ISO-scaled - crank the ISO and grain gets coarser and more visible, like pushing a faster stock.
  • Resolution-aware - the grain scales with image resolution, so you don't get different-looking results at 512×512 versus 4K.
  • Blue-channel-emphasized - real color film has stronger grain in the blue layer, and this reproduces that character rather than applying identical noise to all channels.

Under the hood it uses opensimplex noise (one of the pack's declared dependencies) rather than plain random values, which is what gives it that organic, clumping texture instead of digital static.

The inputs that matter

  • iso - film speed, 50–3200. Higher = coarser, more visible grain. Start at 400 for a subtle classic look; push toward 800+ for visible character.
  • strength - overall intensity, 0–1. This is the one you'll live on; 0.3–0.5 is usually plenty.
  • color_grain - 0–1. How much the grain varies per color channel. 0 is pure luminance noise (cleanest, most subtle); 1 is full color grain (that slightly gritty chroma look of pushed film). 0.3 default is a good film-true starting point.
  • seed - for a reproducible grain pattern. Handy when you want the same grain across a batch.

Output is a single image. Set the seed once, wire everything else, and it's deterministic - no more grain changing between runs.

Where it goes in the workflow

At the very end, after denoising and grading. Grain and denoise fight each other, so the order matters: Noise Reduction first, then your grade, then Film Grain as the final touch before Save Image. It's a spatial effect, so the pack's README explicitly keeps it out of LUT bake chains - if you're exporting a .cube grade, apply grain after extraction, never inside the chain.

One thing this node deliberately isn't: it won't do the fancy film-stock character - the color response, the halation, the print chain. That's what Film Stock (Color) and the spectral nodes are for. This one just does the texture, and does it right. If you want grain that holds a fixed fraction of the frame at any resolution (the physically-correct behavior for a film scan), the pack also ships Film Grain Pro, which uses the Newson et al. 2017 stochastic model - this plain Film Grain is the lighter, faster, "good enough" version.

Installing it

Part of the full ComfyUI-Darkroom pack, installed once:

cd ComfyUI/custom_nodes
git clone https://github.com/jeremieLouvaert/ComfyUI-Darkroom.git
pip install -r ComfyUI-Darkroom/requirements.txt

Or search "Darkroom" in ComfyUI Manager - it will pull in scipy and opensimplex (the latter is exactly for this node's noise). Restart and it's under AKURATE/Darkroom/Film. No GPU, no model downloads, no API - just numpy noise math, fast enough to run in a live loop.

CategoryAKURATE/Darkroom/Film

Inputs (5)

NameTypeDefaultDescription
imageIMAGE
isoINT40050–3200Film speed. Higher ISO = coarser, more visible grain
strengthFLOAT0.500–1Overall grain intensity
color_grainFLOAT0.300–1Per-channel grain variation. 0 = luminance only, 1 = full color grain
seedINT00–4294967295Random seed for reproducible grain pattern

Outputs (1)

NameTypeDescription
imageIMAGE