Denoise
A real multiscale denoiser, with the honest caveats in the tooltips
- image
- image
The node description calls this "ultimate professional-grade 32-bit float spatial-temporal denoising" and that's the marketing voice of the pack's author, not a spec sheet. Ignore the adjectives and look at what it actually does, because underneath the puffery this is a genuinely useful denoiser built the way a compositing denoiser is built: luma and chroma handled separately, three frequency bands, and optional temporal blending for sequences.
The mechanism
Noise almost never lives in the same place as detail. Grain is high-frequency and mostly luma; the ugly stuff - the chroma speckle in shadows after a low-light render - is what your eye actually notices. So the node splits luma from chroma and lets you set independent strengths (luma_strength, chroma_strength), then decomposes each into three frequency bands with separately weighted strengths: high_freq_denoise for fine grain, mid_freq_denoise for textures and compression artifacts, low_freq_denoise (default 0.5) for those big coarse gradient splotches that come out of an aggressive upscale.
That's a sensible architecture. "Denoise" as one number is what every other node in the ecosystem gives you, and it's why people end up with either visible noise or plastic faces.
Two extras worth knowing:
joint_chroma_guidance (on by default) uses the sharper luma channel's structural edges to guide chroma smoothing, which is how you avoid colour bleeding across a high-contrast edge - the classic magenta fringe around a silhouetted face.
filter_type picks the spatial core: Bilateral preserves edges, Guided runs faster, keeps finer detail and avoids halos. If you're on a deadline, Guided; if you're protecting skin texture, Bilateral.
For a sequence, temporal_blend (0 = off) blends neighbouring frames to kill the frame-to-frame fizz you get from per-frame denoising, with temporal_radius setting how far it searches. temporal_threshold is the one that saves you - it limits blending to static or slow-moving pixels, so fast motion doesn't smear into ghosting.
Inputs you'll actually touch
For a single still: d (base filter radius, 9), sigmaColor (0.15 - colour similarity, higher is smoother and softer), and luma_strength down around 0.2 if you want to keep natural grain.
Turn on auto_profiling if you've got a wildly noisy image and no patience: instead of guessing sigmaColor, it measures the noise floor (lowest luma standard deviation across 32px patches) and scales from that. profile_multiplier is then your only dial. For HDR input, hdr_auto_sigma (on by default) widens the colour threshold proportionally to the batch peak, so values above 1.0 don't get treated like 0–1 pixels.
And view_mode - set it to Noise Residual once. It shows you exactly what you're removing, and it will change your settings faster than any explanation.
Install
Part of Radiance (147 nodes). ComfyUI Manager → search Radiance → install, restart, refresh browser. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
On Windows portable, pip with python_embeded\python.exe. The filter cores are OpenCV and SciPy, both in requirements.txt. Nothing downloads for this node.
Where people get burned
The filters are CPU-side and the bands make it slow. Three-band decomposition with per-band filtering on a 4K clip is real work. Denoise after a downscale, or accept the wait. The pack's own release notes list the heavy nodes; this one isn't in the "broke at production size" list, but it's not free either.
motion_compensation is narrower than it sounds. The author's own tooltip says it: it shifts each neighbour by the best of nine offsets within one pixel. That helps with sub-pixel drift and does nothing for actual motion. Don't expect it to rescue a tracking-heavy sequence - the known-issues list flags it explicitly as "a ±1 px search".
detail_recovery is not a blend back to the original. It restores the high-frequency part of what was removed, so texture comes back - and so does some fine noise. It's the right tool when the denoise ate skin pores; it won't give you the input image back.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image or frame batch to denoise, float32 in any encoding (scene-linear HDR above 1.0 is kept). A batch of more than one frame enables the temporal options. | |
| filter_type | COMBO | Bilateral | The core spatial denoising algorithm. Bilateral preserves edges; Guided runs faster, preserves finer detail, and avoids halos. |
| d | INT | 91–50 | Base filter radius in pixels. It sets the band split (d/2 and 1.5 x d box blurs) and the per-band filter radius (d/4, d/2, d); Bilateral caps each radius at 8 px. |
| sigmaColor | FLOAT | 0.150–10 | Color similarity threshold. High = smoother, but can lose edge detail. For HDR images, scale is auto-adjusted if hdr_auto_sigma is ON. This is bypassed if auto_profiling is enabled. |
| sigmaSpace | FLOAT | 75.00.1–500 | Gaussian spatial falloff in pixels for Bilateral weights and Guided local statistics. Higher values give flatter weights within the filter radius. |
| hdr_auto_sigma | BOOLEAN | true | Multiplies the colour threshold by the peak value of the whole batch when that peak exceeds 1.01, so HDR input gets a proportionally wider threshold. No effect on 0-1 images. |
| auto_profiling | BOOLEAN | false | Replaces sigmaColor with a measured noise level: the lowest luma standard deviation among 32 px patches, times profile_multiplier. Other settings are unchanged. |
| profile_multiplier | FLOAT | 1.00.1–5 | Adjusts the strength of the automatically profiled noise signature. Raise if noise remains; lower if details get soft. |
| luma_strength | FLOAT | 1.000–2 | Multiplier for spatial denoise strength on brightness (Luma). Lower this (e.g. 0.2) to keep natural fine grain. |
| chroma_strength | FLOAT | 1.000–2 | Multiplier for spatial denoise strength on colors (Chroma). Raise this to wash away annoying chromatic noise. |
| high_freq_denoise | FLOAT | 1.000–2 | Denoise strength for fine details and high-frequency pixel grain. |
| mid_freq_denoise | FLOAT | 1.000–2 | Denoise strength for medium textures and compression artifacts. |
| low_freq_denoise | FLOAT | 0.500–2 | Denoise strength for large coarse gradient splotches. |
| joint_chroma_guidance | BOOLEAN | true | Enables Joint Guided filtering. Uses the sharp structural boundaries of the Luma channel to guide Chroma smoothing, preventing color bleeding. |
| temporal_blend | FLOAT | 0.000–0.95 | Enables multi-frame temporal de-flickering. 0.0 is off. Higher values blend adjacent frames to stabilize video. |
| temporal_radius | INT | 11–4 | Temporal search window size. 1 searches 1 prev/next frame. 2 searches 2 prev/next frames, etc. Higher values de-flicker better but are slower. |
| temporal_threshold | FLOAT | 0.050.01–0.5 | Flicker delta threshold. Lower values prevent ghosting/trailing by only blending static or slow-moving areas. |
| motion_compensation | BOOLEAN | true | Before temporal blending, shifts each neighbour frame per pixel by the best of the 9 offsets within 1 pixel (lowest RGB difference). Only helps with motion of about 1 pixel per frame. |
| detail_recovery | FLOAT | 0.000–1 | Restores the high-frequency part of the removed residual (radius d/2), retaining low-frequency denoising. 0 = off, 1 = full detail residual. Fine noise can return along with texture; this is not a full original-image blend. |
| sharpen_strength | FLOAT | 0.000–2 | Adds a subtle post-sharpening (unsharp mask) to recover perceived edge crispness. |
| view_mode | COMBO | Denoised | Diagnostic view options. 'Noise Residual' is extremely helpful to see exactly what details are being removed. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |