JzAzBz / JzCzhz Coordinates (absolute, at current nits)
| Colour | Jz | Az | Bz | Cz | hz (°) | Iz (PQ) |
|---|---|---|---|---|---|---|
| A | — | — | — | — | — | — |
| B | — | — | — | — | — | — |
| |ΔA−B| | — | — | — | — | — | — |
Cz = √(Az²+Bz²) · hz = atan2(Bz,Az)·180/π · Jz range: 0 (black) → ~1 (10 000 cd/m²). Absolute nits = sRGB Y × peak_nits.
Inverse Transform Round-Trip (JzAzBz → XYZ → sRGB verification)
Jz,Az,Bz → Iz → PQ⁻¹ → LMS → XYZ (abs) → ÷ nits → sRGB. Perfect round-trip confirms numerical accuracy of both forward and inverse.
Cross-Space ΔE Comparison
| Colour Space | L/J component | a component | b component | ΔE (simple) | Notes |
|---|
CIELAB / OKLab use relative luminance (nits-invariant). JzAzBz and ICtCp are nits-sensitive — values change with display luminance setting.
Luminance-Scaling Experiment (how each space tracks nits change)
| Nits | Jz (A) | Cz (A) | L* (CIELAB) | L (OKLab) | Jz (B) | ΔEz |
|---|
CIELAB L* is identical across all rows (divides by Y_n). Jz grows with nits — the key HDR advantage.
Active Parameter Summary
| Parameter | Colour A | Colour B |
|---|---|---|
| Jz (lightness) | — | — |
| Cz (chroma) | — | — |
| hz (hue °) | — | — |
| ΔEz | — | |
| ΔE2000 | — | |
| Display nits | — | |
Az–Bz Gamut Plane (at current nits)
Gold = A · Blue = B · Ring = Cz(A) · Thin outline = sRGB gamut boundary · Dashes = constant hue steps · Dots = Az/Bz axes
Jz vs Display Luminance (lightness response across HDR range)
Gold = JzAzBz A · Blue dash = JzAzBz B · Teal = CIELAB L*/100 · Green = OKLab L · Vertical dashed = current nits
JzCzhz Hue Wheel (hue angles of A and B)
Hue angle hz = atan2(Bz, Az) · Chroma Cz = √(Az²+Bz²) · Gold dot = A · Blue dot = B
ΔE Comparison — All Metrics
ΔEz (JzAzBz) · ΔE2000 · ΔEab (CIELAB) · ΔEok (OKLab) · ΔEICtCp
PQ Transfer Function (ST 2084) (vs cube-root and gamma 2.2)
Gold = PQ (ST 2084, Dolby) · Teal = Cube-root (CIELAB) · Blue = Gamma 2.2 · X = log₁₀(nits), Y = encoded signal (0–1)
Why JzAzBz? — CIELAB's Failure at HDR Luminance
CIELAB (1976) uses relative luminance: L* = 116·(Y/Yn)^(1/3) − 16. The same sRGB values produce identical L* on a 100 cd/m² and 1000 cd/m² display. This is wrong for HDR — the visual system responds to absolute luminance, not ratios alone.
Safdar et al. (2017) embedded the PQ (ST 2084) transfer function to encode 0–10 000 cd/m² perceptually. JzAzBz Jz lightness tracks absolute luminance, giving correct uniformity across the entire HDR range.
CIELAB problem: L* = 116·(Y/Yn)^(1/3) − 16 relative, nits-invariant
JzAzBz: XYZ_abs = XYZ_rel × peak_nits absolute luminance
LMS → PQ-encode → opponent → Jz compression
Forward Transform: XYZ → JzAzBz (4 stages)
Stage 1: Pre-adapt for crosstalk (B=1.15, G=0.66)
Xp = B·X − (B−1)·Z, Yp = G·Y − (G−1)·X, Za = Z
Stage 2: Adapted XYZ → LMS (Safdar matrix)
L = 0.41478972·Xp + 0.579999·Yp + 0.01464800·Za
M = −0.20151000·Xp + 1.120649·Yp + 0.05310080·Za
S = −0.01660080·Xp + 0.26480000·Yp + 0.66847990·Za
Stage 3: PQ encode (SMPTE ST 2084)
Lp = PQ(L), Mp = PQ(M), Sp = PQ(S)
Stage 4: Opponent + Jz compression
Iz = 0.5·Lp + 0.5·Mp
Az = 3.524·Lp − 4.066708·Mp + 0.542708·Sp
Bz = 0.199076·Lp + 1.096799·Mp − 1.295875·Sp
Jz = (1+D)·Iz / (1+D·Iz) − D0
D = −0.56, D0 = 1.6295e-11
Jz ≈ 0 for 0 cd/m², ≈ 0.167 for 100 cd/m² white, ≈ 1 for 10 000 cd/m² white (HDR peak).
Polar Form: JzCzhz (Lightness, Chroma, Hue)
Cz = √(Az² + Bz²) chroma hz = atan2(Bz, Az) × (180/π) hue angle [0, 360) Inverse: Az = Cz · cos(hz·π/180) Bz = Cz · sin(hz·π/180)
JzCzhz is the HDR analogue of CIELCh — useful for hue-preserving brightness edits, saturation adjustments, and hue rotation.
ΔEz — Simple Euclidean vs ΔE2000
JzAzBz — simple Euclidean: ΔEz = √(ΔJz² + ΔAz² + ΔBz²) CIELAB ΔE2000 (complex): ΔE2000 = √((ΔL'/kL·SL)² + (ΔC'/kC·SC)² + (ΔH'/kH·SH)² + RT·(ΔC'/kC·SC)·(ΔH'/kH·SH)) ...with SL, SC, SH hue-dependent corrections, RT rotation term
Safdar et al. showed ΔEz achieves lower average error than ΔE2000 on HDR datasets, with no correction factors. ΔEz ≈ 1 ≈ JND at moderate luminance.
PQ Transfer Function (SMPTE ST 2084) — The HDR Core
PQ OETF (Dolby, standardised SMPTE ST 2084): Yd = Y_nits / 10000 m1 = 2610/16384 ≈ 0.1593 m2 = 2523/128 ≈ 78.84 c1 = 3424/4096 ≈ 0.8359 c2 = 2413/128 ≈ 18.86 c3 = 2392/128 ≈ 18.68 E_PQ = ((c1 + c2·Yd^m1) / (1 + c3·Yd^m1))^m2 Range: 0 → 1 over 0 → 10 000 cd/m² PQ Inverse (EOTF): Yd = ((E^(1/m2) − c1) / (c2 − c3·E^(1/m2)))^(1/m1)
PQ matches the Barten (1999) contrast sensitivity function — 1% increments correspond to approximately equal perceived steps across all luminance levels. This is why JzAzBz uses PQ rather than a power law.
JzAzBz vs ICtCp (BT.2100) — Two HDR Colour Spaces
| Property | JzAzBz | ICtCp |
|---|---|---|
| Year | 2017 | 2016 |
| Transfer | PQ (ST 2084) | PQ (ST 2084) |
| Input | XYZ (absolute) | BT.2020 linear |
| Opponent | Az (red-green), Bz (yellow-blue) | Ct (chrominance T), Cp (chrominance P) |
| ΔE simplicity | Simple Euclidean | Simple Euclidean |
| CIE adopted | Not yet | ITU-R BT.2100 |
| Use case | HDR gamut mapping, appearance | HDR encoding, luma keying |
Both use PQ for absolute luminance. ICtCp works from BT.2020 primaries and is optimised for broadcast. JzAzBz works from XYZ and is optimised for perceptual uniformity in colour appearance and gamut mapping.
JzAzBz Forward Transform (XYZ → JzAzBz)
Step 1 — Pre-adaptation:
Xp = 1.15·X − 0.15·Z
Yp = 0.66·Y + 0.34·X
Za = Z
Step 2 — LMS (Safdar matrix):
[L M S]ᵀ = M_XYZ→LMS · [Xp Yp Za]ᵀ
M =
[ 0.41478972 0.579999 0.01464800 ]
[−0.20151000 1.120649 0.05310080 ]
[−0.01660080 0.26480000 0.66847990 ]
Step 3 — PQ encode each channel:
Lp = PQ(L/10000), Mp = PQ(M/10000), Sp = PQ(S/10000)
Step 4 — Opponent channels:
Iz = 0.5·Lp + 0.5·Mp
Az = 3.524000·Lp − 4.066708·Mp + 0.542708·Sp
Bz = 0.199076·Lp + 1.096799·Mp − 1.295875·Sp
Jz = (1 + D)·Iz / (1 + D·Iz) − D0
D = −0.56, D0 = 1.6295499532821566e-11
JzAzBz Inverse Transform (JzAzBz → XYZ)
Iz = (Jz + D0) / (1 + D − D·(Jz + D0))
Step 2 — Recover PQ-encoded LMS:
Lp = Iz + 0.1386050433·Az + 0.0580473162·Bz
Mp = Iz − 0.1386050433·Az − 0.0580473162·Bz
Sp = Iz − 0.0960192420·Az − 0.8118918960·Bz
Step 3 — PQ decode:
L = PQ⁻¹(Lp) × 10000
M = PQ⁻¹(Mp) × 10000
S = PQ⁻¹(Sp) × 10000
Step 4 — LMS → XYZ (inverse matrix + pre-adapt inverse):
[Xp Yp Za]ᵀ = M_LMS→XYZ⁻¹ · [L M S]ᵀ
X = (Xp + (B−1)·Za) / B
Y = (Yp + (G−1)·X) / G
PQ Transfer Function (SMPTE ST 2084)
Yd = Y_nits / 10000
Ym = Yd^m1
E = ((c1 + c2·Ym) / (1 + c3·Ym))^m2
PQ EOTF (decode):
Ep = E^(1/m2)
Y_nits = 10000 · max(Ep − c1, 0)^(1/m1) / (c2 − c3·Ep)^(1/m1)
Constants (exact rationals):
m1 = 2610 / 16384 = 0.15930175781...
m2 = 2523 / 4096 × 128 = 78.84375
c1 = 3424 / 4096 = 0.8359375
c2 = 2413 / 4096 × 32 = 18.8515625
c3 = 2392 / 4096 × 32 = 18.6875
Dynamic range: 0.001 → 10 000 cd/m² in 10-bit or 12-bit PQ encoding.
ΔEz Colour Difference (Euclidean in JzAzBz)
ΔEz = √(ΔJz² + ΔAz² + ΔBz²)
JND threshold:
ΔEz ≈ 1 — Just Noticeable Difference (moderate nits)
ΔEz < 0.5 — practically indistinguishable
ΔEz ≈ 2 — clearly different
ΔEz ≈ 5+ — large, obvious difference
ΔE2000 comparison (for reference):
ΔE2000 = f(ΔL', ΔC', ΔH', SL, SC, SH, RT)
5 correction factors, rotation term at blue hue
Note: ΔEz is nits-dependent — same sRGB pair
produces different ΔEz at different peak luminance.
Limitations and Context
2. Pre-adaptation constants (B=1.15, G=0.66) are fixed, not adaptive
3. Not officially adopted by CIE (as of 2024)
4. ΔEz is less studied than ΔE2000 on SDR-only datasets
5. No viewing-condition adaptation (no surround, LA)
6. Inverse transform can produce out-of-gamut XYZ/sRGB
7. D0 constant was empirically chosen to avoid Jz(0) < 0
Despite these: JzAzBz is the best published simple HDR
colour space for gamut mapping and colour appearance
evaluation across the full 0–10 000 cd/m² range.
Primary Source — JzAzBz
- Safdar, M., Cui, G., Kim, Y.J. & Luo, M.R. (2017). Perceptually uniform colour space for image signals including high dynamic range and wide colour gamut. Optics Express, 25(13), 15131–15151.
PQ Transfer Function
- SMPTE ST 2084:2014. High Dynamic Range Electro-Optical Transfer Function of Mastering Reference Displays (Perceptual Quantizer).
- Miller, S., Nezamabadi, M. & Daly, S. (2013). Perceptual Signal Coding for More Efficient Usage of Bit Codes. SMPTE Motion Imaging Journal, 122(4), 52–59.
- Barten, P.G.J. (1999). Contrast Sensitivity of the Human Eye and Its Effects on Image Quality. SPIE Press.
ICtCp and BT.2100
- ITU-R BT.2100-2 (2018). Image parameter values for high dynamic range television for use in production and international programme exchange.
- Lu, T., Pu, F., Yin, P., Chen, T., Husak, W., Pytlarz, J., Atkins, R., Froehlich, J. & Su, G.-M. (2016). ITP Colour Space and Its Compression Performance for High Dynamic Range and Wide Colour Gamut Video Distribution. ZTE Communications, 14(1).
CIELAB, OKLab, and Colour Appearance
- CIE 15:2004. Colorimetry, 3rd ed. (CIELAB definition).
- Ottosson, B. (2020). A perceptual colour space for image processing. OKLab.
- Fairchild, M.D. (2013). Color Appearance Models, 3rd ed. Chichester: Wiley.
- Li, C. et al. (2017). Comprehensive color solutions: CAM16, CAT16, and s-CIECAM16. Color Research & Application, 42(6), 703–718.
Generate 200 random sRGB colour pairs, compute JzAzBz at current nits, and show the ΔEz distribution. Includes JND threshold count (ΔEz < 1 ≈ indistinguishable) and statistical summary.
| Colour A | Colour B | ΔEz | Jz(A) | Jz(B) | |ΔJz| |
|---|