Film Grain
The grain that makes AI images look like photographs
- image
- image
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.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| iso | INT | 40050–3200 | Film speed. Higher ISO = coarser, more visible grain |
| strength | FLOAT | 0.500–1 | Overall grain intensity |
| color_grain | FLOAT | 0.300–1 | Per-channel grain variation. 0 = luminance only, 1 = full color grain |
| seed | INT | 00–4294967295 | Random seed for reproducible grain pattern |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |