이 페이지는 아직 번역되지 않았습니다 — 영어 버전을 표시합니다.

Density & log space

Film does not respond to light linearly — it responds logarithmically. That makes optical density, not raw brightness, the natural domain for film inversion: equal density steps are equal photographic stops, and every slider in OpenEnlarge works in this space.

Optical density

Density measures how much a film layer blocks light. Shine light through film; if only a tenth reaches the other side, that layer has a transmission of 0.1. The Beer–Lambert law connects transmission to density:

T = 10−D

A piece of film at D = 1 transmits exactly T = 0.1 (one-tenth of incident light); at D = 2 it transmits T = 0.01. Each integer step multiplies the blocking by a factor of ten — a tenfold ratio that maps cleanly onto the logarithm. OpenEnlarge computes density directly from the scan:

D = log₁₀(base / scan)

where base is the pixel value sampled from the clear film edge and scan is the raw value at each point. Dividing removes the orange mask; taking the logarithm converts the result into density, clamped ≥ 0 so clear film reads D = 0.

What is a "stop"?

A photographic stop is a doubling or halving of light: one stop more means twice as many photons. On the density scale, each stop corresponds to a fixed increment of log₁₀(2) ≈ 0.301. Flipping that around, one density unit spans 1 / 0.301 ≈ 3.32 stops.

This is why density is the right domain for image editing. In raw linear light, shadows and highlights cover wildly different numerical ranges — a one-stop change in bright areas is numerically huge, but tiny in dark areas. In density space, every stop is the same size everywhere. Equal slider steps deliver equal perceptual changes across the entire tonal range.

+1 stop +1 stop D 0.0 D 0.3 D 0.6 D 0.9 D 1.2 density D = log₁₀(light) 1 2 4 8 16 linear light (stops ×2) +1 stop → +0.30 D
Geometric light values (1, 2, 4, 8, 16 — each a doubling, i.e. one stop) fall on a straight line when the x-axis is already stop-spaced. Each stop adds the same ~0.30 of optical density (D = 0.0 → 0.3 → 0.6 → 0.9 → 1.2), confirming that equal density steps are equal photographic stops.

The white point (d_max)

The densest point of a negative corresponds to the brightest part of the scene — or to the completely unexposed leader at the edge. OpenEnlarge calls this density d_max. It is found per channel from the film being developed, and it anchors the normalization step:

t = D / d_max

After this division, t = 0 is the thinnest part of the negative (deepest shadow in the scene) and t = 1 is the densest part (paper white). In the active Faithful path, the tone curve works directly on the raw density D scaled by a fixed factor (see the tone-curve page), rather than on the per-frame t; balance and look layers operate on the tone-curve output. See picking the white point for how to set d_max correctly.

Under the hood

The density formula is D = log₁₀(base / scan), clamped ≥ 0; base is sampled from the clear film edge, scan is the raw pixel value. One density unit ≈ 3.32 photographic stops (because log₁₀(2) ≈ 0.301, and 1 / 0.301 ≈ 3.32). The white-point normalize is t = D / d_max, where d_max is the densest negative value per channel. Exposure in OpenEnlarge is a log-space multiply that pivots on black — in the Faithful path, one unit of the exposure slider corresponds to approximately 1 stop/EV.

Next: the tone curve →

OpenEnlarge — 오픈소스 필름 스캔 편집기 · MIT 라이선스