tid2013_compare — IMGMETRICS iqa op

• Data kinds: any × any × any → table

• Call: import fullseye as fs; fs.ledger.tid2013_compare(values, author_values, mos, published: 'Optional[Tuple[float, float]]' = None, inf_as: 'Optional[float]' = None) -> 'dict' (to call the implementation directly, import iqatid; iqatid.tid2013_compare(values, author_values, mos, published: 'Optional[Tuple[float, float]]' = None, inf_as: 'Optional[float]' = None) -> 'dict'; from the registry, opsimgmetrics.get("tid2013_compare"))

Usage

Compares your own values with the authors' values (same pairs, same order): per-row differences and rank correlations with the MOS.

inf_as = the value that replaces our own inf before taking differences. The author writes a perfect PSNR match as 100000.0 (106 rows of psnr.txt, distortion 18), so inf_as=100000.0 makes the per-row difference 0. If omitted and an inf is present, ValueError (never silently dropped). Rank correlation uses inf as an ordering. The author's marker appears in 111 rows of psnr.txt, but with the BT.601 formula Y′ matches the reference in 106 rows -- in the other 5 rows (reference I12, 5 levels of saturation change) the luminance of 28 pixels falls exactly on k.5, the rounding direction disagrees with the author's arithmetic, giving a 1 LSB difference → 86.6 dB (half to even, round half up, float32 and integer formulas were all tried and none gives 111, 2026-10-04). Therefore diff_max_finite (the maximum difference over only those rows where neither the author nor we have a perfect match) and sentinel_mismatch_idx / sentinel_mismatch_values (rows where the author has the marker but ours is finite, and their values) are returned separately. The gate looks at both.

Returns: n, n_inf, n_sentinel_author, diff_max (maximum of |ours − author|, including marker rows), diff_max_finite / argmax_finite, sentinel_mismatch_idx / sentinel_mismatch_values, inf_not_sentinel_idx (ours is inf, the author's is a number), diff_mean (signed mean), diff_rms, argmax (row of the maximum difference), srocc / krocc (ours vs MOS), srocc_author / krocc_author (author values vs MOS), and if published is passed, d_srocc_published / d_krocc_published (ours − published) and d_srocc_author_published / d_krocc_author_published. Raises ValueError: length mismatch, nan, inf without inf_as.

Detailed usage guide

• image_difference_metrics family guide

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_iqa_fsim_gmsd_vif — py -3.11 examples/poc_iqa_fsim_gmsd_vif.py

• poc_iqa_tid2013 — py -3.11 examples/poc_iqa_tid2013.py

Ops the type connects to (they accept table as input)

luma_limited_u8 · rank_data · tid2013_index · tid2013_by_distortion

Same category (iqa)

luma_limited_u8 · rank_data · rank_spearman · rank_kendall_b · tid2013_published · tid2013_root · tid2013_index · tid2013_metric_values


*Provenance: iqatid.py — IMGMETRICS operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.