# ⚛  L1 Principle — Photometric Stereo (shape-from-shading with multiple light directions)

**ID:** `L1-098` · **Status:** ⊙ Testnet (genesis catalog)

> **🌐 Domain:** Depth Imaging — *Surface-normal recovery from shading*
> **🎯 Problem class:** linear inverse · **🧮 Solution space:** 2D normal and depth
> **📡 Carrier:** photon · **🌫 Noise:** gaussian
> **⚖ Difficulty (δ):** 3 · **⛓ Block:** 41547812

---

## 🧠 1. Introduction

**Photometric Stereo (shape-from-shading with multiple light directions)** is a **linear inverse problem** whose unknown lives in **2D normal and depth** space, within the **Surface-normal recovery from shading** sub-domain of **Depth Imaging**.

Measurements consist of photons collected by an optical detector via a **multi light shading** sensing mechanism.

The forward operator applies, in order: S · scan · light direction operator; L · reflect lambertian operator; L · normal ls operator; pixel-level spatial averaging on the detector.

Observations are corrupted by additive Gaussian noise. With K >= 3 non-coplanar light directions and Lambertian BRDF, the linear system has rank 3 and is well-conditioned. Degrades for specular highlights (outlier fraction), cast and attached shadows (reduced effective K), non-Lambertian materials; robust methods (RANSAC, rank-3 SVD, learned PS) handle outliers up to ~30% specular fraction.

## ⚙ 2. Forward Model

Physical chain: **x** → S · scan · light direction → L · reflect lambertian → L · normal ls → Spatial integration → **y** (detector).

```
y = ∫_A dA `L.normal_ls` `L.reflect_lambertian` `S.scan.light_direction` x + n,    n ~ 𝒩(0, σ²)
```

**Measurement DAG:**

| Primitive | What it does |
|---|---|
| `S.scan.light_direction` | S · scan · light direction operator |
| `L.reflect_lambertian` | L · reflect lambertian operator |
| `L.normal_ls` | L · normal ls operator |
| `int.spatial` | Pixel-level spatial averaging on the detector |

## 🔬 3. Physics Fingerprint

| Property | Value |
|---|---|
| Domain | Depth Imaging |
| Sub domain | Surface-normal recovery from shading |
| Carrier | photon |
| Problem class | linear_inverse |
| Solution space | 2D_normal_and_depth |
| Noise model | gaussian |
| Integration axis | angular |
| Difficulty delta | 3 |
| L dag | 3.2 |

## 📡 4. Measurement Model

With K >= 3 non-coplanar light directions and Lambertian BRDF, the linear system has rank 3 and is well-conditioned. Degrades for specular highlights (outlier fraction), cast and attached shadows (reduced effective K), non-Lambertian materials; robust methods (RANSAC, rank-3 SVD, learned PS) handle outliers up to ~30% specular fraction.

| Metric | Value |
|---|---|
| Metric | normal_MAE_deg |
| Secondary | depth_RMSE_mm |

## 📏 5. Operating Range (Ω)

**Center problem class:** `photometric_stereo_normal` · **Forward operator:** `lambertian_multi_light`

**Center point:**

| Parameter | Unit | Value |
|---|---|---|
| H | px | 512 |
| W | px | 512 |
| K lights | — | 10 |
| Photon count | — | 500 |
| Ambient residual | — | 0 |
| Specular fraction | — | 0 |
| Cast shadow fraction | — | 0 |
| Light direction error | — | 0 |

**Allowed bounds:**

| Parameter | Unit | Range |
|---|---|---|
| H | px | 128 – 2048 |
| W | px | 128 – 2048 |
| K lights | — | 3 – 96 |
| Photon count | — | 50 – 10000 |
| Ambient residual | — | 0.0 – 0.3 |
| Inter reflections | — | 0.0 – 0.3 |
| Specular fraction | — | 0.0 – 0.5 |
| Cast shadow fraction | — | 0.0 – 0.4 |
| Light direction error | — | 0.0 – 0.05 |

## 🎯 6. Tolerance (ε)

**Center tolerance:** 8.0 deg normal MAE

| Metric | Range |
|---|---|
| Normal mae deg | 2.0 – 35.0 |

## ⚖ 7. Hardness Function

Hardness scales as **`epsilon_fn`** on **normal_MAE_deg**, with κ = `400` and δ = `3`.

## 💾 8. Reference Dataset

- **primary** · weight 1.0 · IPFS _(not pinned yet)_

## 9. On-chain Registration

- **Chain hash:** `0x9dd147d10f81e507e5d5aaabda58501a20e80830aee9eb85908e5564f18491f6`
- **Chain tx hash:** `0x75b422eecd7831cc562bfdad63c58077a1029471d3e78f3712c030979d9dbb7b`
- **Chain block:** `41547812`

---

## File Mapping

This bundle consists of: `L1-098.md`, `L1-098.json`.

| File | Role | How to regenerate |
|------|------|-------------------|
| `L1-098.md` | Source of truth — edit this | Human or LLM |
| `L1-098.json` | Structured metadata for the registry | LLM regenerates from the sections above |

**Prompt for your LLM after editing this Markdown:**

> Read the attached Markdown. Regenerate the sibling `.json` so every field matches.
> Preserve the schema documented in the rows above.
> Output each file in its own fenced code block tagged with the filename.
> Output only the JSON object.

_This Markdown was auto-synthesized from the catalog row for `L1-098`._
_Edit it, regenerate the JSON, and submit at [/submit](/submit) to claim the artifact._