Color Enhance
Stop Swapping VAEs for Color — Normalize Chroma Instead
- image
- IMAGE
Your image came out of the VAE looking a little washed out, and your first instinct is to swap the VAE or crank the saturation slider until the sky clips. Color Enhance is the argument against both. It runs the same color-enhancement algorithm GIMP and GEGL have shipped for years, and it does one thing: stretches an image's colorfulness to fill the full range it's capable of, without blowing out the pixels that are already vivid.
The author's framing in the README is worth taking seriously: pick your VAE for how accurately it decodes latents, not for how pretty its colors are, then fix color afterwards in a deterministic, repeatable step. It's the post-processing philosophy applied to the color problem - the same way the KB's VAE section ends up recommending you stop treating the VAE as a color dial.
How it works
Under the hood it's short and non-mysterious. The image is converted from RGB to CIELAB, then to the cylindrical CIELCh(ab) space where "chroma" (colorfulness) is a single number per pixel. The node finds the most colorful pixel in the image and scales the chroma channel so that maximum hits the top of the representable range; every other pixel scales proportionally. Strength lerps between "do nothing" (0) and "full stretch" (1).
That's the whole trick, and it's why it doesn't oversaturate. An already-colorful image has a max chroma close to the ceiling already, so at full strength it changes almost nothing - you can run it on your most poppy render and watch it shrug. A muted, hazy image gets a real lift because its colors were nowhere near the gamut edge. Traditional HSL/HSV saturation boosts just multiply everything toward clipping; this normalizes instead.
Everything runs in floating point before being rounded back to uint8, so chaining it through img2img or reusing an image won't accumulate the banding you'd expect from a naive slider. It's pure numpy/scikit-image math - no GPU, no VRAM, no models, no API. It's instant.
The inputs and outputs that matter
- image - any IMAGE tensor. It loops over every frame in the batch, so a whole image sequence gets the same treatment frame by frame.
- strength - a FLOAT, default 1.0, range 0.0–1.0, step 0.01. 0 is a no-op; 1 is full chroma normalization. There's no wrong answer, just taste: I usually land around 0.5–0.8 because full strength on a genuinely muted render can look punchy in a way that reads as "filtered."
Output is a single IMAGE - same resolution, same batch size - which you wire straight into Save Image, or into a blend node if you want to mix it with the original for a subtler take. Drop it right after VAE Decode and before anything else; it doesn't care what comes before or after.
Installing it
ComfyUI Manager is the easy route: open the Custom Nodes Manager, search sd-webui-color-enhance, install, restart. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/noarche/sd-webui-color-enhance
Then restart ComfyUI. There are no model files to download, no API keys, no heavy dependencies - the README is refreshingly honest about that. The two nodes land under postprocessing → Effects as "Color Enhance" (this one) and "Color Blend" (its sibling in the same pack).
Common issues
The realistic failure mode is the node refusing to load at all. The pack ships no requirements.txt, so ComfyUI Manager can't auto-install anything - if your environment lacks scikit-image, the import dies and you get a red node. Fix it once and forget it:
# inside your ComfyUI Python environment
pip install scikit-image
That's genuinely the whole list. No models to hunt down, no version mismatches worth caring about, and the repo being quiet since 2024 doesn't matter because a self-contained color algorithm doesn't rot. For a pack that gets almost no attention, this is a weirdly pleasant one to install.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| strength | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |