◎ Radiance Waveform
A waveform monitor inside ComfyUI, so you can actually see the exposure
- image
- waveform_image
Your monitor lies to you. Every sRGB display compresses highlights and lifts shadows, so "looks fine on screen" is a lousy way to judge whether a shot is actually exposed correctly. A waveform monitor doesn't lie: it's a graph of brightness across the frame, and one glance tells you if your highlights are sitting at 0.9 (healthy) or slammed against 1.0 (clipped). ◎ Radiance Waveform puts that scope inside ComfyUI.
For a colorist this is the second-most-used tool after the image itself - the README's own suite bundles waveform, vectorscope, and false color as the "VFX Grading & Analysis" zone, and the viewer has keyboard shortcuts (W toggles the waveform) built around this family of thinking. For everyone else, it's the fastest way to stop arguing with yourself about whether your render is too dark.
How it works
It converts your image to a scope: a plot where the horizontal axis is the image's column position (left to right) and the vertical axis is brightness, bottom (black) to top (white). Every pixel's brightness is plotted at its column - so a flat gradient shows up as a smooth wedge, a clipped sky slams into the top edge, and a dark scene hugs the bottom. You read it the same way you'd read a studio waveform monitor.
Three mode options cover the standard scopes:
RGB (Overlay)- all three channels drawn on top of each other. Channel balance is visible in how the traces separate.Luma (Y)- a single luma trace using Rec.709 weights (0.2126 R + 0.7152 G + 0.0722 B). Cleanest for pure exposure questions.Parade (RGB)- the three channels side by side. The mode you use when you need to check each channel independently, which is how you catch a channel-specific clip.
size (256–2048) sets the scope resolution, opacity blends it for overlay use. For big inputs it downscales before plotting so the scope stays fast.
The inputs that matter
image- anything with a brightness story to tell.mode- start with Luma (Y) for exposure, Parade (RGB) when you suspect channel clipping, Overlay for general balance.size/opacity- cosmetic-ish; size matters when you're going to actually read it, so leave it at 512+.
The single output, waveform_image, is an IMAGE - wire it to a preview/save node to see the scope. It's an output-capable analysis node, so it fits anywhere you'd put a preview, and you can batch multiple frames through it for a per-frame read.
How to install it
It ships in the radiance pack. ComfyUI Manager → "Radiance", or:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements_windows.txt
Restart, and it's under FXTD Studios/Radiance/Analyze.
Common issues
The main trap is expectation: this node plots the image as it arrives, in its current color space. If you feed it a scene-linear or HDR tensor with values above 1.0, the scope will show those values pinned at the top - that's correct, but it reads as "clipped" until you remember it's an HDR signal. Feed it the same data through the Radiance color pipeline (or tonemap first) and you'll see the real story. Also note the scope is a still from one frame - for video, run it per-frame or rely on the Radiance viewer's built-in waveform, which is HDR-aware per the README.
If "trust the monitor" has ever burned you, this is the antidote. It's a graph you'll learn to read in five minutes and never want to live without.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| mode | COMBO | RGB (Overlay) | 3 options: RGB (Overlay), Luma (Y), Parade (RGB) |
| size | INT | 512256–2048 | — |
| opacity | FLOAT | 1.00.1–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| waveform_image | IMAGE | — |