Sat / Luma Scope
The density plot that catches what your eyes won't
- image
- mask
- image
- mask
- sat_luma_scope_info
Scopes are the colorist's cheat code: they turn "I think the skin is a bit over-saturated" into a measurable fact. x1SatLumaScope is a saturation-vs-luma density scope - it plots how much saturation the image has at each brightness level, so you can see at a glance whether highlights are bloating, whether midtones are muddy, and where the saturation is actually living. It's part of MKRShift Nodes' Color/Analyze branch, alongside x1RGBBalanceScope and x1NeutralityMap.
Here's the honest framing: scopes are a professional habit that amateur workflows skip, and they're cheap to adopt. This node makes the habit almost free - it's a visualization plus a mask, in the same family shape as its siblings.
How it works
The scope builds a saturation-by-luma density plot from the image and renders it as an output image you can inspect directly (or feed into a Preview node). The controls:
density_gain(1.0) - brightness of the plot. If your scope reads too faint, raise it; it's display gain, not analysissat_floor(0.04) - pixels below this saturation are treated as neutral and don't inflate the plot. This keeps near-gray noise from swamping the readoutgraticule(0.40) - the reference grid overlay, so you can read positions against a scalesample_step(2) - how many pixels get sampled. Higher = faster on big images, lower = denser plot
Settings live in a settings_json string, the pack's house style.
Inputs and outputs
Required: image and settings_json. Optional: mask - analyze only a region (skin tones, a product, the sky) and see that region's saturation behavior in isolation.
image- the rendered scope plotmask- the region that was analyzed (or the effective mask after feathering)sat_luma_scope_info- summary string of the analysis
How to read it
Two patterns matter. First: where's the saturation mass? If a big blob sits at high luma with high saturation, your highlights are bloated and color will read as glowing instead of painted. Second: is there a floor? If the low-luma region shows zero saturation, your shadows are dead neutral - which is either a look or a problem, depending on what you're going for. The scope makes both visible instead of felt.
The mask output matters more than it looks like it should: because the node also tells you which pixels it analyzed, you can feed that mask into a grade and protect the region - the same pattern the other Color/Analyze siblings use.
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. Like the other analysis nodes, this is a "you're already in the pack" tool - but the Color/Analyze trio is one of the better reasons to keep MKRShift installed if you do any grading.
Where people get burned
Reading the plot without setting sat_floor. With sat_floor at 0, every grayscale pixel counts as "low saturation" and the plot fills with noise that hides the real signal. The 0.04 default is there to keep near-gray pixels from polluting the density. And remember the scope is display - if it looks faint on a dark image, raise density_gain rather than assuming your image has no saturation.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"density_gain":1.0,"sat_floor":0.04,"graticule":0.4,"sample_step":2,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| sat_luma_scope_info | STRING | — |