🌫️ 智绘_添加噪波
Add film grain to a finished render without touching the sampler
- images
- 噪波图像
You've got a render that's too clean. Flat, plastic, obviously diffusion-baby-smooth - and the fastest fix in the book is grain. ZH_AddNoise (🌫️ 智绘_添加噪波) is that fix: it takes a finished image and lays a controllable noise overlay on top of it. No sampler, no latent space, no model reload. It's the node you reach for when you want a scan look, an 80s film texture, or a grain match between frames, and it's the sibling of the pack's ZH_GenerateNoise, which makes noise from scratch instead of adding it to an existing image.
How it works
Under the hood this is plain numpy math, and honestly that's a feature. It pulls each image tensor off the GPU, generates a noise array in one of five flavors, and adds it pixel-by-pixel scaled by intensity. The five noise types in the dropdown are:
- 高斯噪波 (Gaussian) - the default, and the one that reads as classic film grain. Evenly speckled, subtle at low intensity.
- 椒盐噪波 (Salt & pepper) - random white and black dots. Good for "old damaged photo" or TV-static vibes.
- 均匀噪波 (Uniform) - even mid-tone speckle, lighter touch than Gaussian.
- 泊松噪波 (Poisson) - photon-count noise, the kind low-light digital photos actually produce.
- 混合噪波 (Mixed) - a blend of the above, for when one type feels too mechanical.
There's a monochrome toggle that switches between grey-scale grain and color noise. Grey grain is the safe default for matching a photoreal film look; color noise can punch up stylized or neon-heavy images but tends to look like a broken sensor if you overshoot.
The inputs that matter
Three things actually matter here. intensity (0–1, default 0.1) is the whole game - the tooltip is unambiguous: 0 is no noise, 1 is maximum noise. Start at 0.05–0.1 and nudge up until the banding or flatness disappears; you'll almost never want above 0.3 for film grain. seed controls which pattern you get; 0 means random each run, so set it if you need the grain to match across frames in a sequence. noise_type is the flavor picker above. The output is a single 噪波图像 (IMAGE) socket - wire it straight into your save node or into a compositor.
Install
This is one node in the 智绘灵箱 (ComfyUI-ZhiHui) pack by zhuyungen. Install the whole pack, not the node:
cd ComfyUI/custom_nodes
git clone https://github.com/zhuyungen/ComfyUI-ZhiHui.git
Then restart ComfyUI, or use ComfyUI Manager and search "智绘灵箱" / "ComfyUI-ZhiHui". This node only needs torch/numpy/Pillow, which you already have - but the pack's requirements.txt also pulls heavier ML deps (rembg, transformers, onnxruntime) because other nodes in it need them. Annoying, but harmless: they just sit there.
Where people get burned
- Seed 0 isn't a fixed seed. The tooltip says it plainly: 0 = random. If you want reproducible grain for a video sequence, set an actual number.
- It's destructive and post-hoc. This operates on the IMAGE, not the latent, so it bakes grain into the pixel output. That's what you want for final polish; it's the wrong tool for "make the sampler generate grain" - that's a different workflow entirely.
- Batch-friendly but CPU-ish. It's simple numpy, so it's fast, but it does round-trip through PIL-free tensor math per image. For a 64-frame video that's fine; just don't expect it to be the bottleneck.
The honest take: if you've got an image that reads too clean, this is one node and one slider - intensity at 0.08, monochrome on - and the flatness is gone. Cheaper than any "add grain" upscaler detour, and you can see exactly what it did.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| noise_type | COMBO | 高斯噪波 | 5 options: 高斯噪波, 椒盐噪波, 均匀噪波, 泊松噪波, 混合噪波 |
| intensity | FLOAT | 0.100–1 | 噪波强度:0为无噪波,1为最大噪波 |
| seed | INT | 00–18446744073709550000 | 随机种子(0为随机) |
| monochrome | BOOLEAN | false | 单色噪波(灰度)或彩色噪波 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| 噪波图像 | IMAGE | — |