RGB Balance Scope
Stop eyeballing color casts, start measuring them
- image
- mask
- image
- mask
- rgb_balance_scope_info
Every colorist has the same lie they tell themselves: "I can see the green cast, I'll just fix it." Then you push a slider, make it worse, and undo. x1RGBBalanceScope is the node that replaces that guessing with measurement. It analyzes where your image is off-balance - in shadows, midtones, and highlights - and draws the answer, so your correction is aimed instead of fumbled.
It's part of MKRShift Nodes' Color/Analyze branch, a small family of analysis nodes (with x1NeutralityMap and x1SatLumaScope) that all follow the same shape: they emit a visualization, a mask, and an info string. The value proposition here is the same one post-processing.md makes for the whole layer: deterministic analysis beats re-rolling generations to fix color.
How it works
The default analysis_mode is zones: the image is split into shadow/mid/highlight zones, and the node measures how each zone's red, green, and blue diverge from neutral. The key controls:
shadow_point(0.22) andhighlight_point(0.78) - where the zones begin and end on the luma scale. These define your tonal windowzone_softness(0.12) - how soft the zone boundaries are, so you don't get hard bandsresponse_gain(1.15) - how much the imbalance is exaggerated for visibility. Likex1NeutralityMap's cast gain, this is a magnifier, not a measurement at face valueneutral_tolerance(0.08) - how far from gray a pixel can be before it's flagged. Tighter = stricter analysisshow_reference(true) - whether the output includes a neutral reference so you can read the offset against itanalysis_mode-zonesorcolumns(a column-based readout)
The settings all live in a settings_json string, the pack's house style. The defaults are tuned so that a genuinely balanced image shows little, and a cast jumps out immediately.
Inputs and outputs
Required: image and settings_json. Optional: mask to restrict the analysis to a region - check only the skin tones, or only the sky, without the rest of the frame skewing the read.
image- the scope visualization: the frame with balance offsets drawn inmask- the regions flagged as off-balance, as a MASKrgb_balance_scope_info- a string summary of the measured offsets per zone
That mask output is the killer feature. Don't just read the scope and hand-correct globally - wire the mask into a x1ColorBalance or curves node and correct only the off zones. That's the difference between fixing a cast and fixing it without touching the parts that were fine.
Where it fits
In a grading pipeline it's the front of the chain: analyze → correct → re-analyze. The pack's Color branch gives you the whole loop - x1RGBBalanceScope to find it, x1ColorWheels/x1Curves to fix it, x1SatLumaScope to check saturation against luma. It's niche, but it's the kind of niche that saves you real time once you're doing regular color work instead of one-off generations.
Installing it
ComfyUI Manager (search "MKRShift Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart, no requirements, no model downloads, no ffmpeg. Big repo, small node - this is a "you're already in the pack" tool, but the Color/Analyze trio is a genuinely good reason to keep the pack installed.
Where people get burned
Reading response_gain as truth. Crank it to 3.0 and everything shows a cast; that's the magnifier working, not the image being broken. Read relative differences between zones at a consistent gain. And if nothing shows up even on a clearly warm image, check neutral_tolerance - too tight and the node flags nothing as neutral enough to analyze.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"analysis_mode":"zones","shadow_point":0.22,"highlight_point":0.78,"zone_softness":0.12,"response_gain":1.15,"neutral_tolerance":0.08,"show_reference":true,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| rgb_balance_scope_info | STRING | — |