Selective Denoise
The dial that kills chroma flicker without smearing detail
- original
- clean
- denoised
Here's the thing about Temporal Flow Average: its output is too clean. Run a video clip through it at full strength and you get buttery smooth frames with all the texture averaged out - great reference, bad final. Selective Denoise is the node that takes that too-clean reference and dials it back to taste, with separate control over color and detail. If FlowDenoise has a "where the actual denoising happens" node, this is it.
What it does
It takes your original frames and a clean version of them, converts both into a color space, and blends each part independently:
chroma_strength- how much of the clean version's color replaces the original's (0 = keep original color, 1 = fully clean color).luma_strength- same idea for luminance, which carries texture and edges.
The magic is that these are separate sliders. AI-video artifacts are overwhelmingly chroma problems - color flicker, chroma spikes, random color pops - so you can hammer chroma while barely touching luma, and keep all the fine detail the generator produced. That's the entire reason this node exists: the pack's author built it after noticing that strong denoising of Seedance clips was eating detail people wanted to keep.
The color_space choice (YCbCr default, HSV, LAB) should match whatever you used in Extract Noise - that's how you keep the preview and the blend consistent. clamp_output (default on) just clamps the final RGB to [0,1] so out-of-range color-space math can't produce blown highlights.
The settings people actually use
From the README's recommended settings, and they're worth trusting:
AI-generated video (Seedance, Kling, etc.) - kill flicker, keep detail:
chroma_strength: 0.7–0.9
luma_strength: 0.1–0.3
color_space: YCbCr
Film grain removal - heavier, perceptually-tuned:
chroma_strength: 0.5–0.7
luma_strength: 0.3–0.5
color_space: LAB
Chroma-only cleanup - don't touch luminance at all:
chroma_strength: 0.9
luma_strength: 0.0
Where people get burned: cranking luma_strength toward 1 to "clean it up" is how you end up with waxy, detail-free video. The trade-off is unavoidable - more denoise, more detail lost - and the whole point of the two sliders is that you almost never need both high.
Outputs and wiring
Single output, denoised (an IMAGE), which feeds straight into VHS_VideoCombine to export:
VHS_LoadVideo ─┬─> Temporal Flow Average ──> clean ──> Selective Denoise (clean)
└─> original ──────────────────────────> Selective Denoise (original)
Selective Denoise.denoised ──> VHS_VideoCombine ──> Match Source Color Tags (optional)
The denoised frames are what you actually ship. If you run Match Source Color Tags afterward, that's fixing the container metadata, not these pixels.
Installing it
Same pack as the rest of the FlowDenoise nodes - ComfyUI Manager, search "ComfyUI-FlowDenoise", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/AIMZ-GFX/ComfyUI-FlowDenoise.git
The one dependency that always bites: memfof is not on PyPI, so pip install memfof dies with "Could not find a version." Use the GitHub URL (Manager's requirements.txt / install.py do this automatically):
pip install git+https://github.com/msu-video-group/memfof.git
Portable: python_embeded\python.exe -m pip install git+.... You only need this for the upstream Temporal Flow Average - Selective Denoise itself is pure tensor blending, no model, no flow, instant even on CPU. You'll also want Video Helper Suite for the VHS_* I/O nodes in the standard workflow.
Troubleshooting
- Still seeing flicker at my settings - this is the most-reported issue in the pack's launch thread. Real users found one pass often isn't enough; run the whole thing again and it cleans up the residue the first pass leaves. The author's own guidance: if you set both strengths to 1.0 you get the fully-denoised result, so the node is doing its job - the fix is a second pass, not stronger settings.
- Ghosting on moving subjects - that's inherited from
Temporal Flow Average(lower itscolor_threshold/ shrink itswindow_size), not this node. Blending can't invent clean frames; it can only mix what it's given. - Colors look off / washed - make sure
clamp_outputis on, and thatcolor_spacematches what you used elsewhere in the graph. Mixing YCbCr blending with an LAB preview is a recipe for confusion. - Waxy, over-smoothed video -
luma_strengthtoo high. Drop it below 0.3 and lean on chroma instead. If you genuinely need heavy luma denoise (film grain), accept the softness and useLABwhich respects perceptual lightness better.
Think of it as a mix knob between "noisy original" and "clean reference," with a separate balance for color and detail. Tune it with Extract Noise in the loop and you'll stop guessing.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| original | IMAGE | — | |
| clean | IMAGE | — | |
| chroma_strength | FLOAT | 0.800–1 | How much to denoise chroma (0=keep original, 1=fully clean) |
| luma_strength | FLOAT | 0.300–1 | How much to denoise luma (0=keep original, 1=fully clean) |
| color_space | COMBO | YCbCr | Color space for luma/chroma separation |
| clamp_output | BOOLEAN | true | Clamp output to [0,1] range |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| denoised | IMAGE | — |