ComfyUI Node

Grain

Fake film noise for a real film feel

By isekai-sh·Created 9 months ago·Updated 8 months ago· 3
Grain
  • image
  • image
intensity0.10
grain_type
monochrometrue

IsekaiGrain adds film grain - random luminance noise on top of your image. It's the finishing layer that makes clean digital renders read as shot-on-film, and it has a second, sneakier job: covering up banding. When a smooth sky shows ugly color steps after compression, a whisper of grain is the classic fix. For both jobs, this node is a one-trick pony that does the trick well.

How it works

The image converts to a numpy array and random noise gets added to it, with three choices deciding the character of that noise:

  • intensity (0–1, default 0.1) - how much noise. 0.1 is a subtle texture; 0.3+ starts looking like a deliberate film stock effect.
  • grain_type - Gaussian or Uniform. Gaussian noise is normally distributed, so it's mostly fine mid-level speckle with occasional outliers - the natural film look. Uniform noise is evenly distributed, which reads slightly more "digital static." Gaussian is the one you want for film grain.
  • monochrome (default on) - when on, the same noise is applied to all three color channels, so grain shows as luminance texture with no color cast. Turn it off and each channel gets independent noise, which shows up as colored speckle. Monochrome is almost always the right call.

Real film grain has a granular texture that's more complex than pure noise, but for the vast majority of "make it look filmic" moments this is indistinguishable at a glance.

The inputs

  • image - the image to grain.
  • intensity - 0–1, default 0.1.
  • grain_type - Gaussian or Uniform.
  • monochrome - boolean, default on.

Output is a single image tensor.

Installing it

Part of isekai-comfy-node:

ComfyUI Manager: search "isekai" → install isekai-comfy-node → restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/isekai-sh/isekai-comfy-node
cd isekai-comfy-node
pip install -r requirements.txt

Restart and it's under Isekai → Image/Effects. Pillow and requests; no models, no downloads.

Common issues

The one real gotcha: the noise is generated fresh from np.random every run, with no seed. So the same workflow produces a different grain pattern each time. For most uses that's fine (nobody stares at grain like a fingerprint), but if you're doing pixel-perfect comparisons or need identical output across runs, know that grain is the thing that'll differ. There's no seed input to pin it down.

Also remember grain adds noise to everything, including already-noisy areas - apply it late in the pipeline, after any upscaling, and keep intensity modest. And the pack-wide batch caveat applies: first frame only.

CategoryIsekai/Image/Effects

Inputs (4)

NameTypeDefaultDescription
imageIMAGE
intensityFLOAT0.100–1
grain_typeoptCOMBO2 options: Gaussian, Uniform
monochromeoptBOOLEANtrue

Outputs (1)

NameTypeDescription
imageIMAGE