Nodes/MachinePainting Nodes/πŸ‘Ύ Noise Grain Pro
ComfyUI Node

πŸ‘Ύ Noise Grain Pro

Real film grain without the film β€” grain size, sharpness, and six blend modes

By machinepaintingΒ·Created 10 months agoΒ·Updated 4 months agoΒ· 9
πŸ‘Ύ Noise Grain Pro
  • image
  • mask
  • image
β—„blend_modeoverlayβ–Ί
β—„amount0.50β–Ί
β—„size1.0β–Ί
β—„sharpness0.50β–Ί
β—„saturation0.00β–Ί
β—„monochromatictrueβ–Ί
β—„seed0β–Ί

The photorealism tell isn't sharpness, it's the opposite: AI images are too clean. Real photos have grain - a little texture that stops flat gradients from banding and keeps skin from looking like polished plastic. πŸ‘Ύ Noise Grain Pro is a film-grain generator that adds that texture properly: independent grain size, sharpness, mono/color control, six industry blend modes, a seed for reproducibility, and mask support so you can grain a subject but not its background. It's the "make it feel like a photograph" pass.

How it works (the interesting bit)

The mechanism is smarter than just adding random noise to every pixel. Grain size is faked by generating the noise at a reduced resolution, then upscaling it to the image - the bigger the size value (0.5 to 10), the lower the noise resolution, so grain particles get visibly chunkier without looking like digital static. sharpness (0–1) works inversely: lower sharpness blurs the noise more, giving soft, diffused grain; higher keeps it crisp. In monochromatic mode it's single-channel noise broadcast to RGB; turn it off and you get per-channel color noise with saturation controlling the color intensity.

Then the grain is normalized and blended into the image using one of six modes - overlay, soft_light, hard_light, linear_light, multiply, screen. The README is explicit that soft light uses the correct W3C/Photoshop formula, which is the kind of detail that separates a usable grain node from a toy. amount (0–1) mixes the blended result with the original, and an optional mask limits where grain lands.

Inputs and outputs worth knowing

Required: image and blend_mode. Optional: amount, size, sharpness, saturation, monochromatic, seed, mask. The one beginners trip on is seed - it defaults to 0, and since grain is random, every run looks different unless you fix a seed. If you want reproducible grain across runs, set it once and keep it. Output is a single image (the node is marked as an output node, so it renders in-graph as your final/preview step).

When to use it (and when not)

Classic move: after upscaling, grain gets scaled away, so adding grain after your upscale pass is the standard order. It also quietly fixes banding in skies and smooth gradients - a touch of grain plus the right blend mode (soft light is gentle, overlay is a bit stronger, linear light is aggressive) hides posterization. That's the overhyped-thing caveat, though: a light hand. Grain is a seasoning, not a filter; crank amount to 1 with linear light and you've just made your clean render look like a noisy scan. Start at 0.2–0.4, size 1–2, and judge on the final image, not the zoomed preview.

Installing it

Ships in the MachinePainting Nodes pack. ComfyUI Manager β†’ search "MachinePaintingNodes", or:

cd ComfyUI/custom_nodes
git clone https://github.com/machinepainting/ComfyUI-MachinePaintingNodes.git

Restart ComfyUI. The pack's requirements are opencv-python-headless, numpy<3, rembg; grain itself uses numpy + OpenCV, so expect it to run on CPU fine.

Gotchas

  • Seed 0 default means non-reproducible grain. If you're comparing two renders, lock the seed or the grain difference will fool you into thinking a parameter changed something.
  • Mask input shapes are resized to match, which is polite, but a low-res mask upscaled to 4K gives soft boundaries - upscale the mask if you want a crisp grain cutoff.
  • Big size values on huge images make the upscale interpolation obvious if you look close; 10 is basically "add film texture," not "add grain."

It's the one filter in this pack I'd call genuinely pleasant to use - and with the correct soft-light math, it doesn't make your image look worse while pretending to be filmic.

CategoryMachinePaintingNodes/Filter

Inputs (9)

NameTypeDefaultDescription
imageIMAGEβ€”
blend_modeCOMBOoverlay6 options: overlay, soft_light, hard_light, linear_light, multiply, screen
amountoptFLOAT0.500–1β€”
sizeoptFLOAT1.00.5–10β€”
sharpnessoptFLOAT0.500–1β€”
saturationoptFLOAT0.000–1β€”
monochromaticoptBOOLEANtrueβ€”
seedoptINT00–4294967295β€”
maskoptMASKβ€”

Outputs (1)

NameTypeDescription
imageIMAGEβ€”