Goal. Quantify how the scan container (format) and the scanning resolution affect the accuracy of profiles produced by this engine, using A_tiff_8bit_200dpi as the baseline cell (TIFF / 200 dpi / 8 bit).
Pipeline. Every cell goes through exactly the same code path as the web UI
(service.pipeline.process_scan) with the same production recipe:
grid=33 · base=adobe · wp=apex · bp=foot · axis_warp=0.6 · delta_tau=0.35 ·
delta_tau_far=0.22 · smoothing=1e-4. Nothing is retuned per cell; the input file is the
only variable.
Metric. Only the high-precision read-out is reported: the generated A2B0 CLUT
is read back at full precision and trilinearly interpolated
(service.metrics.hi_precision). The usual LittleCMS judge is deliberately not used
here — Pillow's 8-bit LAB quantises a/b to integers and injects a ≈0.69 ΔE76 noise floor, which
is three times the size of the effects this study is trying to resolve.
Sample set. Nine scans of one chart — TIFF, PNG and JPEG at 200/400/800 dpi, all 8-bit — so three containers are available at every resolution and the format can be compared at a fixed resolution.
Fixed variables. One chart, one scanner, one paper; reference CR2026.01.13.txt (chart model colorruler) for every cell, so the comparison is internally consistent.
What this study can establish.
What it cannot establish, and why.
| Cell | Grp | Format | Pixels | Mpx | File MB | Declared | Actual | DPI tag | MD5 (12) |
|---|---|---|---|---|---|---|---|---|---|
| A_jpg_8bit_200dpi | A | JPEG | 1434×1049 | 1.50 | 0.18 | 200 dpi / 8 bit | 8 bit | 200 | a6efb0ce1999 |
| A_jpg_8bit_400dpi | A | JPEG | 2868×2098 | 6.02 | 0.75 | 400 dpi / 8 bit | 8 bit | 400 | 1eb7909fc1e5 |
| A_jpg_8bit_800dpi | A | JPEG | 5736×4196 | 24.07 | 4.01 | 800 dpi / 8 bit | 8 bit | 800 | 994ea7818590 |
| A_png_8bit_200dpi | A | PNG | 1434×1049 | 1.50 | 2.24 | 200 dpi / 8 bit | 8 bit | 200 | 4617ffb27d52 |
| A_png_8bit_400dpi | A | PNG | 2868×2098 | 6.02 | 9.89 | 400 dpi / 8 bit | 8 bit | 400 | fdee12fe3415 |
| A_png_8bit_800dpi | A | PNG | 5736×4196 | 24.07 | 43.64 | 800 dpi / 8 bit | 8 bit | 800 | 3dd26175886c |
| A_tiff_8bit_200dpi | A | TIFF | 1434×1049 | 1.50 | 4.31 | 200 dpi / 8 bit | 8 bit | 200 | a1212fe4ade3 |
| A_tiff_8bit_400dpi | A | TIFF | 2868×2099 | 6.02 | 17.24 | 400 dpi / 8 bit | 8 bit | 400 | 42b799ccad1e |
| A_tiff_8bit_800dpi | A | TIFF | 5736×4199 | 24.09 | 68.94 | 800 dpi / 8 bit | 8 bit | 800 | 6a00bfc7906f |
| File A | File B | mean |Δ| | p99 | max | ΔE2000 mean A → B |
|---|---|---|---|---|---|
| A_png_8bit_200dpi | A_tiff_8bit_200dpi | 2.0575 | 9.00 | 27.0 | 0.2908 → 0.2907 (-0.0000) |
| A_jpg_8bit_200dpi | A_tiff_8bit_200dpi | 2.4008 | 11.00 | 47.0 | 0.3039 → 0.2907 (-0.0132) |
| A_jpg_8bit_200dpi | A_png_8bit_200dpi | 2.4624 | 11.00 | 53.0 | 0.3039 → 0.2908 (-0.0132) |
| A_png_8bit_400dpi | A_tiff_8bit_400dpi | 2.6881 | 12.00 | 45.0 | 0.2767 → 0.2756 (-0.0011) |
| A_jpg_8bit_400dpi | A_png_8bit_400dpi | 3.0011 | 13.00 | 49.0 | 0.2902 → 0.2767 (-0.0135) |
| A_jpg_8bit_400dpi | A_tiff_8bit_400dpi | 3.0812 | 14.00 | 47.0 | 0.2902 → 0.2756 (-0.0145) |
| A_jpg_8bit_800dpi | A_png_8bit_800dpi | 4.8506 | 24.00 | 73.0 | 0.2705 → 0.2642 (-0.0063) |
| A_png_8bit_800dpi | A_tiff_8bit_800dpi | 5.4149 | 27.00 | 97.0 | 0.2642 → 0.2552 (-0.0090) |
| A_jpg_8bit_800dpi | A_tiff_8bit_800dpi | 5.6641 | 28.00 | 112.0 | 0.2705 → 0.2552 (-0.0153) |
Only same-resolution pairs are compared (9 of them, ordered by closeness); the full matrix including cross-resolution pairs is in plan.json.
| Cell | ΔE76 mean | ΔE76 max | ΔE2000 mean | vs baseline | ΔE2000 max | ≤1 | ≤2 | ≤5 | ICC kB | Time s |
|---|---|---|---|---|---|---|---|---|---|---|
| A_jpg_8bit_200dpi | 0.4219 | 4.42 | 0.3039 | +4.5% | 5.20 | 275/288 | 287/288 | 287/288 | 223.0 | 11.68 |
| A_png_8bit_200dpi | 0.4068 | 3.93 | 0.2908 | +0.0% | 4.58 | 273/288 | 287/288 | 288/288 | 223.0 | 6.12 |
| A_tiff_8bit_200dpi baseline | 0.4070 | 3.85 | 0.2907 | +0.0% | 4.43 | 273/288 | 287/288 | 288/288 | 223.0 | 6.20 |
| A_jpg_8bit_400dpi | 0.4115 | 3.41 | 0.2902 | -0.2% | 3.94 | 275/288 | 287/288 | 288/288 | 223.0 | 8.25 |
| A_png_8bit_400dpi | 0.3970 | 3.71 | 0.2767 | -4.8% | 3.51 | 274/288 | 287/288 | 288/288 | 223.0 | 7.27 |
| A_tiff_8bit_400dpi | 0.3978 | 3.97 | 0.2756 | -5.2% | 3.44 | 272/288 | 287/288 | 288/288 | 223.0 | 7.08 |
| A_jpg_8bit_800dpi | 0.3860 | 3.13 | 0.2705 | -6.9% | 3.72 | 278/288 | 287/288 | 288/288 | 223.0 | 11.79 |
| A_png_8bit_800dpi | 0.3834 | 3.89 | 0.2642 | -9.1% | 2.95 | 275/288 | 287/288 | 288/288 | 223.0 | 11.40 |
| A_tiff_8bit_800dpi | 0.3598 | 2.77 | 0.2552 | -12.2% | 3.01 | 279/288 | 287/288 | 288/288 | 223.0 | 10.49 |
| ΔE2000 mean — lower is better | value | |
|---|---|---|
| A_tiff_8bit_800dpi | 0.2552 | |
| A_png_8bit_800dpi | 0.2642 | |
| A_jpg_8bit_800dpi | 0.2705 | |
| A_tiff_8bit_400dpi | 0.2756 | |
| A_png_8bit_400dpi | 0.2767 | |
| A_jpg_8bit_400dpi | 0.2902 | |
| A_tiff_8bit_200dpi | 0.2907 | |
| A_png_8bit_200dpi | 0.2908 | |
| A_jpg_8bit_200dpi | 0.3039 |
6.1 Format effect (ΔE2000 mean). The middle-right column is the calibration: TIFF and PNG are both lossless, so their difference is the scan-to-scan noise floor. Read the last column against it — a JPEG penalty that repeatably exceeds the floor, at every resolution, is a real format effect; one that scatters around the floor is not.
| Resolution | TIFF | PNG | JPEG | spread | lossless noise floor (TIFF vs PNG) | JPEG − TIFF |
|---|---|---|---|---|---|---|
| 200 dpi | 0.2907 | 0.2908 | 0.3039 | 0.0132 | 0.0000 | +0.0132 (+4.5%) |
| 400 dpi | 0.2756 | 0.2767 | 0.2902 | 0.0145 | 0.0011 | +0.0145 (+5.3%) |
| 800 dpi | 0.2552 | 0.2642 | 0.2705 | 0.0153 | 0.0090 | +0.0153 (+6.0%) |
6.2 Resolution effect (ΔE2000 mean). All three containers are present at each resolution, so the trend can be read per container. Each step is a doubling of the linear resolution, i.e. four times the pixels averaged per patch.
| Format | 200 dpi | 400 dpi | 800 dpi | 200→800 | step-to-step |
|---|---|---|---|---|---|
| TIFF | 0.2907 | 0.2756 | 0.2552 | -12.2% | -5.2% → -7.4% |
| PNG | 0.2908 | 0.2767 | 0.2642 | -9.1% | -4.8% → -4.5% |
| JPEG | 0.3039 | 0.2902 | 0.2705 | -11.0% | -4.5% → -6.8% |
| Cell | Scan file MB | ΔE2000 mean | MB per 0.001 ΔE2000 | Build time s | ΔE00 per MB |
|---|---|---|---|---|---|
| A_jpg_8bit_200dpi | 0.18 | 0.3039 | 0.0 | 11.68 | 1719.031 |
| A_png_8bit_200dpi | 2.24 | 0.2908 | 0.0 | 6.12 | 129.539 |
| A_tiff_8bit_200dpi | 4.31 | 0.2907 | 0.0 | 6.20 | 67.422 |
| A_jpg_8bit_400dpi | 0.75 | 0.2902 | 0.0 | 8.25 | 384.650 |
| A_png_8bit_400dpi | 9.89 | 0.2767 | 0.0 | 7.27 | 27.987 |
| A_tiff_8bit_400dpi | 17.24 | 0.2756 | 0.1 | 7.08 | 15.989 |
| A_jpg_8bit_800dpi | 4.01 | 0.2705 | 0.0 | 11.79 | 67.399 |
| A_png_8bit_800dpi | 43.64 | 0.2642 | 0.2 | 11.40 | 6.054 |
| A_tiff_8bit_800dpi | 68.94 | 0.2552 | 0.3 | 10.49 | 3.702 |
| Cell | ΔE2000 max | Worst patch | Top 5 patches (ΔE2000) |
|---|---|---|---|
| A_jpg_8bit_200dpi | 5.198 | I16 | I16 5.198, K16 1.709, H01 1.543, L20 1.387, H16 1.360 |
| A_png_8bit_200dpi | 4.577 | I16 | I16 4.577, L20 1.970, K16 1.715, L21 1.430, H16 1.428 |
| A_tiff_8bit_200dpi | 4.433 | I16 | I16 4.433, L20 1.981, K16 1.822, H16 1.418, GS22 1.382 |
| A_jpg_8bit_400dpi | 3.942 | I16 | I16 3.942, K16 1.453, B21 1.249, C16 1.243, F22 1.206 |
| A_jpg_8bit_800dpi | 3.723 | I16 | I16 3.723, D01 1.322, K16 1.307, F22 1.260, E22 1.230 |
| A_png_8bit_400dpi | 3.505 | I16 | I16 3.505, K16 1.900, L20 1.528, A21 1.303, B21 1.275 |
| A_tiff_8bit_400dpi | 3.444 | I16 | I16 3.444, K16 1.906, L20 1.516, C16 1.278, L21 1.269 |
| A_tiff_8bit_800dpi | 3.006 | I16 | I16 3.006, K16 1.960, L20 1.419, F22 1.277, C16 1.239 |
| A_png_8bit_800dpi | 2.947 | I16 | I16 2.947, K16 1.854, L20 1.455, C16 1.271, F22 1.269 |
1. Spend the budget on resolution, not on format. Going from 200 dpi to 800 dpi reduces ΔE2000 mean by 12.2 % (TIFF), 9.1 % (PNG), 11.0 % (JPEG); each step doubles the linear resolution, i.e. quadruples the pixels averaged per patch. The format choice moves accuracy by at most +5.3%. If a scan setting has to be chosen under a cost constraint, resolution is where the accuracy is.
2. TIFF or PNG — pick on workflow grounds only. The two lossless containers differ by 0.0034 ΔE2000 on average: an order of magnitude below the resolution effect and several times below the JPEG penalty. There is no accuracy argument for one over the other — choose TIFF for maximum tool compatibility, or PNG when size matters and losslessness is still required.
3. JPEG costs a little, and it is a real cost, not noise. The gap to TIFF averages +5.3% and is above TIFF at all three resolutions. A single consistent sign across three independent scans is unlikely to be coincidence, so the direction is reliable; the magnitude is bounded below by the noise floor and cannot be pinned down more tightly without a same-acquisition control. Practically: if storage or transfer is the constraint, JPEG at a higher resolution beats TIFF at a lower one (section 7) — just accept that the scan is no longer re-processable without generational loss.
4. Do not expect a container change to fix the residual error. The worst patches are the same across every container and resolution, so the remaining error is systematic. That places the next improvement in the engine, not in the scan settings — the dark-end residuals identified in section 8 and the yellow highlight ridge noted in earlier work remain the open levers.
Recommended production settings.
The two recommendations point in opposite directions on purpose. The most accurate cell is a large lossless file; the value winner gives the same accuracy as the requested baseline for a fraction of the file size. Which one is right depends on whether the scans must survive as a re-processable master (take lossless) or exist only to produce the profile (take the cheaper one). What is not a good trade is staying at low resolution with a large lossless format: that pays the size without buying the accuracy.
Baseline note. The baseline cell is A_tiff_8bit_200dpi as requested. Absolute ΔE values depend on the reference batch; every cell here shares CR2026.01.13.txt, so the comparisons are internally consistent, but the absolute numbers should not be quoted against a study that used a different reference.