Pseudo-3D projection of LUT output samples in RGB space.
Heuristic fallback: auto-detects 3D (cube-root) or 1D if headers are missing.
1D LUT: linear interpolation per-channel.
3D LUT: full trilinear interpolation across R×G×B cube.
Custom domain ranges (non-[0,1] domains supported).
.cube Format — Industry Standard
De facto industry standard for 1D/3D color lookup tables; originated from Iridas/Adobe SpeedGrade. Supported by DaVinci Resolve, Adobe Premiere, Final Cut Pro, and virtually all professional color grading applications. The .cube text format specifies TITLE, LUT size headers (LUT_1D_SIZE, LUT_3D_SIZE), optional DOMAIN_MIN/DOMAIN_MAX, and floating-point RGB sample triplets.
sRGB — IEC 61966-2-1
IEC 61966-2-1:1999 — sRGB colour space, the default working and output space for this lab. Defines sRGB primaries under D65 illuminant with a piecewise gamma (linear segment + 2.4 power). Adopted by virtually all consumer displays, web browsers, and image formats (JPEG, PNG, CSS). Transfer: piecewise γ≈2.2, peak luminance 80 cd/m².
Rec.709 — ITU-R BT.709
ITU-R BT.709-6 (2015) — Rec.709 primaries and transfer function for HD video. Uses the same colorimetric primaries as sRGB under D65. The OETF uses a 0.45 power law (BT.1886 EOTF: γ=2.4). Standard for broadcast HD production at 100 cd/m² peak luminance.
Rec.2020 — ITU-R BT.2020
ITU-R BT.2020-2 (2015) — Rec.2020 wide-gamut primaries for UHD/HDR content. Laser-pure single-wavelength primaries: R 630 nm, G 532 nm, B 467 nm. Covers ~75.8% of the CIE 1931 visible gamut. 12-bit piecewise OETF (α=1.0993, β=0.0181).
PQ — SMPTE ST 2084
SMPTE ST 2084:2014 — Perceptual Quantizer electro-optical transfer function for HDR mastering. Designed to match the contrast sensitivity of human vision up to 10,000 cd/m² peak luminance. Used for HDR10 and Dolby Vision. Decoded in the Transfer Function dropdown of this lab.
HLG — ARIB STD-B67
ARIB STD-B67 (2015) — Hybrid Log-Gamma for HDR broadcasting. A scene-referred HDR transfer function backward-compatible with SDR displays. Logarithmic segment for highlights, gamma segment for shadows. Peak luminance 1,000–4,000 cd/m². Designed for live broadcast HDR workflows.
ACES — SMPTE ST 2065 / ACEScct
ACES (SMPTE ST 2065) — Academy Color Encoding System. ACEScg (AP1 primaries, D60 whitepoint, scene-linear) is the standard VFX compositing working space. ACEScct is the log camera working space with a linear toe for shadow detail. The lab's "ACEScct → ACEScg" look decodes ACEScct to scene-linear ACEScg.
CIEDE2000 — ISO/CIE 11664-6:2014
ISO/CIE 11664-6:2014 — CIEDE2000 (ΔE₀₀) colour-difference formula. Adds five corrections over CIE76: lightness, chroma, and hue weighting functions, a chroma–hue interaction term, and a rotation correction for the blue region. Used in this lab's ΔE chart to measure LUT-induced colour shifts across the neutral grey ramp.
ΔE < 1 = imperceptible | 1–3 = barely perceptible | 3–6 = noticeable | >6 = significant
ICC Colour Management — ICC.1:2022
ICC.1:2022 (v4.4) — International Color Consortium profile specification. Defines structure, required tags (PCS = CIEXYZ or CIELAB under D50), rendering intents, LUT-based AtoB/BtoA transforms, and Bradford CAT for D50 PCS. ICC-based LUT transforms underpin most professional colour management pipelines.
Transfer Function Catalogue
Rec.709 BT.1886 γ=2.4 100 cd/m²
Gamma 2.4 Pure power γ=2.4 100 cd/m²
PQ Perceptual quantizer 10 000 cd/m²
HLG Hybrid log-gamma 1 000–4 000 cd/m²
Linear No EOTF (scene-linear) Unbounded
3D LUT Trilinear Interpolation
Given a normalised input (r, g, b) ∈ [0,1]³ and a 3D LUT of size
N, compute fractional positions:
gx = g × (N−1), g0 = floor(gx), g1 = min(N−1, g0+1), fg = gx − g0
bx = b × (N−1), b0 = floor(bx), b1 = min(N−1, b0+1), fb = bx − b0
idx(r,g,b) = r + g×N + b×N²
c000=T[idx(r0,g0,b0)] c100=T[idx(r1,g0,b0)]
c010=T[idx(r0,g1,b0)] c110=T[idx(r1,g1,b0)]
c001=T[idx(r0,g0,b1)] c101=T[idx(r1,g0,b1)]
c011=T[idx(r0,g1,b1)] c111=T[idx(r1,g1,b1)]
c00 = lerp(c000,c100,fr) c10 = lerp(c010,c110,fr)
c01 = lerp(c001,c101,fr) c11 = lerp(c011,c111,fr)
c0 = lerp(c00,c10,fg) c1 = lerp(c01,c11,fg)
result = lerp(c0, c1, fb)
1D LUT Interpolation
For 1D LUT of size S, each channel is normalised to domain [min, max], then linearly interpolated:
pos = t × (S − 1)
i0 = floor(pos), i1 = min(S−1, i0+1), frac = pos − i0
result = lerp(table[i0], table[i1], frac)
Strength Blending
// strength 0 = original untouched
// strength 1 = full LUT applied
ΔE₀₀ (CIEDE2000)
The CIEDE2000 formula adds five corrections over CIE76: lightness weighting (SL), chroma weighting (SC), hue weighting (SH), chroma–hue interaction term (RT), and hue rotation in the blue region.
(ΔL' / S_L)² + (ΔC' / S_C)² + (ΔH' / S_H)²
+ R_T × (ΔC' / S_C) × (ΔH' / S_H)
)
ΔE < 1 = imperceptible | 1–3 = barely perceptible | 3–6 = noticeable | >6 = significant
sRGB ↔ CIE L*a*b* Conversion
C_lin = C/12.92 (C ≤ 0.04045)
C_lin = ((C+0.055)/1.055)^2.4
Linear RGB → XYZ (D65):
[X] [0.4124564 0.3575761 0.1804375] [R]
[Y] = [0.2126729 0.7151522 0.0721750] [G]
[Z] [0.0193339 0.1191920 0.9503041] [B]
XYZ → L*a*b*:
f(t) = t^(1/3) if t > 0.008856
= 7.787t + 16/116 otherwise
L* = 116 f(Y/Yn) − 16
a* = 500 (f(X/Xn) − f(Y/Yn))
b* = 200 (f(Y/Yn) − f(Z/Zn))
Built-in Cinematic Looks
Bleach Bypass Contrast boost + 60% luminance desaturation blend
Film Soft Lifted shadows + warm tint via luminance blend
Mono Contrast Luminance → S-curve contrast → monochrome
Cine Log→709 Gamma 0.45 unlog + 1.1× gain − 0.05 offset
HDR → SDR Reinhard tone-map (2× boost) + gamma 2.2 output
ACEScct→ACEScg Piece-wise ACEScct linearisation (ACES AP1 primaries)
LUT Format & Color Grading
[2] Selan, J. (2012). "Using Lookup Tables to Accelerate Color Transformations." GPU Gems 2, Chapter 24.
[3] Reinhard, E. et al. (2002). "Photographic Tone Reproduction for Digital Images." ACM Transactions on Graphics, 21(3), 267–276.
Video & HDR Standards
[5] ITU-R BT.2020-2 (2015). "Parameter values for ultra-high definition television systems for production and international programme exchange."
[6] SMPTE ST 2084:2014. "High Dynamic Range Electro-Optical Transfer Function of Mastering Reference Displays."
[7] ARIB STD-B67 (2015). "Essential Parameter Values for the Extended Image Dynamic Range Television (EIDRTV) System for Programme Production."
ACES & Color Management
[9] ICC.1:2022 (v4.4). International Color Consortium Profile Specification.
[10] International Electrotechnical Commission (1999). IEC 61966-2-1: sRGB colour space.
CIE Colorimetry & Color Difference
[12] ISO/CIE 11664-6:2014. "Colorimetry — Part 6: CIEDE2000 Colour-Difference Formula."
[13] Sharma, G., Wu, W. & Dalal, E. N. (2005). "The CIEDE2000 color-difference formula." Color Research & Application, 30(1), 21–30.
General Resources
[15] Kang, H. R. (2006). Computational Color Technology. SPIE Press.
[16] Hunt, R. W. G. & Pointer, M. R. (2011). Measuring Colour, 4th ed. Wiley.
About this tool
This lab implements a compact, pure-JS .cube parser supporting 1D and 3D LUTs with trilinear interpolation, built-in cinematic looks, CIEDE2000 ΔE analysis, RGB histograms, tone curves, gamut mapping, hue-shift analysis, and a pseudo-3D cube viewer — entirely client-side (zero network). Not a substitute for calibrated measurement or professional colour management software.
Trilinear vs Tetrahedral Interpolation
This lab uses trilinear interpolation (8 vertices, 3 lerps). Tetrahedral interpolation (used in DaVinci Resolve and Filmlight Baselight) divides each cube cell into 6 tetrahedra for slightly better accuracy at the cost of implementation complexity. The difference is typically <0.5 ΔE for well-sampled 33³ LUTs.
LUT Size Considerations
33³ (35 937 entries) — industry standard; good accuracy/size trade-off
65³ (274 625 entries) — high-end; used for demanding HDR/WCG pipelines
This lab exports 33³ 3D LUTs by default.
Gamut Mapping Strategies
When a LUT maps colours outside the target gamut, clipping artefacts appear (saturated hue shifts, false contours). The gamut-warning overlay in Preview mode highlights pixels where any channel hits 0 or 255 — indicating potential clipping. For production work, use soft-clip / gamut-compression algorithms (ACES Reference Gamut Compression) before applying the LUT.
HDR ↔ SDR Tone Mapping
The built-in “HDR → SDR” look uses Reinhard’s global operator:
v′ = v/(1+v) with a 2× boost pre-factor. For scene-referred content, consider
ACES Output Transforms or custom S-curve operators. PQ (ST 2084) and HLG (ARIB STD-B67) transfer
functions are provided in the input options panel for proper signal decoding.
Working in Linear Light
The “Assume linear input” option removes sRGB display gamma before LUT application, which is correct when the LUT expects scene-linear data (e.g., ACEScg LUTs). Most display-referred .cube files (e.g., film emulation LUTs from LUTCalc or Resolve) expect gamma-encoded input — leave this unchecked for those.
Cross-Talk in 1D LUTs
1D LUTs apply independent per-channel curves — they cannot perform cross-channel operations (e.g., teal&orange split-toning requires a 3D LUT). 1D LUTs are ideal for contrast curves, gamma correction, and simple colour grading (lift/gamma/gain). For hue rotation or saturation-dependent operations, use 3D LUTs.
ΔE Metrics Interpretation
The ΔE₀₀ chart compares the neutral grey ramp (24 patches from black to white) before and after LUT application. A JND (just-noticeable difference) line is drawn at ΔE=1. Values below 1 are imperceptible to a standard observer. High ΔE in shadows may indicate lifted blacks; high ΔE in highlights indicates highlight roll-off or clipping.