XWAVE Noise Effect
A film-grain node that actually understands midtones
- image
- IMAGE
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 forcolorednoise.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:
perlinpattern,screenblend at 0.4–0.6 - cloudy, ethereal. - VHS static:
digitalat higher intensity with a touch of color_variation. - Old paper speckle:
salt_pepperat 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 = 0is 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_coloronly matters forcolored. Set a dramatic hex and pickfilm_grainexpecting 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.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| noise_type | COMBO | 5 options: film_grain, digital, colored, salt_pepper, gaussian | |
| intensity | FLOAT | 0.300–1 | — |
| grain_size | FLOAT | 1.00.5–5 | — |
| color_variation | FLOAT | 0.200–1 | — |
| blend_mode | COMBO | 4 options: overlay, add, multiply, screen | |
| pattern | COMBO | 3 options: random, perlin, cellular | |
| noise_coloropt | STRING | #FFFFFF | Base color for colored noise in hex format (e.g., #FFFFFF for white) |
| seedopt | INT | 00–4294967295 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |