Skip to content

The method

An edit is a function. Functions can be measured.

For every input brightness in every channel there is exactly one output brightness. Given both states of the same frame, that mapping is not a mystery to be inferred — it is a table to be read. Everything below follows from that.

  1. 01

    Upload the pair

    The original and the edited version of the same frame, at the same crop. JPEG, PNG, WebP, TIFF or AVIF, up to 25 MB each. It does not matter which application made the edit — Lightroom, VSCO, Snapseed, a phone, a decade ago. The measurement reads the result, not the process.

  2. 02

    Align and bin the pixels

    Both frames are resampled to a common analysis size — 1400 px on the long edge, which is the point past which more pixels buy latency rather than accuracy. Every pixel is then binned by its input value, separately in red, green and blue.

  3. 03

    Fit the per-channel curves

    For each bin, take the median output value rather than the mean. Medians ignore the handful of pixels where a healing brush, a local mask or a crop broke the correspondence. A monotone cubic is fitted through the medians so the curve cannot overshoot and invert local contrast.

  4. 04

    Decompose what is left

    Apply the curves back to the original and inspect the residue. What remains is per-hue rather than tonal, and it is decomposed into the eight colour-mixer bands, the shadow/midtone/highlight grade, the grain field and the vignette falloff.

  5. 05

    Measure the error and write the files

    The derived preset is applied to the original and compared to the target. The mean absolute residual per channel is reported alongside the result. Then the look is written as .xmp, and on Pro as a 33³ .cube and as .json.

Design decisions

Four choices worth explaining.

Each of these is a place where the obvious approach is worse, and the reason is not obvious.

Medians, not means

A mean is dragged by outliers. Every real edit has regions where the pixel correspondence breaks — a healing patch, a local brush, a slightly different crop — and those pixels are outliers by a wide margin. A median in each bin throws them away without needing to detect them first.

Monotone cubic, not spline

A plain cubic spline through hand-placed control points overshoots between them. In a tone curve, overshoot means the curve briefly runs backwards, local contrast inverts, and the image posterises in that range. Fritsch–Carlson clamping makes that impossible by construction.

Curves, not basic sliders, in pair mode

Exposure, contrast, highlights, shadows, whites and blacks are all special cases of a curve, and they interact — so solving for six of them compounds error. The curves already carry the whole tonal transform. Writing the basic panel as well would apply the edit twice, so the basic figures we show are descriptive only.

Relative white balance

Temperature and tint are written as the relative Incremental pair rather than as an absolute Kelvin value. That is the form that applies correctly to already-rendered files, and it means the preset offsets whatever white balance a photo has instead of overriding it — which is what you want the moment the preset meets a second photograph.

The limits

What a global preset can never carry.

A preset is a function from colour to colour. Anything in the original edit that was not — masks, brushes, radial and linear gradients, AI subject and sky selections, healing — cannot be expressed, by us or by any preset format. Adobe’s own Adaptive presets are the proof: they invoke masking at apply time, which is exactly why they cannot be shipped as a third-party .xmp.

This shows up in the residual. A look built globally scores under about 3; a look that leaned on local work scores worse, and the number tells you how much of the original was out of reach rather than leaving you to wonder.

Single-image mode has a harder limit still. With one frame there is no way to distinguish the edit from the scene — warm light and a warm grade are indistinguishable — so what it produces is a statistically grounded starting point, not a measurement.

Why a preset behaves differently on a different photo →

Bring back a look you already made.

Upload the original and the edited version of the same photo. The measurement takes a few seconds, and exact before/after mode is on the free plan.