Crosstalk matrix gallery
August 5, 2026 · View on GitHub
Community-contributed channel-unmix matrices for NegPy's Crosstalk controls (Calibration panel: Matrix + Strength).
Every .toml here is bundled with the app and copied into a user's
<Documents>/NegPy/crosstalk/ folder on first run, so they show up in the sidebar
dropdown out of the box.
A matrix describes a scanning setup, not only a film. The dyes' unwanted absorptions are one cause of channel mixing; the light source's spectrum and the sensor's colour filters are others, and in the density domain all three look the same. So a datasheet-derived matrix is a starting point, and one tuned on real scans is usually better — name yours after the whole combination (film + light + camera) rather than just the stock.
The matrices currently in this folder are all (approx): read off published spectral-dye-density
spec sheets rather than measured, and describing the dyes alone. That makes them a reasonable
starting point for a true RGB scan (Coolscan-style, one band at a time) or a calibrated
trichrome rig, and an incomplete story for a broadband light plus a Bayer sensor, where the
capture adds mixing of its own. Measured profiles are especially welcome — say so in the
PR if yours came from real scans rather than a datasheet, and drop the (approx) from its name.
Contributing
-
Add one
<film_or_scanner>.tomlfile to this folder. -
Use the format below (full reference in
../docs/CROSSTALK.md):name = "Kodak Portra 400 (Noritsu)" # optional display name; falls back to filename type = "measured" # measured | tuned | specsheet-based matrix = [ # 3x3, row-major (out R/G/B × in R/G/B) [ 1.00, -0.05, -0.02], [-0.04, 1.00, -0.08], [-0.01, -0.10, 1.00], ] -
Name the file after the setup it was calibrated for — film stock plus light source and camera/scanner where you know them (
portra_400_scanlight_a7c2.toml). -
Note in your PR how the matrix was derived (datasheet, test chart, or tuned by eye on real scans — all three are welcome, just say which) and what rig it came from.
Keep the diagonal near 1.0 and off-diagonal terms small — NegPy row-normalizes
the matrix, so it only redistributes color differences between channels.