◎ Radiance QC Pro
The automated check that catches what your eyeballs miss
- image
- overlay_image
- qc_report_text
- qc_report_json
- status
You've looked at a render for twenty minutes and decided it's fine. A QC tool looks at the same pixels for a tenth of a second and tells you 0.4% of the blacks are crushed, 1.1% of the whites are clipped past gamut, and there's a banding risk in the sky gradient. That's the whole pitch of ◎ Radiance QC Pro: it's the boring, repeatable, embarrassing-to-fail-on checks done automatically, so you stop trusting your tired eyes.
Radiance is FXTD Studios' 32-bit float color-science suite for ComfyUI, and QC Pro is its quality gate. If you're delivering frames to a client, a pipeline, or even just your own "no banding, ever" standard, you drop this after the VAE decode or the grade and read the verdict instead of squinting.
How it works
The node runs a batch of vectorized checks against your image tensor. Always on: level analysis (crushed blacks against black_threshold, clipped whites against white_threshold), gamut checking (pixels outside the [0,1] SDR range), and banding/posterization detection with a sensitivity dial. Then three optional checks you toggle on as you need them: noise, compression artifacts, and focus/sharpness analysis.
Each frame gets a PASS/FAIL per check, everything rolls up into an overall status, and you get the result in three flavors plus a picture. The code is structured around defects.analyze_levels, check_gamut, detect_banding, analyze_noise, detect_compression_artifacts, and analyze_focus - each returns per-frame percentages, and the report is built from them.
The inputs that matter
Only image is required. The three you'll actually touch:
black_threshold(default 0) - below this counts as crushed black. Leave it at 0 for SDR.white_threshold(default 1) - above this counts as clipped white. If you're QCing scene-linear or HDR material where highlights legitimately sit above 1.0, raise it; a default 1.0 will flag every specular as a failure.banding_threshold(default 5) - how aggressive banding detection is.
Then enable_focus_check, enable_artifacts_check, and enable_noise_check are the check toggles (focus is off by default since it's the priciest), and fail_on_errors makes any FAIL flip the whole status.
Outputs, in the order that matters: overlay_image (the image with issues highlighted in color, at overlay_opacity), qc_report_text (human-readable), qc_report_json (machine-readable - wire this straight into Radiance Export QC Report to write files), and status (the pass/fail string you can feed into logic).
How to install it
This node ships in the radiance pack, so installing the pack installs QC. Via ComfyUI Manager, search "Radiance". Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements_windows.txt # or requirements_linux.txt / requirements_mac_silicon.txt
Restart ComfyUI, and QC Pro lives under FXTD Studios/Radiance/Analyze. On Linux, install libopenexr-dev first - QC itself doesn't need it, but the pack's IO nodes do, and it's easier to do it once.
Common issues
The honest caveat, straight from the pack's own docs: QC can only report what's in the data. A white_threshold of 1.0 on an 8-bit PNG that already clipped its sky in compression will scream "clipped whites" forever - and it's right, it's just reporting on damage you can't undo. If that annoys you, either lower the bar for SDR delivery or work from 32-bit/EXR sources so the highlights are actually there. Also: the default QC node will happily analyze any IMAGE you feed it, including 8-bit previews, so match the thresholds to what you're actually delivering.
A tool like this is overkill if you're posting to socials. If you're grading a shot that has to hold up next to real footage, it's the difference between "looks fine to me" and a pass/fail report you can hand someone.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| black_thresholdopt | FLOAT | 0.000-0.1–0.1 | — |
| white_thresholdopt | FLOAT | 1.000.8–2 | — |
| overlay_opacityopt | FLOAT | 0.50–1 | — |
| banding_thresholdopt | FLOAT | 5.00–20 | — |
| enable_focus_checkopt | BOOLEAN | false | — |
| enable_artifacts_checkopt | BOOLEAN | true | — |
| enable_noise_checkopt | BOOLEAN | true | — |
| fail_on_errorsopt | BOOLEAN | false | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| overlay_image | IMAGE | — |
| qc_report_text | STRING | — |
| qc_report_json | STRING | — |
| status | STRING | — |