Grain
Fake film noise for a real film feel
- image
- image
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-GaussianorUniform. 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-GaussianorUniform.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.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| intensity | FLOAT | 0.100–1 | — |
| grain_typeopt | COMBO | 2 options: Gaussian, Uniform | |
| monochromeopt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |