NormalizeLatent
A one-shot contrast fix — deprecated, but you'll still find it in old workflows
- latent
- model
- LATENT
The little deprecated one in the pack. NormalizeLatent takes a LATENT and a MODEL, rescales each channel of the latent so its max absolute value lands on the model's expected dynamic range, and hands you a LATENT back. Drop it right before VAEDecode and it restores some of the punch a washed-out latent lost - more vibrancy, more contrast. The README is blunt about its status: "Deprecated, use normalization from DiffusionCG node instead."
So why is it in the pack at all, and why should you care? Because shared workflows from 2024 and early 2025 use it, and half the "why is my image flat" questions on the forums are answered by one of these three nodes. Know it so you can recognize it.
How it works
The mechanism is simple: it reads the model's latent format (that's the whole reason it needs a MODEL input - it never touches the model, just uses it as a look-up) and normalizes each channel to that format's expected range. SD1.5 gets [18, 14, 14, 14], SDXL gets [20, 16, 16]. One detail worth knowing: the rescale factor is clamped so it only ever boosts a channel, never shrinks it (max(ratio, 1.0) in utils.py). That's why it reads as "vibrancy" rather than a straight rebalance - everything moves up, nothing moves down.
The inputs and output
- latent (
LATENT) - the latent you want normalized, straight from a KSampler. - model (
MODEL) - any checkpoint, used just for latent-format detection. - Output:
LATENT, wired intoVAEDecode.
That's the whole node. Two inputs, one output, no knobs.
Because it's a raw latent operation it sits between the sampler and the VAE - not in the model-patch line with VectorscopeCC and DiffusionCG. And since it needs the model merely to figure out the format, you can't feed it a stray latent without one attached.
Why it's deprecated
A one-shot normalize at the end is fighting the model after the fact. The latent was already sampled at whatever range the sampler produced; rescaling at the very last step can push values the decoder wasn't expecting, trading a washed-out look for a clipped one. DiffusionCG applies the same idea during sampling, step by step, where it belongs - and that's exactly what the README points you to.
So use it? If an old workflow already has it and the output looks good to you, leave it - it ships, it works, it's harmless. But for anything new, go with DiffusionCG. It comes from the same pack, so installing the one gives you all three nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/pamparamm/ComfyUI-vectorscope-cc
Or find "ComfyUI Vectorscope CC" in ComfyUI Manager. No model downloads, no extra dependencies - the whole pack is pure torch plus ComfyUI internals.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | — | |
| model | MODEL | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |