Nodes/MKRShift_Nodes/Hue Band Scope
ComfyUI Node

Hue Band Scope

The vectorscope-adjacent readout for colorists

By criskb·Created 7 months ago·Updated 5 months ago· 0
Hue Band Scope
  • image
  • mask
  • image
  • mask
  • hue_band_scope_info
settings_json{"bins":192,"density_gain":1.1,"sat_floor":0.08,"val_floor":0.1,"graticule":0.34,"sample_step":2,"mask_feather":12.0,"invert_mask":false}

If a histogram is a column of numbers about brightness, Hue Band Scope is its cousin for color: it shows you how much of each hue your image actually contains. Think of it as a simplified vectorscope - the color scope that tells a colorist "your skin tones all sit in this one hue band" or "this whole frame is swimming in teal." It's the diagnostic you reach for when a grade looks wrong but you can't articulate what is wrong, because it answers that question in one glance.

It's in MKRShift Nodes/Color/Analyze, alongside x1HistogramScope. The histogram covers luminance and channels; this one covers hue distribution specifically. Both render their readout as a plain image you can wire into a preview or a Save node - no external app, no guessing.

How it works

The node counts pixels by hue, splits the hue circle into bins (default 192 - a high-resolution banding of all 360°), and plots the density of each band as a scope image. Pixels below a saturation or brightness floor are ignored so that near-black and near-white pixels (whose hue is meaningless noise) don't pollute the count - sat_floor (0.08) and val_floor (0.1) are those cutoffs, and they're the first knobs to touch if the readout looks like static.

  • density_gain (1.1) amplifies the vertical scale so subtle hue populations are visible.
  • graticule (0.34) draws the reference grid lines - the faint guide marks that make the plot readable.
  • sample_step (2) subsamples the image (every Nth pixel) for speed. On huge frames this is the difference between instant and laggy; the plot barely changes.

Reading it

A "healthy" image shows a spread of hue bands with a few peaks. A green-cast image slams one band - you'll see a wall of density around 120° and near-emptiness elsewhere. A teal-and-orange grade shows exactly two peaks, because that's what the grade is: two hue families carrying the frame. Once you've looked at a handful of frames this way, "the color feels off" turns into "there's a huge cyan bump I didn't intend," and that's a much more actionable sentence.

Outputs are the scope image, a mask (a hue-derived matte, for the adventurous), and a hue_band_scope_info string. The optional mask input restricts the analysis region.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes

then restart, or install via ComfyUI Manager by searching MKRShift_Nodes. No pip extras, no models - pure numpy counting.

One honest limitation: this is a density plot of hue alone, not a true vectorscope - it won't show you saturation-vs-hue vectors or the standard skin-tone line. For detecting an unwanted cast it's genuinely useful; for certification-level color you'd still want real scope software. And like the histogram, it's rendered output - feed it to a preview or Save, don't loop it back into your grade. It's a mirror, not a filter.

CategoryMKRShift Nodes/Color/Analyze

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"bins":192,"density_gain":1.1,"sat_floor":0.08,"val_floor":0.1,"graticule":0.34,"sample_step":2,"mask_feather":12.0,"invert_mask":false}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
hue_band_scope_infoSTRING