ComfyUI Node

Color Grading

The color grade that works in HDR space and tonemaps its way back

By wmpmiles·Created 2 years ago·Updated about a year ago· 5
Color Grading
  • image
  • image
red1.00
green1.00
blue1.00
exposure_bias0.00
saturation1.00
contrast1.00
tonemap

Color Grading is the node people specifically recommend this pack for. It takes an image and runs a real color-grading chain on it - exposure, per-channel color filter, saturation, contrast, and tonemapping - but the thing that makes it interesting is where it does that work: in linear HDR space. Your sRGB image gets converted to linear light, graded there, tonemapped back to SDR, and quantized. That's the difference between this and the usual "nudge brightness with a Lerp" post-processing, and it's why it showed up as the recommended answer when someone on r/StableDiffusion asked how to do color grading in ComfyUI at all.

The input list is the whole control panel: image, then red, green, blue (each FLOAT, default 1), exposure_bias (default 0), saturation (default 1), contrast (default 1), and tonemap (a dropdown: Reinhard, Reinhard-Jodie, Uncharted 2, or ACES). Output is a single image.

What the knobs actually do

  • red / green / blue - a color filter, applied as a per-channel multiplier on the linear values. 1.0 leaves that channel alone; 0.85 cools, 1.15 warms. This is your white-balance-ish control.
  • exposure_bias - in stops, not percent. It's 2^exposure_bias, so +1 doubles the light, -1 halves it. This is the standard photographic meaning, which is more intuitive than it sounds once you get used to it.
  • saturation - 1 is unchanged, 0 is grayscale, above 1 pushes color. It blends toward luma in linear space rather than naively scaling RGB.
  • contrast - pivoted around middle gray (log2 of 0.18), so it doesn't just crush the image; below 1 flattens, above 1 punches.
  • tonemap - the required final step, because after exposure + color + saturation + contrast your values are HDR (they can exceed 1.0). The four options are the classic filmic curves: Reinhard is gentle and compresses highlights smoothly, Reinhard-Jodie is a punchier variant, Uncharted 2 is the well-known game-engine curve with a lot of character, and ACES is the Hollywood-standard look, subtle and balanced. For a first pass, Reinhard or ACES; switch to Uncharted 2 when you want a moodier grade.

There's a deliberate reason tonemapping is mandatory: it's what returns the HDR result to SDR. Skip it and you'd clip highlights - the author ships the node this way so you can't forget.

Where it fits

This is a deterministic grade - no model, no denoise, no hallucination. If you're batch-generating and you want a consistent filmic look applied to every output without a second diffusion pass, this is the node that does it in milliseconds. It's also honest about being a grade: it won't invent a look the way a LoRA would, it'll shift the one you already have. The photorealism lesson applies here - subtle is the goal; an exposure_bias of +1.2 with Uncharted 2 tonemapping is a mood, not a correction.

Installing

Same pack as everything else here:

cd ComfyUI/custom_nodes
git clone https://github.com/wmpmiles/comfyui-some-image-processing-stuff

Restart ComfyUI, or ComfyUI Manager → search "Some Image Processing Stuff". No models to download, no dependencies beyond PyTorch - it's pure tensor math, which is exactly why it's fast enough to sit at the end of every generation.

Categoryimage/postprocessing

Inputs (8)

NameTypeDefaultDescription
imageIMAGE
redFLOAT1.00
greenFLOAT1.00
blueFLOAT1.00
exposure_biasFLOAT0.00
saturationFLOAT1.00
contrastFLOAT1.00
tonemapCOMBO4 options: Reinhard, Reinhard-Jodie, Uncharted 2, ACES

Outputs (1)

NameTypeDescription
imageIMAGE