Nodes/ComfyUI XWAVE Nodes/XWAVE Noise Effect
ComfyUI Node

XWAVE Noise Effect

A film-grain node that actually understands midtones

By XWAVEart·Created about a year ago·Updated about a year ago· 2
XWAVE Noise Effect
  • image
  • IMAGE
noise_type
intensity0.30
grain_size1.0
color_variation0.20
blend_mode
pattern
noise_color#FFFFFF
seed0

The classic realism trick is boring but it works: adding subtle noise in post makes a generated image look captured instead of generated. XWAVE Noise Effect is the pack's take on that, and the headline feature is that its film grain is luminance-aware - it pours more grain into the midtones and backs off in the shadows and highlights, which is where real film grain actually lives. Cheap noise generators slap static everywhere equally; this one reads like emulsion.

How it works

Five noise types, three patterns, four blend modes:

  • film_grain - luminance-weighted: the grain mask is 4 * L * (1-L), so midtones get the most grain. This is the one you want for realism.
  • digital - thresholded noise, sharp and blocky.
  • colored - tinted noise built from noise_color (hex, default white).
  • salt_pepper - hard black/white speckle.
  • gaussian - smooth, normally-distributed noise.

The pattern input changes the shape of the noise: random is classic static, perlin stacks sine×cosine octaves for organic cloudy texture, and cellular runs a blur-and-threshold cellular automaton (needs scipy). grain_size (0.5–5) resamples the noise to coarser or finer scale - that's your film-grain-vs-film-ISO dial.

Inputs that matter

  • noise_type - the five above.
  • intensity (0–1) - overall noise strength. For realism, 0.1–0.3.
  • grain_size (0.5–5) - particle size; 1 is fine-grained, 5 is chunky.
  • color_variation (0–1) - how much color the grain carries. 0 is monochrome grain.
  • blend_mode - overlay, add, multiply, screen. Overlay preserves detail; add brightens; multiply textures.
  • pattern - random / perlin / cellular.
  • noise_color - optional hex for colored noise.
  • seed - 0 for random, anything else for reproducible results.

Output is a single IMAGE, into Preview/Save.

The recipes

  • Photographic grain: film_grain, intensity 0.15–0.25, grain_size 1–1.5, color_variation 0.05, overlay. Barely-there and it fixes the "too clean" tell.
  • Organic texture: perlin pattern, screen blend at 0.4–0.6 - cloudy, ethereal.
  • VHS static: digital at higher intensity with a touch of color_variation.
  • Old paper speckle: salt_pepper at low intensity.

Installing it

It's in ComfyUI XWAVE Nodes. ComfyUI Manager → search "XWAVE" → install ComfyUI XWAVE Nodes → restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/XWAVEart/comfyui-xwave-xlitch-nodes
cd comfyui-xwave-xlitch-nodes
pip install -r requirements.txt

Pillow, numpy, scipy. The scipy dependency matters here - perlin, cellular, and grain-size resampling all lean on it. It's in requirements.txt, so a normal install gets it; if you skipped the pip step, the noise falls back to plain random and the "structured" options quietly do less.

Gotchas

  • seed = 0 is random, not a seed. The README and the code both treat 0 as "no seed." If you want reproducible grain, use any value 1+.
  • noise_color only matters for colored. Set a dramatic hex and pick film_grain expecting a tint? Nothing happens. It's per-type.
  • Per-frame Python loop. Single images are instant; a video batch with fine grain will chug.

The pack is new and quiet - no community settings wiki to borrow from - but grain is a "taste" node anyway. Start at the realism recipe above, nudge intensity, and stop while it still looks like film, not static.

CategoryXWAVE/Color

Inputs (9)

NameTypeDefaultDescription
imageIMAGE
noise_typeCOMBO5 options: film_grain, digital, colored, salt_pepper, gaussian
intensityFLOAT0.300–1
grain_sizeFLOAT1.00.5–5
color_variationFLOAT0.200–1
blend_modeCOMBO4 options: overlay, add, multiply, screen
patternCOMBO3 options: random, perlin, cellular
noise_coloroptSTRING#FFFFFFBase color for colored noise in hex format (e.g., #FFFFFF for white)
seedoptINT00–4294967295

Outputs (1)

NameTypeDescription
IMAGEIMAGE