Olm Color Balance
Color balance sliders for ComfyUI, without a node suite strapped to your back
- image
- IMAGE
Olm Color Balance is the exact thing you miss when you're finishing a render: the classic Shadows / Midtones / Highlights color-balance tool from Photoshop or Premiere, dropped into the graph as a single focused node. No model downloads, no API keys, no 40-node suite required. You wire your finished image in, drag a slider, and watch the whole mood of the shot shift live. If you've been "fixing" color by stacking brightness-contrast nodes and squinting, this is the cleaner way.
It's by Olli Sorjonen (@o-l-l-i), one of a small series of color-focused tools - Olm Image Adjust, Olm Curve Editor, Olm LUT are its siblings - and it shipped in July 2025. New enough that it's still got rough edges, but the core idea is solid and it does one thing well.
Where it fits in a workflow
Slap it between your VAE decode and your Save Image / upscale chain. The photorealism playbook is full of "AI images run oversaturated and too contrasty" - pulling the highlights toward cyan, warming the shadows, matching two renders before compositing them. That's this node's entire job. Because it runs on the already-generated image rather than the latent, it's cheap enough to leave in the graph permanently; the actual math is a few tensor ops.
How it works
The mechanism is refreshingly legible. The node computes luminance as 0.3*R + 0.59*G + 0.11*B (good old Rec. 601 weights) and builds three Gaussian masks over it, centered at 0.0, 0.5, and 1.0 - shadows, midtones, highlights. Each tone range gets your per-channel amount applied through its mask, so there are no harsh band cutoffs; the ranges blend into each other like they do in a proper color-balance dialog. preserve_luminosity then measures the new luminance against the old and adds the difference back, which is what keeps a heavy grade from washing everything out or turning it to mud. Output is clamped to 0–1.
The "realtime" part is a small custom HTTP endpoint: after your first run, the node caches a downscaled (512px max) copy of the input on the server, and dragging a slider asks that endpoint to re-run the adjustment and hand back a base64 preview. That's why the live preview only kicks in after you've queued the graph once - the cached image has to exist first. Worth knowing, because people expect it to work before the first run.
The inputs that actually matter
The image in, one IMAGE out. In between, nine sliders - shadows_r/g/b, midtones_r/g/b, highlights_r/g/b, each running −1 to +1. Cyan–Red lives on the red channel, Magenta–Green on green, Yellow–Blue on blue; negative pushes the complementary color, positive pushes the primary. Two flags matter more than the rest:
preserve_luminosity(on by default) - keeps brightness roughly constant while you shift hue. Turn it off for a straight, punchier grade that can darken or blow out.strength- a global multiplier (0 to 4) over all nine sliders. It's your "undo" knob: set a bold grade, then dial it back to 30% instead of hand-trimming nine values.
Ignore version - it's a compatibility flag, not a setting.
Installing it
ComfyUI Manager: search "Olm Color Balance" and install. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/o-l-l-i/ComfyUI-Olm-ColorBalance.git
Restart ComfyUI. That's genuinely it - the dependencies are Pillow, Torch, and NumPy, all of which you already have. No requirements.txt surprises, no model files, which is more than most custom nodes can claim in this ecosystem.
Gotchas
- Realtime preview requires that first run, and it processes a 512px preview - the output image itself is always full resolution.
- RGB inputs only. No mask passthrough, no alpha.
- It's a creative tool. It will not fix your white balance, and pushing extremes will clip highlights and shadows. Easy to overcook; lean on
strength. - Version 1.0.1.1 specifically patches mouse-event handling for ComfyUI frontend 1.24.4+, so if you're on a bleeding-edge frontend and the node's header buttons die, update the pack.
- License worth a read: it's source-available but not standard open-source. Free to use and experiment, your outputs are yours, but you can't redistribute, resell, or rebrand the code. Fine for almost everyone; a dealbreaker if you wanted to ship a fork.
For a one-job node it's remarkably pleasant. If you do much color work at all, it earns its slot in the graph.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| version | STRING | init | — |
| image | IMAGE | — | |
| shadows_r | FLOAT | 0.00-1–1 | — |
| shadows_g | FLOAT | 0.00-1–1 | — |
| shadows_b | FLOAT | 0.00-1–1 | — |
| midtones_r | FLOAT | 0.00-1–1 | — |
| midtones_g | FLOAT | 0.00-1–1 | — |
| midtones_b | FLOAT | 0.00-1–1 | — |
| highlights_r | FLOAT | 0.00-1–1 | — |
| highlights_g | FLOAT | 0.00-1–1 | — |
| highlights_b | FLOAT | 0.00-1–1 | — |
| preserve_luminosity | BOOLEAN | true | — |
| strength | FLOAT | 1.000–4 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |