Film Grain
Your AI Images Are Too Clean. Add Some Grain.
- image
- image
The most common complaint about AI photography isn't the hands, it's the smoothness - that sterile, airbrushed, zero-texture look. Film grain is the classic fix, and the photorealism crowd has been doing it for years: adding analog grain back paradoxically makes renders read as more real. KikoFilmGrain does that with a proper little film-emulation pipeline instead of a dumb noise overlay.
How it works
The effect is applied in luminance, not RGB chaos. The node converts your image to YCbCr using ITU-R BT.709 coefficients (the HD color space, which matters if you're pushing toward a video/delivery pipeline), adds grain scaled by the scale parameter, then converts back. Doing the grain in the luminance channel is what keeps it looking like film grain rather than digital static - color channels stay mostly clean.
Beyond the basics it borrows a real film-print behavior. The toe parameter lifts the shadows a touch, mimicking the shadow response of film stocks (that's the "toe" of the film characteristic curve, the region where shadows compress) - bump it slightly and the blacks open up the way they do on a film scan. The implementation preserves the alpha channel when your image has one, and the whole thing is done in PyTorch so it handles batches without melting your RAM.
Inputs that matter
- scale - grain size, 0.25 to 2.0, default 0.5. Smaller = finer grain (closer to a fine 35mm stock), larger = chunky 16mm-style.
- strength - intensity, 0 to 10, default 0.5. This slider has a huge range; realistic values usually live under 2.
- saturation - color of the grain, 0 to 2, default 0.7. 0 gives monochrome grain, which is often the most convincing.
- toe - shadow lifting, −0.2 to 0.5, default 0. A little positive value gives that lifted, "film print" black level.
- seed - INT, for reproducible grain. Same seed, same noise, every time.
Output is a single image, ready to feed your save or a further pass.
Where it fits
This is a finishing node - it goes at the end of the pipeline, after upscaling, right before save. The community's realistic-FLUX playbook of the last couple years explicitly includes grain and imperfect-camera aesthetics as the way to make renders look like photographs rather than renders, and this node packages that into one step. It's also handy for consistency: throw a fixed seed in, and every image in a batch gets the same grain, which matters when you're assembling a contact sheet or a series.
Installing it
Pack install: ComfyUI Manager → "ComfyUI-KikoTools" → Install → restart, under ComfyAssets → Images. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ComfyAssets/ComfyUI-KikoTools.git
cd ComfyUI-KikoTools
pip install -r requirements.txt
Restart ComfyUI. No model downloads.
Gotchas
The toe slider is the one that silently ruins your image if you max it: it raises black levels toward gray, and at 0.5 everything looks washed out on purpose. Start near 0 and nudge. And if your grain reads as static instead of film, it's almost always scale too small relative to strength - drop the strength and raise the scale. One more: grain is resolution-sensitive, so if you apply it before upscaling, the upscaler will smooth it right back out; put it after.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| scale | FLOAT | 0.500.25–2 | — |
| strength | FLOAT | 0.500–10 | — |
| saturation | FLOAT | 0.700–2 | — |
| toe | FLOAT | 0.000-0.2–0.5 | — |
| seed | INT | 00–4294967295 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |