Sat vs Sat
Sat vs Sat — tame oversaturated AI colors by adjusting saturation against itself
- image
- image
Sat vs Sat is the rare grading node that works on saturation levels themselves rather than hues or luminance. Instead of asking "which colors are orange?" it asks "how saturated is this pixel?" and adjusts accordingly. That makes it the single most direct fix for the classic AI-image complaint: things come out of the sampler oversaturated, with neon reds and clashing blues that scream "generated." The standard post-processing advice is to pull saturation down 5–10%, but a plain global desaturation also drains the muted, pleasant colors. Sat vs Sat lets you compress the oversaturated zone while leaving - or boosting - everything else.
It's the same family as Darkroom's Hue vs Sat and Lum vs Sat, and it's the one I'd reach for first on a default-heavy model output. Four zones, a handful of presets, zero guesswork about hue ranges.
How it works
Each pixel's saturation is measured, then soft Gaussian masks split the range into four zones - near-desaturated (0–25%), low (25–50%), medium (50–75%), and highly saturated (75–100%) - with centers at 12.5/37.5/62.5/87.5% and overlapping shoulders so adjustments blend instead of banding. You push or pull each zone independently; the presets are just sensible combinations of those four knobs. Everything runs in linear light with a strength blend, like the rest of the pack.
The inputs
- preset (enum, default Custom) - seven choices: Compress oversaturated, Boost muted tones, Uniform saturation, Hyper saturated push, Gentle mute, and Protect saturated, boost muted. The last one is my usual starting point on AI images - it's basically "fix the neon, keep the candy where it's good."
- low_sat_adjust / mid_low_sat_adjust / mid_high_sat_adjust / high_sat_adjust (±100, default 0) - the four zone sliders. Negative compresses a zone, positive boosts it. You rarely need more than ±50; the extreme ends are for stylized work.
- strength (0–1, default 1) - global blend between original and adjusted.
Output is image. It's color-only, so it's allowed in the LUT bake chain - a compressed-highlight saturation move bakes into a .cube cleanly.
Install & notes
Pack install as always: Manager → search "Darkroom", or git clone https://github.com/jeremieLouvaert/ComfyUI-Darkroom + pip install -r requirements.txt + restart. No GPU, no models, pure numpy.
Where people get burned: cranking the presets to full and getting a drained, plasticky image. The presets are strong by design; run them at strength 0.5–0.7 and let the zone sliders fine-tune. And remember the zones overlap - if you push high_sat_adjust down hard and the midtones mysteriously drop too, that's the Gaussian shoulder, not a bug. Dial it in with the strength blend and you'll barely feel it.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| preset | COMBO | Custom (manual) | Select a saturation-based saturation preset or use Custom |
| low_sat_adjustopt | FLOAT | 0-100–100 | Adjust nearly-desaturated tones (0-25% saturation) |
| mid_low_sat_adjustopt | FLOAT | 0-100–100 | Adjust low-saturation tones (25-50% saturation) |
| mid_high_sat_adjustopt | FLOAT | 0-100–100 | Adjust medium-saturation tones (50-75% saturation) |
| high_sat_adjustopt | FLOAT | 0-100–100 | Adjust highly-saturated tones (75-100% saturation) |
| strengthopt | FLOAT | 1.000–1 | Blend between original (0) and adjusted (1) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |