Image Adjust
One node for all your color-correction chores
- image
- image
Most of the time an image comes out of the sampler and needs a nudge before it's done: a little more contrast here, the highlights pulled back, skin tones slightly less orange, or the whole thing desaturated to look moodier. You can assemble that from a chain of dedicated nodes, or you can drop in NNImageAdjust and do all of it in one place with six sliders.
What it is
"Image Adjust" is the combined color-correction node in the ComfyUI-NN-custom-nodes pack - the README's words: "Combined image adjustment node" supporting brightness, contrast, saturation and RGB channel adjustments. If you own this pack you're meant to reach for it instead of three separate nodes, and it replaces the trio of NNImageAdjustContrast, NNImageAdjustColor and saturation work in one shot.
How it works
The implementation is refreshingly plain, and reading it tells you exactly what each slider does to your pixels:
brightnessis additive - a constant offset added to every pixel. It shifts everything including blacks, so it flattens contrast and clips highlights fast. Keep it small.contrastis multiplicative around the mean luminance: it computes the per-image average luma, then scales each pixel's distance from that mean by1 + contrast. Contrast 0 is a no-op; positive values stretch apart, negative values compress.saturationblends each pixel toward its luma value - 1.0 is unchanged, 0.0 is full grayscale, above 1.0 pushes color. Set it to -1 and you get a hard inversion of the luma blend, so in practice 0–1.5 is the usable band.red/green/blueare multiplicative per-channel gains: each channel is scaled by1 + value. Slightly negative red is the classic "fix skin that's too warm" move.
Every adjustment is applied to the 0–1 float tensor and the result is clamped to [0, 1], so you can't blow out to garbage - values just clip, the same way they would in Photoshop.
The inputs that matter
Six sliders, all with sane defaults (all zeros except saturation at 1.0, meaning "no change"). The ones you'll actually touch:
contrast- range −0.5 to +0.5. +0.1 to +0.2 is a gentle pop; don't go hunting for more.brightness- range −0.5 to +0.5. Remember it's additive, so it's for global exposure shifts, not shadow lifting.saturation- 1.0 default, 0 to kill the color entirely.red/green/blue- the channel gains for white balance fixes.
Output is a single image socket, same batch and dimensions as the input, ready to feed a preview or a save node.
When to reach for it
This is a deterministic, millisecond, no-model operation - the exact layer the KB's post-processing doc tells you to use instead of "fixing color with img2img." Flat output, too-warm skin, a composition that wants a desaturated grade: all here, instantly. Where it won't help is matching colors between two images (that's the reference-statistics job of NNContrastAdjustRef in the same pack), or proper exposure curves - this is brightness and contrast, not gamma.
Installing and using
It's part of the bandifiu/ComfyUI-NN-custom-nodes pack:
cd ComfyUI/custom_nodes
git clone https://github.com/bandifiu/ComfyUI-NN-custom-nodes
then restart ComfyUI (or use Manager and search "NN-custom-nodes"). No model downloads, just torch/numpy/pillow. This being one node in a bigger pack, you'll get the pack's other utilities alongside - the profiler and wildcard processor come with it.
One habit worth picking up: because every slider is a widget with a smooth step, you can convert any of them to an input and drive them from a scheduler node if you want the grade to vary across a batch or over video frames. The node doesn't care where the values come from.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| contrast | FLOAT | 0.00-0.5–0.5 | — |
| brightness | FLOAT | 0.00-0.5–0.5 | — |
| saturation | FLOAT | 1.00-1–2 | — |
| red | FLOAT | 0.00-0.5–0.5 | — |
| green | FLOAT | 0.00-0.5–0.5 | — |
| blue | FLOAT | 0.00-0.5–0.5 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |