Vibrance
The saturation knob that doesn't wreck skin tones
- image
- ui_widget
- image
- image_list
There's a reason "vibrance" exists in every photo editor and "saturation" feels like a blunt instrument. Crank a plain saturation slider and the already-saturated parts clip, the skin turns orange, and the sky goes nuclear. Vibrance does the opposite: it boosts muted colors the most and barely touches the colors that are already rich. LF_Vibrance brings that exact behavior to ComfyUI, with skin protection built in - which is why it's the color punch-up node I actually reach for instead of a raw saturation filter. It's from the lf-nodes filter family.
How it works
Under the hood it's the classic vibrance recipe in OpenCV HSV space. The image converts to HSV, and for each pixel the added saturation is proportional to how unsaturated it is - delta = intensity × (1 − saturation). A flat, gray pixel gets the biggest push; an already-vivid pixel gets almost nothing. That's the whole trick that makes vibrance "smart" where saturation is dumb.
Two optional toggles make it genuinely useful:
- protect_skin (default true) - reduces the push by 70% on hues in the 15–50° range, which is where common skin tones live. People stay natural while the rest of the scene pops.
- clip_soft (default true) - rolls saturation off as it approaches maximum instead of slamming into the clip, so you don't get that neon, posterized oversaturation.
The inputs that matter
- image (IMAGE) - a tensor or a list of tensors.
- intensity (FLOAT, −1 to 2, default 0.6) - the only knob you'll touch most of the time. Negative values tame colors (desaturate the over-saturated), positive values boost muted hues. 0.6 is a solid default; 1.5+ is stylized; 2 is the "no more subtlety" setting.
- protect_skin (BOOL, default true) - leave it on for people and animals; turn it off if you're grading landscapes where the "skin" range is just ambient warmth you want pushed.
- clip_soft (BOOL, default true) - leave on unless you want hard saturation clipping as an aesthetic.
Outputs are image and image_list, standard for the pack's filters.
Install
Ships with lf-nodes:
- ComfyUI Manager: search "LF Nodes", install, restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/lucafoscili/lf-nodes.git, restart.
No models. Uses OpenCV, which is already in ComfyUI's stack and in the pack's requirements.
Common issues
- "It's not doing anything." At intensity 0.6 the effect is subtle by design - that's correct behavior, not a bug. Go to 1.0+ to see it, then dial back.
- Skin looks wrong anyway. If the subject has warm/red skin and you're boosting a lot,
protect_skinonly protects the 15–50° hue band. Check you haven't also cranked a saturation node upstream that already clipped the channel - clip_soft can't un-clip. - Purple or green fringing on edges. That's usually oversaturation interacting with a prior upscale or denoise, not this node. Back off intensity or run it before the sharpen rather than after.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Input image tensor or a list of image tensors. | |
| intensity | FLOAT | 0.60-1–2 | Negative = tame colours, positive = boost muted hues |
| protect_skinopt | BOOLEAN | true | Less push on hue-range 15-50° (common skin) |
| clip_softopt | BOOLEAN | true | Roll saturation off near max to avoid clipping |
| ui_widgetopt | LF_COMPARE | [object Object] | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | Image tensor with vibrance effect applied. |
| image_list | IMAGE | List of image tensors with vibrance effect applied. |