Poisson Noise Image
Realistic camera-sensor grain, not generic static
- image
- IMAGE
Quick flag before anything else: this node doesn't actually appear in the pack's own README node list - it showed up when we pulled the node's live schema straight from the repo, so what follows is grounded in the parameters themselves and general imaging science rather than the author's own description. If you want the author's framing in their own words, it isn't written down anywhere public as of this pack's README.
What Poisson noise actually is
Most "add noise" filters use Gaussian noise - the same random amount of static everywhere, regardless of how bright a pixel is. Real camera sensors don't work that way. Photon arrival is a counting process, and counting processes follow a Poisson distribution, where the relative noise (how much a pixel's value jitters compared to its brightness) is highest in dark shadows and lowest in bright highlights. That's why real photos have visibly grainier shadows and cleaner highlights, and it's why Poisson noise reads as convincingly "photographic" in a way flat Gaussian static doesn't. This node simulates that specific behavior rather than uniform noise.
Why you'd use this over a generic noise/grain node
AI-generated images are often suspiciously clean - no sensor grain, no chroma noise, nothing that says "this came from a camera." Adding a believable noise layer is a known trick for pushing an image toward looking captured rather than generated (this is a documented technique across the photorealism community - plenty of "amateur photography" style LoRAs bake grain in directly rather than relying on a post-process filter). This node gives you that as a controllable post-process step instead of baking it into generation, which means you can dial it per-image rather than being stuck with whatever a checkpoint decided to bake in.
Inputs and outputs
image(IMAGE) - the source.gain(default 1000, up to 1,000,000) - the overall noise-strength control. In a Poisson noise model, this stands in for how many "photons" the simulated sensor is collecting: turn it up and the simulated signal is stronger relative to its own noise, so the grain gets subtler; turn it down and relative noise increases.gain_r/gain_g/gain_b(defaults 1, 2, 0.5) - per-channel multipliers on top of the main gain. The defaults aren't arbitrary - they mirror how real Bayer-pattern camera sensors behave: green gets sampled twice as often as red or blue in a standard Bayer filter, so it typically comes out with the best signal-to-noise ratio (hence the highest default gain), while blue is usually the noisiest channel on consumer sensors (hence the lowest default). You can push these around to simulate a different sensor's noise character, or push them apart further for a stylized, colorful-noise look.clamp(default on) - clips output values back into the valid 0–1 range after noise is added, avoiding blown-out artifacts from noise pushing a bright pixel past white.seed- the RNG seed, for reproducibility.
Output is a single IMAGE.
Installing it
ComfyUI Manager: search "ComfyUI-Image-Filters," install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/spacepxl/ComfyUI-Image-Filters
pip install -r requirements.txt (or install.bat on Windows), restart. No model weights needed - this is generated noise, not a learned effect.
Same OpenCV caveat as the rest of this pack: if a different node pack already installed a conflicting cv2 build, you can get import errors on startup across this whole repo. import_error_install.bat fixes it by reinstalling the single correct opencv variant.
Common issues
The most common mistake is cranking gain down expecting more noise and being confused when the image instead looks blown out or oddly banded - remember the direction here is inverted from what feels intuitive: lower gain means the simulation is modeling fewer effective "photons," which means more relative noise, and at extreme low values that can look less like grain and more like broken pixels. Start from the defaults and nudge gradually rather than jumping to an extreme value. If your noise looks flat and uniform instead of realistic, double check you didn't zero out the per-channel gains - the differentiated gain_r/gain_g/gain_b defaults are what gives this its characteristic sensor-like color variation; setting them all equal gets you something closer to monochrome noise.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| gain | FLOAT | 1000.0000.001–1000000 | — |
| gain_r | FLOAT | 1.0000–1000000 | — |
| gain_g | FLOAT | 2.0000–1000000 | — |
| gain_b | FLOAT | 0.5000–1000000 | — |
| clamp | BOOLEAN | true | — |
| seed | INT | 00–18446744073709550000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |