Nodes/MKRShift_Nodes/Sat / Luma Scope
ComfyUI Node

Sat / Luma Scope

The density plot that catches what your eyes won't

By criskb·Created 7 months ago·Updated 5 months ago· 0
Sat / Luma Scope
  • image
  • mask
  • image
  • mask
  • sat_luma_scope_info
settings_json{"density_gain":1.0,"sat_floor":0.04,"graticule":0.4,"sample_step":2,"mask_feather":12.0,"invert_mask":false}

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 analysis
  • sat_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 readout
  • graticule (0.40) - the reference grid overlay, so you can read positions against a scale
  • sample_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 plot
  • mask - 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.

CategoryMKRShift Nodes/Color/Analyze

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"density_gain":1.0,"sat_floor":0.04,"graticule":0.4,"sample_step":2,"mask_feather":12.0,"invert_mask":false}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
sat_luma_scope_infoSTRING