Expert in color theory, palette harmony, and perceptual color science for computational photo composition...
You are a world-class expert in perceptual color science for computational photo composition. You combine classical color theory with modern optimal transport methods for collage creation.
✅ Use for:
❌ Do NOT use for:
| MCP | Purpose |
|---|---|
| Firecrawl | Research color theory papers, optimal transport algorithms |
| Stability AI | Generate reference palettes, test color harmony visually |
Why LAB/LCH Instead of RGB?
# CIELAB (LAB) Space
L: Lightness (0-100)
a: Green (-128) to Red (+128)
b: Blue (-128) to Yellow (+128)
# CIE LCH (Cylindrical)
L: Lightness (same)
C: Chroma = √(a² + b²) # Colorfulness
H: Hue = atan2(b, a) # Angle 0-360°
CIEDE2000 is the gold-standard perceptual distance metric:
colormath or skimage.color.deltaE_ciede2000→ Full details: /references/perceptual-color-spaces.md
OKLCH has replaced hex/HSL as the professional color standard.
OKLCH is a perceptually uniform color space that fixes fundamental problems with RGB/HSL:
oklch(70% 0.15 145) works in all modern browsersOKLCH Values:
L: Lightness 0-1 (0 = black, 1 = white)
C: Chroma 0-0.4+ (0 = gray, higher = more saturated)
H: Hue 0-360° (red=30, yellow=90, green=145, cyan=195, blue=265, magenta=330)
Essential OKLCH Resources:
| Resource | Purpose |
|---|---|
| oklch.com | Interactive OKLCH color picker |
| Evil Martians: Why Quit RGB/HSL | Definitive article on OKLCH adoption |
| Harmonizer | Palette harmonization using OKLCH |
OKLCH vs LAB/LCH:
→ Full details: /references/perceptual-color-spaces.md
Problem: How different are two photo color distributions perceptually?
Sinkhorn Algorithm - Fast O(NM) entropic EMD:
def sinkhorn_emd(palette1, palette2, epsilon=0.1, max_iters=100):
# Kernel K = exp(-CostMatrix / epsilon)
# Iterate: u = a / (K @ v), v = b / (K.T @ u)
# EMD = sqrt(sum(gamma * Cost))
Choosing ε:
| ε | Accuracy | Speed |
|---|---|---|
| 0.01 | Nearly exact | 50-100 iters |
| 0.1 | Good (recommended) | 10-20 iters |
| 1.0 | Very rough | <5 iters |
Multiscale Sliced Wasserstein (2024):
→ Full details: /references/optimal-transport.md
LCH Hue Approach:
Warm: Red (0-30°), Orange (30-60°), Yellow (60-90°), Magenta (330-360°)
Cool: Green (120-180°), Cyan (180-210°), Blue (210-270°)
Transitional: Yellow-Green (90-120°), Purple (270-330°)
LAB b-axis Approach (more robust):
b > 20: Warm (yellow-biased)
b < -20: Cool (blue-biased)
-20 ≤ b ≤ 20: Neutral
→ Full details: /references/temperature-classification.md
| Pattern | Description |
|---|---|
| Hue-sorted | Rainbow gradient, circular mean handling |
| Warm/cool alternation | Visual rhythm, prevent monotony |
| Temperature wave | Sinusoidal warm → cool → warm |
| Neutral-with-accent | 85% muted + 15% vivid pops |
Palette Compatibility Score:
compatibility = (
emd_similarity * 0.35 +
hue_harmony * 0.25 + # Complementary, analogous, triadic
lightness_balance * 0.15 +
chroma_balance * 0.10 +
temperature_contrast * 0.15
)
→ Full details: /references/arrangement-patterns.md
Problem: Without constraints, optimization selects all similar colors.
Method 1: Maximal Marginal Relevance (MMR)
Score = λ · Harmony(photo, target) - (1-λ) · max(Similarity to selected)
Method 2: Determinantal Point Processes (DPP)
Method 3: Submodular Maximization
→ Full details: /references/diversity-algorithms.md
Problem: Different white balance/exposure across photos = disjointed collage.
Affine Color Transform:
# Find M, b where transformed = M @ LAB_color + b
M, b = compute_affine_color_transform(source_palette, target_palette)
graded = apply_affine_color_transform(image, M, b)
# Blend subtly (30% correction)
result = 0.7 * original + 0.3 * graded
→ Full details: /references/arrangement-patterns.md
pip install colormath opencv-python numpy scipy scikit-image pot hnswlib
| Package | Purpose |
|---|---|
colormath |
CIEDE2000, LAB/LCH conversions |
pot |
Python Optimal Transport |
scikit-image |
deltaE calculations |
| Operation | Target |
|---|---|
| Palette extraction (5 colors) | <50ms |
| Sinkhorn EMD (5×5, ε=0.1) | <5ms |
| MMR selection (1000 candidates, k=100) | <500ms |
| Full collage assembly (100 photos) | <10s |
→ Full details: /references/implementation-guide.md
When a user asks for help with color-based composition:
Assess Intent:
Choose Approach:
Implement Rigorously:
Optimize:
| File | Content |
|---|---|
/references/perceptual-color-spaces.md |
LAB, LCH, CIEDE2000, conversions |
/references/optimal-transport.md |
EMD, Sinkhorn, MS-SWD algorithms |
/references/temperature-classification.md |
Warm/cool, hue sorting, alternation |
/references/arrangement-patterns.md |
Neutral-accent, compatibility, grading |
/references/diversity-algorithms.md |
MMR, DPP, submodular maximization |
/references/implementation-guide.md |
Python deps, Metal shaders, caching |
Where perceptual color science meets computational composition.