Image Source
Select a source. Upload accepts any image. Camera streams live video.
Simulation Mode
9 simulation modes with GPU-accelerated shaders and CPU fallbacks.
Global Simulation Severity
Global severity mix: 0 = original image, 1 = full simulation. Applies to all modes.
Image Adjustments
Chromatic Adaptation
Display Options
Keyboard shortcuts
N cycle sim mode  |  S toggle split  |  R reset  |  D download PNG  |  F fullscreen
Simulation Output
Pipeline Status
WebGL2
Camera
Research
Normal
Snellen Acuity Chart
Toggle with checkbox. Shows tumbling-E optotypes at 20/20 through 20/200 rows.
Actions & Export
Quick Presets
Select a preset to instantly configure all simulation parameters.
Export
PNG saves the current canvas. JSON/CSV export current settings and metrics.
Import
Clipboard
Share
Encodes current simulation parameters into the URL for sharing.
Reset
Vision Science Standards & Guidelines
CIE 170-1:2006 — Fundamental Chromaticity Diagram

CIE 170-1:2006 defines the physiologically-relevant 2° and 10° cone-fundamental-based spectral sensitivity functions (LMS), replacing the 1931/1964 colour-matching functions for colour appearance modelling.

These cone fundamentals form the basis of all LMS-domain vision simulations, including CVD modelling, scotopic/mesopic transforms, and chromatic adaptation.

ISO 8596:2017 — Visual Acuity Testing (Snellen)

ISO 8596 specifies the optotype (Landolt C) for visual acuity measurement. Snellen E-chart is a common alternative. Visual acuity is expressed as 20/x (imperial) or 6/x (metric), where x is the distance at which a 20/20 letter subtends 5 arcminutes.

The tumbling-E optotype used here follows the letter size progression: 20/200, 20/100, 20/60, 20/40, 20/30, 20/20. Each row halves the angular subtense.

CIE 191:2010 — Mesopic Photometry

CIE 191:2010 recommends the mesopic photometric system MES2, which blends scotopic V'(λ) and photopic V(λ) sensitivity using an adaptation coefficient m that transitions continuously from 0 (scotopic) to 1 (photopic).

This standard is essential for modelling night driving, street lighting design, and low-light accessibility.

WCAG 2.2 — Contrast Accessibility

WCAG 2.2 Success Criterion 1.4.3 (AA): Minimum contrast ratio 4.5:1 for normal text, 3:1 for large text.

SC 1.4.6 (AAA): Enhanced contrast ratio 7:1 for normal text, 4.5:1 for large text.

The live metrics panel computes the WCAG contrast ratio from the min and max relative luminance in the simulated output, providing instant accessibility feedback.

Brettel, Viénot & Mollon 1997 — CVD Simulation

Brettel et al. (1997) proposed a rigorous model for simulating dichromatic colour vision by projecting colours onto the reduced-dimension gamut in LMS space. For protanopia and deuteranopia, the L or M cone response is derived from the remaining two channels; for tritanopia, S is derived.

Viénot et al. (1999) simplified this to a single 3×3 matrix per deficiency type that operates in the sRGB→LMS→sRGB pipeline, which is used in this tool's WebGL2 shaders.

CIE 15:2004 — Colorimetry & Standard Illuminants

CIE 15:2004 defines the fundamental colorimetric system: CIE 1931 standard observer, illuminant spectral power distributions (A, D50, D55, D65, D75, E, fluorescent series), the XYZ colour space, CIELAB, and chromatic adaptation procedures.

The Bradford chromatic adaptation transform used in this tool adapts between the illuminants defined in CIE 15.

Mannos & Sakrison 1974 — Contrast Sensitivity Function

Mannos & Sakrison (1974) modelled the human visual system's contrast sensitivity as a function of spatial frequency f (cycles per degree):

CSF(f) = 2.6 × (0.0192 + 0.114f) × exp(−(0.114f)^1.1)

This bandpass function peaks at approximately 3–5 cpd and attenuates both low and high spatial frequencies, explaining why humans are most sensitive to mid-frequency patterns.

ISO 11664-6:2014 — CIEDE2000 Colour Difference

CIEDE2000 (ΔE₀₀) is the CIE-recommended colour-difference formula. It includes parametric corrections for lightness, chroma, and hue weighting, plus a rotation term for the blue region. Used here for batch colour analysis outputs.

Mathematical Models & Formulas
LMS & CVD

HPE (Hunt-Pointer-Estevez) sRGB → LMS transform:

Linear sRGB to LMS:
|L| | 0.4002 0.7076 -0.0808 | |R_lin|
|M| = |-0.2263 1.1653 0.0457 | |G_lin|
|S| | 0.0000 0.0000 0.9182 | |B_lin|

LMS to Linear sRGB (inverse):
|R_lin| | 1.8601 -1.1295 0.2199 | |L|
|G_lin| = | 0.3612 0.6388 -0.0001 | |M|
|B_lin| | 0.0000 0.0000 1.0891 | |S|

CVD Simulation Matrices (Viénot/Brettel, in LMS space):

Protanopia:
| 0.000 1.051 -0.051 |
| 0.000 1.000 0.000 |
| 0.000 0.000 1.000 |

Deuteranopia:
| 1.000 0.000 0.000 |
| 0.951 0.000 0.049 |
| 0.000 0.000 1.000 |

Tritanopia:
| 1.000 0.000 0.000 |
| 0.000 1.000 0.000 |
|-0.867 1.867 0.000 |

Applied as: LMS_sim = M_cvd × LMS_original
Then blended: LMS_out = lerp(LMS_original, LMS_sim, severity)
Scotopic / Mesopic

Scotopic (rod-only) vision simulation:

Rod signal (V'(λ) approximation):
rod = 0.10×R_lin + 0.59×G_lin + 0.31×B_lin
rod = rod^1.4 × 0.8 (compression + Purkinje shift)

Scotopic output (monochromatic blue-green):
R_out = rod × 0.3
G_out = rod × 0.7
B_out = rod × 1.0

Final = lerp(original, scotopic, severity)

Mesopic (rod+cone blend):

Mesopic = lerp(scotopic, photopic, adaptLevel)
adaptLevel parameter: 0 = full scotopic, 1 = full photopic
CIE MES2 model maps luminance to m coefficient
Sub-threshold: <0.005 cd/m² (scotopic)
Transition: 0.005–5 cd/m² (mesopic)
Supra-threshold: >5 cd/m² (photopic)
Age & Cataracts

Crystalline lens yellowing (age-related):

Yellowing factor: f = clamp((age - 20) / 60, 0, 1)

Spectral transmission filter (approximate):
T_R = 1 + f × 0.05 (slight red boost)
T_G = 1 - f × 0.02 (minor green loss)
T_B = 1 - f × 0.40 (significant blue loss)

Output = lerp(original, original × T, severity)

At age 80: blue transmission drops ~40%, causing
colours to appear "warmer" and blue-discrimination
is impaired (tritanomaly-like effect).

Cataract simulation:

Three effects combined:
1. Light scatter: 5×5 weighted blur kernel
2. Contrast loss: mix(lum_mean, pixel, 1 - lvl×0.15)
3. Yellowing: R *= (1 + y×0.03), B *= (1 - y×0.25)
where y = cataract_level × 0.2

Severity parameter scales all three effects linearly.
CSF Model

Mannos-Sakrison Contrast Sensitivity Function:

CSF(f) = 2.6 × (0.0192 + 0.114f) × exp(-(0.114f)^1.1)

where f = spatial frequency in cycles per degree (cpd)

Properties:
- Peak sensitivity at ~3-5 cpd
- Low-frequency attenuation (lateral inhibition)
- High-frequency roll-off (optical limits + neural sampling)

In WebGL2 shader:
f = distance(uv, center) × 2 × peak_cpd × 60
The CSF value modulates pixel luminance as a radial overlay
Output = pixel × lerp(1.0, csf, severity)
Bradford CAT

Bradford Chromatic Adaptation Transform:

M_Bradford (XYZ to sharpened LMS):
| 0.8951 0.2664 -0.1614 |
|-0.7502 1.7135 0.0367 |
| 0.0389 -0.0685 1.0296 |

Diagonal scaling (partial adaptation):
D_i = 1 + strength × (dst_LMS_i / src_LMS_i - 1)

Full adaptation: XYZ' = M_inv × D × M × XYZ

Illuminants used:
D65: x=0.3127 y=0.3290 (6504 K)
D50: x=0.3457 y=0.3585 (5003 K)
A: x=0.4476 y=0.4074 (2856 K)
Daltonisation

Daltonisation (colour correction for CVD):

Step 1: Simulate CVD output
sim = CVD_matrix × LMS(original)

Step 2: Compute lost information
delta = original - sim (per channel in linear sRGB)

Step 3: Redistribute to remaining channels
R' = clamp(R + dR×0.7 + dG×0.7)
G' = clamp(G + dG×0.7 + dB×0.7)
B' = clamp(B + dB×0.7 + dR×0.3)

This shifts information from the confused channels
into channels the observer can still perceive.
WebGL2 Pipeline

WebGL2 rendering pipeline architecture:

Vertex shader: Full-screen quad (2 triangles, triangle strip)
a_pos = {-1,-1}, {1,-1}, {-1,1}, {1,1}
v_uv = a_pos * 0.5 + 0.5 (maps to [0,1])

Fragment shader pipeline per pixel:
1. Sample source texture at v_uv
2. sRGB EOTF (gamma decode) to linear
3. Apply contrast: mix(0.5, pixel, 1+contrast)
4. Apply gamma: pixel = pow(pixel, gamma)
5. Add retinal noise: pixel += rand(uv) × noise
6. Re-encode to sRGB (OETF)
7. Pass to simulation function sim(pixel, uv)
8. Split-view check: if uv.x < split, output original

Shader recompilation on mode change.
Uniforms updated per frame (no recompilation).
GPU texture upload via texImage2D (RGBA, UNSIGNED_BYTE).
Limitations
• CVD matrices are educational approximations
(Brettel/Viénot model, not individual-calibrated)
• Scotopic/mesopic models use simplified V'(λ) weights
rather than full spectral integration
• Age yellowing is a linear approximation of
exponential lens transmittance decay
• Cataract scatter uses a 5×5 uniform kernel (not
physically-accurate Mie scattering)
• CSF overlay is radial (not gaze-contingent)
• Macular degeneration scotoma is circular (real
scotomas are irregular perimetrically)
• sRGB gamut only (no wide-gamut Display P3 / Rec.2020)
• Single-frame simulation (no temporal adaptation)
• Not a clinical diagnostic tool
References & Citations

Colour Vision Deficiency

[1] Brettel, H., Viénot, F., & Mollon, J. D. (1997). Computerized simulation of color appearance for dichromats. Journal of the Optical Society of America A, 14(10), 2647–2655.

[2] Viénot, F., Brettel, H., & Mollon, J. D. (1999). Digital video colourimaps for checking the legibility of displays by dichromats. Color Research & Application, 24(4), 243–252.

[3] Machado, G. M., Oliveira, M. M., & Fernandes, L. A. F. (2009). A physiologically-based model for simulation of color vision deficiency. IEEE Transactions on Visualization and Computer Graphics, 15(6), 1291–1298.

CIE Standards & Colorimetry

[4] CIE. (2006). CIE 170-1:2006 Fundamental Chromaticity Diagram with Physiological Axes – Part 1. Vienna: CIE.

[5] CIE. (2010). CIE 191:2010 Recommended System for Mesopic Photometry Based on Visual Performance. Vienna: CIE.

[14] CIE. (2004). CIE 15:2004 Colorimetry (3rd ed.). Vienna: CIE. (Fundamental colorimetric definitions, standard illuminants.)

Contrast Sensitivity & Visual Acuity

[6] Mannos, J. L., & Sakrison, D. J. (1974). The effects of a visual fidelity criterion on the encoding of images. IEEE Transactions on Information Theory, 20(4), 525–536.

[12] W3C. (2023). Web Content Accessibility Guidelines (WCAG) 2.2. (Contrast ratio specifications for AA and AAA compliance.)

[13] ISO. (2017). ISO 8596:2017 Ophthalmic optics — Visual acuity testing — Standard and clinical optotypes and their presentation.

Chromatic Adaptation & Colour Appearance

[7] Lam, K. M. (1985). Metamerism and Colour Constancy. PhD thesis, University of Bradford. (Origin of the Bradford transform matrix.)

[8] Fairchild, M. D. (2013). Color Appearance Models (3rd ed.). Wiley. (Chapters on chromatic adaptation, CIECAM02, age-related changes.)

[9] Hunt, R. W. G., & Pointer, M. R. (2011). Measuring Colour (4th ed.). Wiley. (HPE cone fundamentals, opponent-channel theory.)

Aging, Cataracts & Ocular Optics

[10] Pokorny, J., Smith, V. C., & Lutze, M. (1987). Aging of the human lens. Applied Optics, 26(8), 1437–1440. (Lens yellowing model.)

[11] van den Berg, T. J. T. P. (1995). Analysis of intraocular straylight, especially in relation to age. Optometry and Vision Science, 72(2), 52–59. (Cataract scatter model.)

About this tool

This tool is an educational approximation by Auric Artisan. It uses simplified models for interactive exploration and is not intended as a clinical diagnostic instrument. All computation runs on-device with zero network dependency.

Research — Batch Colour Analysis
Batch Input
Enter hex colours. Analysis computes: linear sRGB, LMS, opponent channels (RG/BY/Lum), relative luminance Y, and CVD simulation using current mode/severity.
Batch Results
Results will appear here after analysis.
Research backend provides: 9 vision simulation modes (WebGL2 GPU), Brettel/Viénot CVD matrices (protan/deutan/tritan), scotopic V'(λ) rod-only model, mesopic MES2 rod-cone blend, age-related lens yellowing, cataract scatter + yellowing + contrast loss, Mannos-Sakrison CSF, macular degeneration central scotoma, Bradford chromatic adaptation (D65/D50/A), daltonisation, Snellen acuity chart, split-view comparison, live WCAG contrast metrics, batch LMS/opponent/luminance analysis, JSON/CSV/PNG export. All computation is on-device with zero network dependency.