Image Noise Inject ποΈ
The cheapest fix for the too-clean AI look
- image
- image
Real cameras have noise. AI output doesn't - and that too-clean, too-smooth look is one of the biggest tells that an image was generated. Adding grain back is the single cheapest move for breaking it: a deterministic noise pass that costs milliseconds and makes a render read as captured rather than synthetic. That's exactly the job of Image Noise Inject, and it's the most "just use it" node in this pack.
Pick noise_type from four flavors: gaussian (classic film grain), uniform, perlin (smooth, structured noise - good for organic texture rather than sensor grain), and salt_pepper (sparse white/black specks, more of an artifact look - mostly for stylized purposes). Then blend_mode: add (brighten with noise), multiply (darkens via grain, closer to how real film density works), or lerp (linear blend toward the noise field). strength (default 0.08) scales how much noise lands on the image - start low; grain is something you add in increments.
The two knobs that matter for the "real photo" goal: monochrome (default on) applies the identical noise pattern to R, G and B - that's the classic film-grain look, luminance-only grain that doesn't turn into colored speckle. Turn it off and each channel gets independent noise, which reads as chromatic/film-fuji-style color noise, harsher and usually less what you want. And seed makes it deterministic - same seed, same grain, every time. That reproducibility matters when you're matching grain across a batch of frames or a video; the pack's Video Motion Trail and friends lean on the same principle.
Output is the single image - the noised frame. It slots naturally at the end of a pipeline, right before save: VAEDecode β this node β Save. For video batches, feeding the whole frame batch through with one seed gives you consistent grain per frame (the same pattern repeated), which is a reasonable approximation of static grain; if you want true animated grain you'd vary the seed per frame.
The honest context from the wider conversation: grain is folk-standard practice for killing the AI look. The canonical recipe people cite for realism is motion blur + camera shake + grain + red-channel aberration + vignetting - and this node covers the grain slice of that stack (plus a separate Vignette & Glow node in the same pack covers another). It is not a substitute for a real film-emulation pipeline or a trained "film look" LoRA; it's the mechanical base layer, and it's exactly as much as most images need.
One caution: strength goes to 1.0, but at the top end you're not adding grain, you're burying the image in it. 0.03β0.12 is the realistic working range for the "shot on film" look. Also worth remembering - salt_pepper at any real strength looks like a damaged sensor, not film, so reserve it for intentional artifacts.
Install
Part of OmniNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Restart ComfyUI, or install "OmniNodes" via ComfyUI Manager. No extra dependencies - pure PyTorch/NumPy.
Troubleshooting
- Grain looks like colored speckle -
monochromeis off. Turn it on for classic luminance grain. - Grain changes between runs -
seedis being randomized (or is a random input). Set a fixed seed for reproducibility. - Image is buried in noise -
strengthis too high. The working range is 0.03β0.12.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| noise_type | COMBO | 4 options: gaussian, uniform, perlin, salt_pepper | |
| blend_mode | COMBO | 3 options: add, multiply, lerp | |
| strength | FLOAT | 0.080β1 | β |
| seed | INT | 00β4294967295 | β |
| monochrome | BOOLEAN | true | β |
| clamp_output | BOOLEAN | true | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |