Hue Band Scope
The vectorscope-adjacent readout for colorists
- image
- mask
- image
- mask
- hue_band_scope_info
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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"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} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| hue_band_scope_info | STRING | — |