Nodes/KarmaNodes/Karma Film Grain
ComfyUI Node

Karma Film Grain

The cheapest realism upgrade you'll find

By KarmaSwint·Created about a year ago·Updated 5 months ago· 1
Karma Film Grain
  • image
  • image
strength0.10
grain_size1.0
seed0

The single most common giveaway that an image is AI-generated is that it's too clean. No noise, no grain, no imperfection - just perfectly flat digital polish. People spend entire LoRA budgets chasing "amateur photo" aesthetics; this node does a big slice of that job in one step, on anything you already generated. Karma Film Grain overlays an analog-style film grain that reads as "captured on film" rather than "textured with noise."

The mechanism is more considered than most grain nodes. Instead of one flat noise layer, it builds multi-layer grain, and it's luminance-aware: darker areas get more grain, like real film where shadow grain is the most visible part of the grain structure. You get three inputs that matter - strength (0.01–1.0, default 0.1), grain_size (0.1–5.0, default 1.0), and seed - plus the image in, image out. That's the whole node, and that's a feature: nothing to overthink.

The practical starting points are in the README and they're honestly the right ones. For a believable film look you want strength around 0.05–0.15 - grain you feel more than see, which is exactly where it stops looking like a filter. Push 0.2–0.4 with grain_size 2.0–3.0 for a deliberate vintage character, and drop grain_size to 0.5–1.0 on high-res output so the particles don't turn into blobs. The seed matters more than people expect: lock the same seed across a series or video frames and the grain pattern stays consistent between them, which is what makes a set look like it was shot on the same roll.

One implementation detail worth knowing: the node uses scipy's zoom to scale the grain pattern up to your image size, and it's the one node in this pack that actually leans on scipy. If scipy isn't importable it falls back to a simpler numpy-based pattern and prints a warning - so if you see that line in the console, pip install scipy is the fix, not a mystery.

Installing it

Search "KarmaNodes" in ComfyUI Manager, or:

cd ComfyUI/custom_nodes
git clone https://github.com/KarmaSwint/ComfyUI-KarmaNodes
cd ComfyUI-KarmaNodes
pip install -r requirements.txt

Restart ComfyUI. requirements.txt already includes scipy, so in a normal install you'll never see the fallback at all. No models to download - it's pure Python.

Where it fits

Grain is a finishing step. The pack's own suggested pipeline runs tone curves, color, lens FX, and then grain last, which is the right instinct: grain lands on top of everything and reads as part of the capture, not as a texture fighting your color grade. It also plays beautifully with the pack's Film Emulation node - if you want Portra's color but not its default grain, set grain_override to 0 there and add this node separately where you control it directly.

The honest caveat: grain won't fix a bad image, and at high strength on a clean render it starts to look like Instagram's "film" filter rather than film. But at the subtle end - which is where this node is actually good - it's the difference between an image that looks rendered and one that looks photographed. That's a big return for a single node with three inputs.

CategoryKarmaNodes/Post-Processing

Inputs (4)

NameTypeDefaultDescription
imageIMAGEInput image to apply film grain to
strengthFLOAT0.100.01–1Intensity of the film grain effect
grain_sizeFLOAT1.00.1–5Size/scale of grain particles
seedINT00–2147483647Random seed for reproducible grain patterns

Outputs (1)

NameTypeDescription
imageIMAGE