fig-light-journey · FUNDAMENTALS part opener — the journey of light: source → scene (reflection) → lens → sensor / retina → visual system, each step labelled with its chapter ✅fig-light-models · three models of light: wave (λ) vs ray vs particle/photon propagation, and what each is good for 🟨
fig-newton-prism · Newton's prism experiment: white light dispersed into a spectrum (classic diagram) 🟨fig-em-spectrum · EM spectrum / wavelength map 🟨fig-reflection-refraction-diffraction · reflection (equal angles) · refraction (Snell, two indices) · diffraction 🟨fig-polarization · unpolarized (random orientations) vs polarized light 🟨fig-polarizer-sunglasses · fig-atmospheric-scattering · Rayleigh scattering: blue sky (short path) vs red sunset (long path) 🟨fig-reflectance-illumination-spectra · example reflectance & illumination spectra 🟨fig-illum-times-reflectance · light = illumination × reflectance (per-wavelength) ✅fig-brdf · light bouncing off a surface — the BRDF (incoming/outgoing dirs, normal, reflection lobe, θ angles) 🟨fig-diffuse-specular-spheres · Lambertian (matte) sphere vs shiny (specular) sphere — same shape/light, different BRDF 🟨fig-global-illumination · color bleeding: a red wall casts red onto a white floor (multiple bounces) 🟨fig-illuminant-spectra · blackbody / illuminant spectra (D65, tungsten, fluorescent) 🟨fig-color-temperature · the (inverted) color-temperature scale: warm (low K) → cool (high K) 🟨fig-radiance-irradiance · radiance (per direction) vs irradiance (per area) 🟨fig-cosine-irradiance · why irradiance carries a cosine: a beam of width w vs its surface footprint L = w/cosθ 🟨fig-seasons · sidebar — seasons: N. America in summer vs winter (sun angle → energy per area, cosine law) 🟨fig-inverse-square-vs-radiance · point source 1/r² vs distance-invariant surface radiance 🟨fig-diffraction-aperture-size · two apertures: a smaller one diffracts more (spread θ ≈ λ/D) 🟨fig-airy-disk · Airy disk = diffraction-limited PSF 🟨fig-aperture-sharpness-sweet-spot · aberration vs diffraction → sharpness sweet spot 🟨
fig-eye-cross-section · eye cross-section 🟨fig-retina-layers · retina layers & photoreceptor synapses 🟨fig-cone-rod-distribution · cone/rod distribution & fovea 🟨fig-visual-pathway · pathway retina→LGN→V1 🟨
fig-photoreceptor-cell · anatomy of a rod & cone cell 🟨
fig-rods-cones-micrograph · micrograph of rods & cones (primate retina) 🟨fig-cone-sensitivities · cone spectral sensitivities (L/M/S) 🟨fig-spectrum-to-three-responses · spectrum → 3 responses (projection) 🟨fig-metamers · metamers (two spectra, one color) 🟨
fig-ishihara · Ishihara plate (“74”) 🟨
fig-cone-mosaic · trichromatic cone mosaic (L/M/S, fovea) 🟨fig-cone-response-matrix · cone response as a 3×N matrix–vector product r = C·E (discretized λ); note the continuous / infinite-D limit r_k = ∫ c_k(λ) E(λ) dλ 🟨fig-nonorthogonal-dual-basis · non-orthogonal cone basis (two vectors in the positive quadrant) and its dual: synthesis vs analysis; the dual (analysis) basis has negative coordinates 🟨fig-opsin-tree · the opsin gene tree (schematic): ancestral opsin → RH1 rod + cone classes (SWS1/SWS2/RH2/LWS); the human S/M/L branch highlighted, with the recent primate L/M gene duplication marked ✅fig-opponent-channels · opponent channels (R–G, B–Y, light–dark) 🟨fig-afterimage · afterimage demo 🟨fig-spanish-castle · afterimage / Spanish-Castle illusion ✅fig-photopic-scotopic-range · the photopic / mesopic / scotopic regimes on a horizontal log-luminance axis (cd/m², ~10⁻⁶→10⁸): rod vs cone activity bands, the absolute threshold, the Purkinje shift, and landmarks (starlight, moonlight, indoor, overcast, sunlight, the sun); the eye's full range vs the few-log instantaneous range (→ adaptation, HDR) ✅fig-checker-shadow · Adelson's checker-shadow illusion — the original artwork: the illusion (squares A/B identical luminance) beside the equal-grey-bars proof ✅fig-white-balance-real · white balance computed from scratch (von Kries per-channel gain in linear light): a warm-casted photo corrected by gray-world vs white-patch/max-RGB, with the recovered channel gains (PS1) ✅fig-wb-before-afterfig-the-dress · "the dress" — identical pixels read blue-black or white-gold depending on the illuminant the viewer assumes (color constancy as ambiguous inference) ⬜fig-simultaneous-contrast · simultaneous-contrast patch 🟨fig-mach-bands · Mach bands 🟨fig-contrast-ratios · contrast-as-ratios strip 🟨fig-campbell-robson · **interactive** Campbell–Robson CSF chart: spatial freq ↑→ (log), contrast ↑↓ (log); the inverted-U fade boundary IS your luminance CSF. Viewing-distance slider rescales cycles/degree (step back → high-freq bars vanish first); toggle the predicted-threshold overlay (Human vision § Spatial vision/CSF) ✅fig-acuity-chart · an acuity chart 🟨fig-csf-chromatic · three contrast-sensitivity functions: luminance (band-pass) vs red–green and blue–yellow (low-pass, lower cutoff) — we resolve colour more coarsely than brightness 🟨fig-blur-chroma-luma · blur only the chroma (Lab) and the image still looks sharp; blur the luminance and it falls apart — the basis for chroma subsampling ✅fig-scanpath · a fixation scanpath over an image ⬜fig-hunt-effect · colorfulness vs luminance (Hunt) 🟨fig-bezold-brucke-abney · Bezold–Brücke / Abney demos ✅fig-eye-evolution · the evolution of the eye, in cross-sections: flat photoreceptor patch (no image) → cup (directional) → pinhole (an image, no lens) → lensed eye — recapitulating sensor → camera-obscura → lens (Bonus: animal eyes) 🟨fig-analysis-vs-synthesis · analysis vs synthesis (sense→3 / reproduce←few) 🟨fig-color-matching-setup · **interactive** colour-matching experiment: a split **disk** (monochromatic test \ **interactive** (cpfig); static `sourced/fig-color-matching-setup.png` (headless-Chrome render of the widget)fig-cie-cmfs · CIE color-matching functions 🟨fig-chromaticity-diagram · xy chromaticity + spectral locus + white point 🟨fig-gamma-curves · gamma encode/decode curves 🟨fig-quantization-banding · quantization banding (low-bit demo), worst in shadows ✅
fig-hdr-pipeline · **interactive** full HDR pipeline (10.2): the five classical stages on one screen — Ward median-threshold-bitmap **alignment** (recovers integer hand-held shifts), **Debevec–Malik response recovery** with the full (value, log-exposure) scatter onto the recovered curve $g$, **merge** to a false-colour log-radiance map, and **tone-map** (linear / Reinhard global / bilateral-grid / fast local Laplacian); real Debevec radiance maps synthesize a realistic bracket, or upload your own ✅fig-slr-cross-section · labelled cross-section of an SLR: 45° main reflex mirror sends light UP to the focusing screen + pentaprism → optical viewfinder; the semi-transparent main mirror + secondary (sub) mirror fold light DOWN to the phase-detect AF module in the mirror-box floor; focal-plane shutter + sensor/film behind; inset shows the mirror flipping up for exposure (companion to `fig-mirrorless-anatomy`) ✅fig-rgb-cube · RGB cube 🟨fig-gamut-primaries · sRGB vs wide-gamut primaries on xy 🟨fig-perceptual-uniformity · a rainbow at N colours equally spaced in sRGB vs CIELAB; ΔE bars under each strip show sRGB steps are perceptually ragged, CIELAB steps even (Color technology — CIELAB) 🟩fig-cielab-space · CIELAB space 🟨fig-cielab-ab-plane · the a*b* plane 🟨fig-additive-subtractivefig-color-synthesis-bands · additive vs subtractive synthesis, 3-band cartoon; subtractive is multiplicative (Color technology) 🟨fig-subtractive-spectrafig-gamut-mapping · gamut + gamut mapping ✅fig-repro-monochromatic · reproducing a monochromatic signal (2D LA analogy) 🟨fig-point-op-saturation-vibrance · uniform saturation (constant `s`, over-saturates already-vivid colours → clip) vs vibrance (per-pixel gain `g = 1+v(1−sat)·w_skin(hue)`, protects vivid colours & skin): input, saturation, vibrance + a gain-vs-saturation panel (Point operations → Basic colour enhancement, BASIC) 🟩fig-bw-conversions · one colour photo → black & white several ways: single channel (R/G/B) · average · weighted luminance · red-filter channel mix (dark sky) · an isoluminant pair collapsing to one grey — the choices differ (Converting to B&W, Color technology) ✅fig-color-dimensions · the dimensions of color (hue/chroma/lightness) 🟨fig-color-solid · a perceptual color solid ✅fig-skin-tone-vectorscope · skin-tone locus on a vectorscope ✅fig-diverse-skin-tonesfig-shirley-card
fig-camera-obscura · camera obscura / pinhole (artist's) 🟨
fig-camera-obscura-apparatus · camera obscura apparatus (Diderot engraving) 🟨fig-bare-sensor-averaging · a bare sensor averages all rays 🟨fig-pinhole-fov · pinhole geometry: real (inverted) vs virtual (upright) image plane, and focal length → field of view 🟨fig-perspective-projection · perspective projection equation: x'=f·X/Z, y'=f·Y/Z (divide by depth, scale by f) 🟨fig-perspective-projection-3d · perspective projection in 3D: P=(X,Y,Z) → p=(x,y) on the image plane through the pinhole 🟨fig-perspective-vanishing-points · perspective projection + vanishing points 🟨fig-focal-length-compression
fig-face-distortion-sim · live face-distortion simulator (web edition): focal length + magnification + eccentricity controls with a full-frame view and a face-cropped view, showing the close-wide "big nose" perspective and the wide-angle edge stretch at constant face size; subject = a face, a grid sphere, or one of six diverse Meshy humans framed on the face; static fallback is a screenshot. *Human 3D models generated with Meshy AI.* ✅
fig-dolly-zoom-sim · live dolly-zoom simulator (web edition): hold the subject size while focal length and camera distance trade off so only perspective / background scale changes; log focal (12–200 mm) + distance sliders, realistic Poly Haven environments, subject = head bust or one of six diverse Meshy humans. *Human 3D models generated with Meshy AI.* ✅
fig-portrait-lighting-sim · live portrait-lighting simulator (web edition): three soft area lights (key/fill/kicker — az/el/extent/intensity/colour, area-light-supersampled soft shadows) on a 3D face with a physiological melanin/hemoglobin skin model; a from-behind setup view with Meshy studio umbrellas + a camera rig; lighting presets; static fallback is a screenshot. *3D umbrella generated with Meshy AI.* ✅fig-keystoning-cause · keystoning is the tilt, not the lens — a camera tilted up makes world-parallel verticals converge (façade → trapezoid), while the fronto-parallel shot keeps them parallel; projection preserves lines, not parallelism 🟨fig-point-line-duality · point↔line duality in homogeneous 2D: two points → a line, two lines → a point (same cross product) 🟨fig-projection-decomposition · projection-matrix decomposition K·[R matplotlib, 3-stage pipelinefig-crop-focal-length · cropping = changing focal length: full frame vs a crop box ≡ a longer-focal-length capture, upsampled 🟨fig-depth-vs-ray-length · depth (z coordinate) vs ray length ‖P‖ from camera to a 3D point; unproject (pixel + depth → 3D) 🟨fig-single-lens-refraction · single lens, two interfaces, Snell at each → focus 🟨fig-thick-lens-snell · thick lens: Snell's law at both interfaces, with the incidence/refraction angles and indices of refraction shown 🟨fig-fermat-equal-path · the Fermat / equal-optical-path view of a lens: several rays object→focus, all the same optical path (glass detour offsets the slower speed) 🟨fig-thick-lens-wave-sim · live 2-D FDTD wave sim of a **thick biconvex lens** focusing: a point source's diverging wave is reshaped by the slower glass into a converging one that meets at an image point; focus tracks 1/f=(n−1)2/R and 1/v=1/f−1/u (Fundamentals → Lens image formation, Fermat/equal-path) ✅fig-thin-lens-rays · thin-lens ray diagram (focus, focal point) 🟨fig-thin-lens-conjugates · conjugates: object at ∞ / far / close / at focal length → where the image forms 🟨fig-contrast-af-curve · contrast-detect AF: high-frequency contrast (sharpness) vs focus position, peaked at best focus; hill-climb arrows that must overshoot past the peak then step back (no direction cue) ✅fig-pixel-measurement-integral · a pixel value = integral over aperture (thin lens ellipse) + finite pixel area (+ time, wavelength); the 4 domains → DoF, antialiasing, motion blur, color; linked to the plenoptic function 🟨fig-circle-of-confusion · finite aperture & circle of confusion ✅fig-defocus-vs-parameters · defocus blur (CoC) vs aperture and object distance 🟨fig-depth-of-field · near/far limits where blur reaches c (linearized DoF) 🟨fig-dof-derivation-near · near (front) limit by similar triangles — all quantities 🟨fig-dof-derivation-far · far (back) limit by similar triangles — all quantities 🟨fig-dof-vs-parameters · DoF vs aperture, focal length, focus distance 🟨fig-hyperfocal · hyperfocal: focus at H → sharp from H/2 to ∞ 🟨fig-dof-same-framing · same framing + same f-number → same object-space DoF (short vs long focal length); background blur still looks larger with the long lens 🟨fig-dof-double-cone · object-space DoF as a double cone in front of the lens, waist on the focus plane (the blur for one scene point) 🟨fig-dof-depth-dependent · defocus is NOT a convolution: blur radius depends on scene depth (not pixel location), and occlusion at depth edges 🟨fig-dof-background-blur · DoF focal-length invariance is only first-order: background blur c vs background distance for 35/85/200 mm (matched framing & N) coincide near the subject and fan apart far away; + c vs focal length showing growth/saturation ✅
fig-sensor-microlens · sensor cross-section: microlens → filter → photosite 🟨fig-ccd-vs-cmosfig-slowmo-axis · four ways to treat the time axis on a shared timeline — normal capture (sparse), high-speed (dense true samples), interpolation (sparse reals with synthesized in-betweens), and long-exposure blur (the integral); only interpolation adds resolution after capture and can be wrong 🟨fig-mirrorless-anatomy · labeled cutaway of a mirrorless full-frame camera (lens+mount, sensor/IBIS, mech+electronic shutter, EVF, processor/on-sensor PDAF, card+battery); SLR mirror-box inset for contrast ✅fig-rolling-shutter · fig-flash-sync · flash & focal-plane-shutter sync: whole frame ≤ X-sync · slit/partial frame above it · high-speed-sync pulse train; fill-flash noted ✅fig-lippmann · Lippmann interference colour photography: recording (standing wave in a mercury-backed emulsion, antinodes λ/2 apart) + playback (Bragg reflection of the original wavelength under white light) ✅fig-color-multiplexing · four colour-sensing multiplexing strategies: temporal, spatial (Bayer), **dichroic 3-CCD** beam-split, depth (Foveon, with realistic broad/overlapping layer colours + colour-matrix note) 🟨fig-prokudin-gorskiifig-noise-histogramfig-noise-vs-isofig-noise-affine · measured noise variance is affine in brightness (σ²≈gain·I+read²) — real per-pixel variance vs mean from a 50-frame aligned ISO-3200 burst, with the affine fit, read-noise floor, and highlight roll-off (Noise, SNR, dynamic range) ✅fig-noise-gaussian-pixels · a single pixel's value across many frames is ≈ Gaussian — per-pixel histograms from the ISO-3200 burst with Gaussian overlays (Noise) ✅fig-noise-truncation · noise clips at black/white so it is not zero-mean at the extremes — a near-black pixel pinned at 0 ~44% of frames, its average biased bright, vs an unbiased midtone (Noise; denoising trap) ✅fig-snr-vs-stddev · noise std-dev map vs SNR map of a brightness ramp: std rises with brightness (∝√N), but SNR=√N is worst in the shadows 🟨fig-underexposure-recovery-ff-vs-phone
fig-results-montage · a montage of computational-photography results — HDR tone mapping, refocus-after-capture, motion deblur, a stitched panorama — the "look what computation buys you" opener ✅fig-dynamic-range-comparison · dynamic-range ladder in **stops** (horizontal bars): colour slide (~5–6) · reflective print (~6–7) · film negative (~12–13) · phone sensor (~10–12) · full-frame sensor (~14) · human eye instantaneous (~10–14) vs adapted (~20+) · an animal example · a typical sun-and-shadow scene (>20) — shows why no single capture holds a high-contrast scene (→ HDR) ✅fig-icc-workflow · ICC workflow diagram 🟨fig-device-gamut-mismatch · gamut mismatch across devices ✅