FGA-NN Film Grain Denoise
Denoising built for grain, not sensor noise
- image
- denoised_image
- analysis_report
Most denoisers in this pack - BM3D, wavelet, SCUNet - were built and validated against digital sensor noise: roughly Gaussian, roughly uniform. Film grain isn't that. It's a physical pattern from silver-halide crystals, with its own size, density, and structure that varies by stock and exposure, and a generic denoiser tends to either leave it mostly alone or smear away real detail trying to fight it. This node exists specifically for that case - a network built around what grain actually looks like, plus its own analysis step that reports on the grain's characteristics rather than just removing it blindly.
How it works
analyze_grain runs a characterization pass over the image before (or alongside) denoising, estimating properties of the grain pattern itself - the kind of information a generic sensor-noise denoiser never bothers to compute because it isn't relevant to Gaussian noise. That analysis is meant to inform how the network approaches the actual denoising, rather than applying one fixed filter regardless of grain type. The one thing worth knowing before you use this node: model_path defaults to empty, and per the node's own tooltip, an empty path means the network runs with random initialization - not a shipped pretrained checkpoint. Without pointing model_path at real trained weights, you're running an untrained network, and there's no guarantee its output is meaningfully better than doing nothing.
The inputs and outputs that matter
image- required.analyze_grain(default true) - runs the grain-characteristic analysis; leave this on, since the report is the main way you'll know what the node thinks it's dealing with.model_path(optional, default empty) - path to pretrained weights. Empty means random initialization. This is the single most important field on this node: if you have real weights for it, point this here; if you don't, treat the output with real skepticism.- Outputs:
denoised_imageandanalysis_report.
How to install it
Search Eric_Image_Processing_Nodes in ComfyUI Manager, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/Eric_Image_Processing_Nodes
cd Eric_Image_Processing_Nodes
pip install -r requirements.txt
Restart ComfyUI. The pack's README documents a related group of GPU-accelerated film-grain nodes that lean on optional CuPy acceleration (pip install cupy-cuda12x for CUDA 12, cupy-cuda11x for CUDA 11), auto-enabling for images larger than 512×512 with a 2–5x speedup where available and a clean CPU fallback otherwise - worth installing if you're processing film-grain images regularly. Unlike this pack's other AI-based restorers, there's no auto-downloaded pretrained checkpoint for this specific node bundled or fetched automatically - see model_path above.
Common issues & troubleshooting
Output doesn't look meaningfully different from the input, or looks worse. Check whether you set model_path. With it left empty, this node is running a randomly-initialized network - genuinely untrained - and there's no reason to expect good denoising from that. This is very likely the cause if results seem inconsistent or arbitrary.
Don't have pretrained weights for this node. The pack's README doesn't point to a specific download for it the way it does for the auto-fetched models elsewhere in the pack (Real-ESRGAN, SwinIR, SCUNet, Restormer, DiffBIR). If you need reliable film-grain denoising today and don't have your own weights, this pack's other denoisers (BM3D, wavelet, SCUNet) are the more dependable fallback even though they weren't built specifically for grain.
Not sure what the grain analysis is telling you. analysis_report is meant to describe the grain characteristics the node detected - read it as diagnostic information about your source, useful for deciding whether film-grain-specific handling is even worth the trouble versus a general denoiser.
GPU acceleration doesn't seem to kick in. That's CuPy, and it's optional - install cupy-cuda11x or cupy-cuda12x matching your CUDA version if you want it; the pack runs on CPU fine without it, just slower on larger images.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| analyze_grain | BOOLEAN | true | Analyze and report grain characteristics |
| model_pathopt | STRING | Path to pre-trained weights (leave empty for random init) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| denoised_image | IMAGE | — |
| analysis_report | STRING | — |