Extract Noise (Chroma/Luma)
The noise microscope
- original
- clean
- noise_total
- noise_chroma
- noise_luma
Tuning a denoiser by eye is guessing. You crank a strength slider, squint at the preview, crank it again - and you can't actually tell whether what's disappearing is flicker or eyelash detail. Extract Noise (Chroma/Luma) is the FlowDenoise pack's diagnostic node: it shows you, literally, what the denoising is removing, split into chroma and luma so you know which of your two strength sliders to touch.
What it does
You feed it two things: your original frames and a clean version of the same clip (almost always the output of Temporal Flow Average). It subtracts one from the other - that difference is the noise - then presents it in three ways:
noise_total- the full noise signal, original minus clean in RGB.noise_chroma- color noise only.noise_luma- luminance/detail noise only.
To split chroma from luma it converts both images into a color space where the channels separate cleanly - YCbCr (default), HSV, or LAB - and treats channel 0 as luma and channels 1–2 as chroma. That's why the same color_space option exists on Selective Denoise: what you see here is what that node blends there. Pick LAB if you want the separation to track human perception better than the default.
The preview modes
Noise is tiny - values around a few percent of full range - so you won't see it raw. The noise_preview enum picks how it's visualized, and noise_amplify scales it:
heatmap(default) - magnitude mapped through a turbo-style colormap, blue→cyan→yellow→red. Best for spotting where the noise is.signed- red for positive noise, blue for negative. Useful when you suspect a systematic bias, like a color cast pulsing one direction.gray- the classic grayscale, centered at 0.5.
One gotcha: in heatmap mode, each frame is auto-normalized to its own maximum, and noise_amplify is ignored - it only scales gray (and signed normalizes per frame too). So don't be confused when the slider does nothing in heatmap mode. A single loud spike can also make an otherwise-average frame render almost black in heatmap because the colormap stretches to that spike. That's normal, not a bug.
Where it sits in the workflow
It's a preview node - every output is an IMAGE you eyeball, not something that flows onward. The standard FlowDenoise wiring:
VHS_LoadVideo ─┬─> Temporal Flow Average ──> clean ──> Selective Denoise (clean)
└─> original ──────────────────────────> Selective Denoise (original)
Temporal Flow Average.clean ──> Extract Noise (clean)
VHS_LoadVideo (original) ─────> Extract Noise (original) ──> PreviewImage
Practical workflow: run the denoise once, then look at noise_total. If the residue is almost entirely chroma, you know to push chroma_strength and leave luma_strength alone - you're killing color flicker without touching texture. If noise_luma is clean but the clip still shimmers, your problem isn't what this pack removes. One honest caveat from the pack's launch thread: even after the flicker looks gone to the naked eye, this node usually still shows residue - the visualization is more sensitive than your eyeballs, which is exactly why two denoise passes are often recommended.
Installing it
Same as the rest of the pack - ComfyUI Manager, search "ComfyUI-FlowDenoise" and install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/AIMZ-GFX/ComfyUI-FlowDenoise.git
then restart. The pack has one dependency that trips everyone up: memfof isn't on PyPI, so pip install memfof fails. Manager's requirements.txt / install.py handle it automatically; manually it's:
pip install git+https://github.com/msu-video-group/memfof.git
(Portable installs: python_embeded\python.exe -m pip install git+....) The MEMFOF weights download from HuggingFace on first use of Temporal Flow Average. Note that this node itself does no flow computation - it's pure tensor math on original and clean, so it's instant and runs on CPU happily.
Troubleshooting
- Preview looks black / washed - check the
heatmapauto-normalization note above, and that you've actually fed a differentcleanthanoriginal. If they're identical, the noise is exactly zero. noise_amplifydoes nothing - you're inheatmapmode. Switch tograyto see it work.- Not sure what you're looking at - wire each of the three outputs to its own
PreviewImageand compare. Thesignedmode is the tiebreaker for whether you're fighting bias or symmetric noise. - Clean input looks smeared - that's a
Temporal Flow Averagetuning problem (window too big,color_thresholdtoo loose), not this node. Fix it upstream.
It's a small node with a single job, but it's the difference between tuning the pack by feel and tuning it by evidence. Run it once before you start, once after, and the whole pack makes sense.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| original | IMAGE | — | |
| clean | IMAGE | — | |
| noise_amplify | FLOAT | 5.01–50 | Amplification factor for noise preview visualization |
| color_space | COMBO | YCbCr | Color space for separating luma and chroma noise |
| noise_preview | COMBO | heatmap | Noise preview mode: heatmap (magnitude->color), signed (red=+/blue=-), gray (classic 0.5-centered) |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| noise_total | IMAGE | — |
| noise_chroma | IMAGE | — |
| noise_luma | IMAGE | — |