ComfyUI Node

QC

The node that tells you your delivery is technically broken

By FXTD-Studios·Created 8 months ago·Updated about 18 hours ago· 246
QC
  • image
  • image
  • text_report
  • json_report
  • status
◄modeAnalyze►
◄black_threshold0.000►
◄white_threshold1.00►
◄overlay_opacity0.5►
◄banding_threshold5.0►
◄enable_focus_checkfalse►
◄enable_artifacts_checktrue►
◄enable_noise_checktrue►
◄fail_on_errorsfalse►
◄qc_report_json—►
◄output_path►
◄filename_prefixqc_report►
◄export_formatjson►

QC runs technical checks on an image or a sequence - crushed blacks, clipped whites, out-of-range values, banding risk, and optionally sharpness, compression artifacts and noise - and shows you where the problems are by painting the offending pixels red and blue. It also emits a text report and a JSON report, and in a second mode writes that report to disk as JSON, CSV or HTML.

Think of it as the difference between "I looked at it and it seemed fine" and "the whites clip on frames 41 through 96, here's the percentage." If you're delivering anything, the second one is what you want before somebody else finds it.

Analyze mode: the checks and the overlay

mode defaults to Analyze, which is the interesting one. image is optional in the schema but required in practice for Analyze - it's the thing being checked, usually display-encoded 0..1, i.e. what you'd actually deliver.

Two thresholds do the pass/fail work, and their defaults are chosen to flag only the unambiguous. black_threshold (default 0) counts channel values below it as crushed, and any crushed value fails the frame - so at the default it only flags negatives, which are illegal in a delivered image and worth failing on. white_threshold (default 1.0) counts values above it as clipped, again all-or-nothing per frame. If you want a softer gate, this is not the node for percentages and tolerances - that's what Policy Guard is for. QC is the "is there anything categorically wrong" check.

overlay_opacity (default 0.5) controls the red/blue paint on the output image. At 0 the image passes through clean, which is how you run QC purely for the numbers.

The optional scoring checks are the reason to turn it on when you're not troubleshooting. enable_artifacts_check (on by default) adds an 8×8 block-edge score for JPEG/DCT artifacts, warning at 10/100. enable_noise_check (on by default) adds a high-frequency noise score - below 5/100 warns you've over-denoised, above 30/100 warns of high noise. That's a genuinely useful pair, because both failure directions are common in AI pipelines: over-eager upscalers make things plasticky, and cheap re-encodes make them noisy. enable_focus_check (off by default) adds a Laplacian-variance sharpness score, warning below 20/100. banding_threshold (default 5, in percent of frame) warns above it - a warning only, it never fails a frame, which is the right call given how gradient-dependent banding is.

fail_on_errors is off by default. Turn it on and a QC failure stops the workflow with an error that carries the report, which is how you make QC a gate in an automated run rather than a thing you remember to look at.

Outputs: image (the painted or passed-through frame), text_report and json_report as strings, and status. Wire json_report into the Export pass.

Export mode: a report on disk

Set mode to Export and the image and every check setting are ignored. Instead, qc_report_json takes the json_report output of an earlier Analyze run, and the node writes a file. output_path is the folder - empty means ComfyUI's output folder, a relative path is a subfolder of it, absolute is used as given. filename_prefix defaults to qc_report and gets a date-time stamp and extension appended, so repeated runs don't stomp each other. export_format is json, csv, html or all.

The HTML one is the useful one in practice: it's a report you can attach to an email or drop in a review folder without the recipient needing to parse JSON. CSV is what you'd feed into a spreadsheet when a client asks "how many frames failed".

Install

Ships with Radiance. ComfyUI Manager → search Radiance → install → restart → refresh. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt

It leans on OpenCV and NumPy, both already required by the pack. No models, no downloads.

Where people get burned

  • Analyzing the wrong stage. These thresholds assume display-encoded 0..1 values. Point it at a scene-linear HDR tensor with values at 4 and everything reads as clipped, because it is - just not in the terms you meant. QC the frame you're delivering.
  • Expecting per-frame detail from the pass/fail. The thresholds are per-frame all-or-nothing. The JSON report is where the frame-by-frame numbers live.
  • Banding warnings treated as failures. They're warnings, by design.
  • Running Export without an Analyze upstream. Export needs qc_report_json; with nothing connected there's nothing to write.
CategoryFXTD STUDIOS/Radiance/Review

Inputs (14)

NameTypeDefaultDescription
modeCOMBOAnalyzeAnalyze: run the checks on image. Export: write qc_report_json to disk (the image and check settings are ignored).
imageoptIMAGEImage or sequence to check, as delivered (usually display-encoded 0..1). Required in Analyze mode.
black_thresholdoptFLOAT0.000-0.1–0.1Channel values below this count as crushed, and any crushed value fails the frame. The default 0 flags only negative values.
white_thresholdoptFLOAT1.000.8–2Channel values above this count as clipped, and any clipped value fails the frame. The default 1.0 flags only values over display white.
overlay_opacityoptFLOAT0.50–1Opacity of the red (clipped) and blue (crushed) paint on the output image. 0 passes the image through.
banding_thresholdoptFLOAT5.00–20Banding risk, in percent of the frame, at or above which a banding warning is reported. Warning only, it never fails a frame.
enable_focus_checkoptBOOLEANfalseAdd a Laplacian-variance sharpness score; below 20/100 is reported as a low-sharpness warning.
enable_artifacts_checkoptBOOLEANtrueAdd an 8x8 block-edge score for JPEG/DCT compression artifacts; 10/100 or more is a warning.
enable_noise_checkoptBOOLEANtrueAdd a high-frequency noise score; below 5/100 warns of over-denoising, above 30/100 of high noise.
fail_on_errorsoptBOOLEANfalseStop the workflow with an error, carrying the report, when QC fails. Off: the failure is only reported.
qc_report_jsonoptSTRINGjson_report output of an Analyze run. Export mode only.
output_pathoptSTRINGExport folder. Empty = ComfyUI output folder; relative = subfolder of it; absolute paths are used as is. Export mode only.
filename_prefixoptSTRINGqc_reportReport file name stem; a date-time stamp and the extension are appended. Export mode only.
export_formatoptCOMBOjsonReport file format to write; all writes JSON, CSV and HTML. Export mode only.

Outputs (4)

NameTypeDescription
imageIMAGE—
text_reportSTRING—
json_reportSTRING—
statusSTRING—