ποΈ Pro Color Grading
A full colorist panel in one node β lift/gamma/gain, temp/tint, levels, the lot
- image
- graded_image
ProColorGrading is the manual node in the RndNanthu color pack, and it's the one that makes the whole pack make sense. AutoGradePro fixes your image on its own, the scopes tell you what's wrong, the log nodes flatten things for you - and this is where you actually get your hands on it. Sixteen grading controls in one node, from the classic shadows/midtones/highlights to temperature, tint, vibrance, contrast with a pivot, and full input/output levels. If you've used the color wheels in any editor, you already know what this does. It's that, as a single ComfyUI node.
For generated images this matters more than it looks. The KB's photorealism notes are blunt about it: AI output runs oversaturated and high-contrast, and the reliable fix is pulling saturation back and adding a subtle cast. ProColorGrading is built for exactly that move - plus everything heavier, if you want it.
How it works
The processing order in the source is the same order a colorist would do things manually:
- Exposure - a
2^exposuremultiplier, so +1 is a real stop up and β1 a stop down. - Input levels -
levels_in_black/levels_in_whiteremap the range (that's your black and white points). - Tone wheels -
shadows,midtones,highlightseach get a luminance-derived mask (shadow mask is1 - 2*luma, highlight is(luma - 0.5)*2, midtones are what's left) and add to the image within that range. That's genuine lift/gamma/gain behavior, not a global brightness slider. - Temperature/tint - channel gains: temperature pushes red vs blue, tint pushes green vs magenta.
- Hue/saturation/vibrance - in OpenCV HSV. Vibrance is the smart one: it only boosts pixels whose saturation is below the mean, so already-popping colors stay put.
- Contrast around
pivot(default 0.5) - so you can hold your shadows and lift your highlights without the whole curve swinging. - Color boost - pushes each channel toward the pixel's mean luminance, a saturation-adjacent move that reads more "film" than plain saturation.
- Output levels -
levels_out_black/levels_out_whitefor the final reshape.
The inputs that matter
You can't touch all sixteen at once - nobody should. The set I'd actually reach for:
shadows,midtones,highlights- your main tool. Start with midtones, then lift or sink shadows.temperature/tint- for the "AI is too green/cool" fix. A touch of warmth kills the plastic look on skin.contrastwithpivot- the underrated combo. Drop pivot to 0.4 and contrast 1.2 and you get that rich, held-shadow grade.vibrance- safer thansaturationfor portraits because it leaves skin-adjacent colors alone-ish.saturation- the blunt instrument; use it when vibrance isn't enough. A value below 1.0 is the classic AI realism fix (KB's "pull saturation down 5β10%").levels_in_black/levels_in_white- nudge the black point up a hair (0.01β0.03) for a faded film look, or push white down to tame blown highlights.
Output is a single graded_image (IMAGE). Wire it to SaveImage - or into the pack's FilmGrain node if you want the full film finish.
A warning about hue_shift
hue_shift runs in OpenCV's 0β180 hue space, so its max of 180 is a full rotation, not the half you'd expect from a "degree" label. A value of 180 wraps every hue back to where it started. Treat it as "0β90 is a meaningful hue shift, beyond that you're chasing your tail."
Install
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/rndnanthu/ComfyUI-RndNanthu
pip install -r requirements.txt
Then restart ComfyUI - or search "ComfyUI-RndNanthu" in ComfyUI Manager. Dependencies: torch, numpy, opencv-python, Pillow, matplotlib, imageio. No models. And the usual pack caveat: CC BY-NC 4.0, so non-commercial use only.
Where people get burned
- First frame only. Like most of this pack, it grades
image[0]and ignores the rest of a batch. Single images or per-frame. - The order is fixed. Exposure runs before levels, which runs before the tone wheels. If you're applying a big exposure bump and then wondering why your shadows masks look off, that's why - the masking happens on already-scaled luma.
- Don't do all sixteen at once. The node is capable of way more than is tasteful, and with no previews on the sliders it's easy to drift into "technically graded, actually ruined." Grade in twos or threes, check the ColorAnalysisPlotNode scopes, repeat.
For a single-node grade it's hard to beat in this pack - it's the control room, the rest are the instruments. It's not Resolve in a box, but for finishing an AI image it's comfortably the most useful node RndNanthu ships.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| shadows | FLOAT | 0.00-1β1 | β |
| midtones | FLOAT | 0.00-1β1 | β |
| highlights | FLOAT | 0.00-1β1 | β |
| exposure | FLOAT | 0.00-2β2 | β |
| hue_shift | FLOAT | 0.0-180β180 | β |
| saturation | FLOAT | 1.000β3 | β |
| vibrance | FLOAT | 0.000β3 | β |
| contrast | FLOAT | 1.000β3 | β |
| pivot | FLOAT | 0.500β1 | β |
| color_boost | FLOAT | 1.000β3 | β |
| temperature | FLOAT | 0.00-1β1 | β |
| tint | FLOAT | 0.00-1β1 | β |
| levels_in_black | FLOAT | 0.000β1 | β |
| levels_in_white | FLOAT | 1.000β1 | β |
| levels_out_black | FLOAT | 0.000β1 | β |
| levels_out_white | FLOAT | 1.000β1 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| graded_image | IMAGE | β |