mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-28 03:57:57 -06:00
Nikon DSLRs write no Exif LensModel, only the lens specification (maker note
0x0084, read into Metadata::lens_spec), so the lensfun-format lens database never
corrected their raws. A raw without a lens model is now looked up by a name built
from its specification ("24-70mm f/2.8", lightcraft_lensdb::spec_name), and a
profile is used only when one of its names is exactly that
(Profile::names_exactly): the specification fits every maker's lens with that
range, so a partial match or a maker-named entry is never taken. lensfun's own
database has no such names; a user aliases the one lens they own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55 lines
3.6 KiB
Markdown
55 lines
3.6 KiB
Markdown
# Lens profiles from a lens database
|
|
|
|
Raws that carry no lens correction of their own (DNG `OpcodeList3`, or a camera correction a raw reader converts,
|
|
see [sony-lens-corrections.md](sony-lens-corrections.md) and [nikon-lens-corrections.md](nikon-lens-corrections.md)) can be corrected from a **lens database in the lensfun
|
|
XML format** that you supply. The app does not ship any lens database: lensfun's data is licensed CC-BY-SA 3.0 and
|
|
stays a separate download. Adobe LCP profiles are never used.
|
|
|
|
## Setup
|
|
|
|
1. Get the lensfun database (the `data/db/*.xml` files of <https://github.com/lensfun/lensfun>, or the copy a Linux
|
|
distribution installs under `/usr/share/lensfun/version_1/`).
|
|
2. Point `LIGHTCRAFT_LENSFUN_DIR` at that directory and start the app (or the CLI).
|
|
|
|
Files are read once per process. Invalid files are skipped with a warning in the log. Without the variable nothing
|
|
changes.
|
|
|
|
## What is applied
|
|
|
|
The lens is identified from EXIF: camera make / model (for the mount and crop factor; the 35 mm equivalent focal
|
|
length is used when the camera isn't listed) and the lens model string. Lens names match on their words; every
|
|
number (focal lengths, apertures) in the database name must appear in the EXIF name, and the lens maker must agree
|
|
when the file names one.
|
|
|
|
Some cameras record no lens model at all, only the lens specification: Nikon DSLRs write the lens's focal range and
|
|
maximum apertures in their maker note (tag `0x0084`) and no Exif `LensModel`, whatever lens is mounted. For such a
|
|
file the lens is looked up by a name built from the specification, `24-70mm f/2.8` (`18-55mm f/3.5-5.6`,
|
|
`85mm f/1.8`), and a profile is used only when one of its names is exactly that (ignoring case and punctuation).
|
|
The specification fits every maker's lens with that range (a Nikkor, a Sigma, a Tamron), so neither a partial match
|
|
nor a name with a maker in it ("Samyang 85mm f/1.4" for "85mm f/1.4") is taken; a database that should correct such
|
|
files names its profile that way, e.g. a lensfun entry with an extra `<model>24-70mm f/2.8</model>` for the one
|
|
24-70 f/2.8 the photographer owns. lensfun's own database has no such names, so it doesn't correct these files.
|
|
|
|
| Correction | Models | Interpolated over |
|
|
|---|---|---|
|
|
| Distortion | `poly3`, `poly5`, `ptlens` | focal length |
|
|
| Lateral CA (TCA) | `linear`, `poly3` | focal length |
|
|
| Vignetting | `pa` | focal length, aperture (in stops), focus distance (nearest calibrated, by 1/d; infinity when unknown) |
|
|
|
|
Fisheye and other non-rectilinear lenses get no distortion correction. The profile is converted by least squares
|
|
into the DNG `WarpRectilinear` / `FixVignetteRadial` polynomials, so it goes through the same path as embedded
|
|
corrections: **Enable Profile Corrections** and its Distortion / Vignetting amounts, the CPU and GPU geometry
|
|
stage (one resample), orientation handling and DNG export. A conversion whose radial error exceeds 0.001 of the
|
|
half diagonal, or that would fold the image, is not applied.
|
|
|
|
Normalisation follows lensfun's documentation: distortion and TCA radii are 1 at half the shorter side of the
|
|
calibration frame (its `cropfactor` and `aspect-ratio`), vignetting radii 1 at its corner; the optical centre is
|
|
the image centre (lensfun's `<center>` offsets are not read).
|
|
|
|
## Limits
|
|
|
|
- Only raws: rendered images (JPEG, HEIF, TIFF) are often already corrected in camera.
|
|
- The focus distance is not read from maker notes yet: vignetting uses the farthest calibrated distance.
|
|
- No manual make / model picker yet; matching is automatic.
|
|
- Not yet validated against real photos and another renderer; the tests use synthetic profiles and grids.
|