ComfyUI Node

Vector Scope

A real broadcast vectorscope hiding inside ComfyUI

By APZmedia·Created 11 months ago·Updated 5 months ago· 7
Vector Scope
  • image
  • vectorscope
scope_size512
dot_radius2

If you've ever graded video you know the thing: a circular scope where every pixel's color becomes a dot, hue around the rim and saturation radiating from the center. That's a vectorscope, and this node drops a real one - the broadcast NTSC kind, not a pretty histogram - straight into a ComfyUI graph. You feed it an image and it returns a square scope picture you can preview, save, or stare at while diagnosing why your renders look off.

Let's be honest about who needs this. 99% of SD generation never touches a scope; if your problem is "this LoRA makes everything slightly green," the usual move is just eyeballing it against a reference. But if you're doing color-critical post, matching a source image's grade, or trying to nail skin tones across a batch, a vectorscope tells you things your eyes refuse to: whether that "slightly warm" image is actually 15° toward orange, whether you're clipping saturation hard, or whether your white balance drifted between two renders. It's genuinely one of the few real vectorscopes in the ecosystem - most color toolkits (WAS Node Suite and friends) give you color correction but stop short of scopes, and the ones that do ship them tend to bury them in film-look packs.

How it works

The mechanism is straight out of the analog broadcast manual. For every pixel the node computes the NTSC color-difference signals, R-Y and B-Y, using the classic coefficient matrix (0.701/-0.587/-0.114 for R-Y, -0.299/-0.587/0.886 for B-Y), then converts those to polar form: eccentricity (how far from neutral) and an angle (which hue). Each pixel becomes one colored dot at that polar position on a scope drawn with OpenCV - concentric rings, degree ticks, the I/Q axis lines, and the six target boxes labeled B, G, CY, R, MG, YL, the same alignment targets broadcast color bars use. Dots carry their own color, so a normal photo makes a smeared cloud, not a tidy pattern. Distance from center is saturation, angle is hue, and a cluster pinned in a target box means you have a lot of pure-ish color riding that axis.

The inputs and the output

Three inputs, and you'll only fiddle with two of them:

  • image (required) - any image tensor.
  • scope_size (default 512, 256–1024) - the square resolution of the output scope. Leave it at 512.
  • dot_radius (default 2, 1–10) - how big each pixel's dot is. Bump it up when your cloud is too sparse to read.

Output is a single vectorscope IMAGE. It's not an output node, so wire it into a Preview Image or Save Image. The scope's the whole point - there's no stats JSON here.

Installing it

Search "ComfyUI Color Profile Reader" in ComfyUI Manager and hit install, or:

cd ComfyUI/custom_nodes
git clone https://github.com/APZmedia/ComfyUI-color-tools.git

Then restart. Here's the gotcha hiding in the fine print: requirements.txt only lists Pillow. The OpenCV and numpy this node actually needs get pip-installed automatically by the pack's install.py on first load. That usually Just Works, but on an offline box or a locked-down environment it fails - and because the pack registers each node in its own try/except, VectorScope just silently doesn't appear while everything else loads. If it's missing, check the console for "Vector scope node unavailable."

Where people get burned

The honest catch is speed. This is a per-pixel Python loop drawing a circle for every pixel - a 512×512 input means roughly 260,000 dots. It's not instant, and at 1024×1024 it's a genuinely annoying wait. Downscale your image before the scope (an Image Scale node at ~512 is standard practice even in pro grading, where scopes run on proxies), and leave scope_size at 512. Also note it only reads the first frame of a batch - a 4-frame video tensor gets you frame 0 only.

Once it's running, read it like this: a neutral image's cloud hugs the center; a color cast shoves the whole cloud off-center toward that hue (green cast, cloud leans toward the green axis); hard saturation clipping packs dots against the rim or into the target boxes. If you're matching two renders for a batch, scoping both and comparing cloud positions is the fastest honest check you have - your eyes will lie to you, the vectorscope won't.

CategoryImage/Color

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
scope_sizeoptINT512256–1024
dot_radiusoptINT21–10

Outputs (1)

NameTypeDescription
vectorscopeIMAGE