2 hours ago
I'm not really trying to argue with anyone over these, don't use them if you don't like them.
I was using the 1r and 8r multispectral images to help double check my page alignments and text boxes for the other alignment work I was doing and thought i would try to process these while i was working with the multispectral data. Compared to the published versions these seemed much clearer.
The key was recognizing that different parts of the text are visible under different wavelengths, specifically the pox leber and the end of the 17r, so these are composites that use different processing for those areas.
You are not allowed to view links. Register or Login to view. uses just the 365 nm UV and 870 nm IR captures.
f116v’s grayscale detail comes from 21 captures. Its color comes specifically from three UV-illuminated captures through red, green, and blue filters.
Here are processing walkthrough images.
The exact notes re in the code block
I was using the 1r and 8r multispectral images to help double check my page alignments and text boxes for the other alignment work I was doing and thought i would try to process these while i was working with the multispectral data. Compared to the published versions these seemed much clearer.
The key was recognizing that different parts of the text are visible under different wavelengths, specifically the pox leber and the end of the 17r, so these are composites that use different processing for those areas.
You are not allowed to view links. Register or Login to view. uses just the 365 nm UV and 870 nm IR captures.
f116v’s grayscale detail comes from 21 captures. Its color comes specifically from three UV-illuminated captures through red, green, and blue filters.
Here are processing walkthrough images.
The exact notes re in the code block
Code:
FINAL SHARED MARGINALIA IMAGES - PROCESSING RECORD
Prepared 2026-11-04. The notes describe the exported files, not the retired trial images.
Source images: The Lazarus Project and The Chester F. Carlson Center for Imaging Science at RIT.
Beinecke Rare Book & Manuscript Library, MS 408. Processing shown here is a separate exploratory reprocessing.
Original release: https://manuscriptroadtrip.wordpress.com/2024/09/08/multispectral-imaging-and-the-voynich-manuscript/
Illumination bands and optical camera filters are different things. MB450RB etc. encode the nominal illumination wavelength. Filter-wheel suffixes R25/G58/B47/O22 mean red/green/blue/orange; UVP means UV pass and UVB means UV block. The captured file codes are retained below; exact transmission curves were not measured here.
Filter terminology reference (Lazarus Project authors): https://heller.uccs.edu/sites/default/files/inline-files/Making_Light_Work_Manuscripts_and_Multis.pdf
COMMON PREPARATION
Use the released 16-bit _F.tif pixels as supplied. No new Spectralon or flat-field calibration was applied.
Rotate f17r clockwise 90 degrees and f116v counterclockwise 90 degrees. Crop coordinates are upright pixels: f17r (1000,980)-(4300,1380); f116v (2400,590)-(6050,1510).
Register by saved subpixel translations to band 1. Bilinear resampling once, reflected image borders; no dewarping, rotation fitting, letter templates or inpainting.
For each registered band: J = ln(max(I,1)) - ln(max(GaussianBlur(max(I,1), sigma=45 native pixels),1)). The Gaussian estimates broad background. Unsmoothed means no final median blur, not absence of a Gaussian background estimate.
f17r-marginalia-uv-ir.png
Only capture 7 (Voynich_17r+MB365UV_007_F.tif, UV365) and 11 (Voynich_17r+MB870IR_011_F.tif, IR870) supply the processed pixels. Band 1 supplies the coordinate reference only.
Fit the IR/UV covariance in crop rectangle (300,190)-(2250,270). beta = Cov(J11,J7)/(1.03*Var(J11)) = 2.824462890625.
IR training mean = 0.0008721816120669246
S = J7 - beta*(J11 - IR training mean). Apply this identical formula everywhere.
Stretch S using the 1st/99th percentiles from rectangle (1690,45)-(2120,195): [-0.4623613554239273, 0.19868828743696212]. Clip to [0,1], multiply by 255 and round to 8-bit.
Export: 3300 x 400 grayscale PNG; 1,046,662 bytes. Optimized lossless encoding, pixel-identical to the processed image. No resizing.
f116v-marginalia-grayscale.png
Uses captures 1-11 and 13-22 (21 captures). Capture 12, MB940IR, was rejected by the registration check.
Standardize each J by its recorded crop mean and standard deviation: Z=(J-mu)/sd. These statistics were sampled every third pixel in both crop axes.
Fit signal covariance in rectangles (100,40)-(1550,185) and (180,280)-(3380,850), sampling every second pixel in both axes.
Noise covariance uses horizontal adjacent-pixel differences divided by sqrt(2), flattened and sampled every third difference. This includes texture and stroke edges: it is approximate noise, not calibrated sensor noise.
Solve C*v = lambda*(N + ridge*I)*v, with ridge = 0.1*trace(N)/21 = 0.0030837112486527506. Select the eigenvector with the largest eigenvalue; orient its sign to dark visible marks.
S=sum(v_b*Z_b), the same vector over the full crop. Stretch the 0.5th/99.5th percentiles from the fitting rectangles: [-41.7496629428886, 10.651094460059111]. Clip and round to 8-bit.
Coefficients below multiply standardized channels. Their magnitude is not a percentage contribution: channels are correlated and some coefficients are negative.
Capture | recorded code | coefficient v | mean mu | standard deviation sd
01 | MB450RB | -0.40123389398641607 | -0.030934782698750496 | 0.24075385928153992
02 | MB470LB | -0.466772792816873 | -0.0273868627846241 | 0.22821111977100372
03 | MB505CN | -0.4169843883126215 | -0.02330409735441208 | 0.21211296319961548
04 | MB535GN | -0.17501679194204545 | -0.020401451736688614 | 0.19907282292842865
05 | MB570AM | 0.7211247912064062 | -0.014523405581712723 | 0.16990114748477936
06 | MB625RD | 1.2261049179911327 | -0.011578815057873726 | 0.1505759358406067
07 | MB365UV | 0.06679484892500705 | -0.03539511561393738 | 0.2502836287021637
08 | MB700IR | 0.9694143149610635 | -0.0069826822727918625 | 0.1124449148774147
09 | MB735IR | 0.6722502501491484 | -0.0055714016780257225 | 0.09956010431051254
10 | MB780IR | 0.09534763785765055 | -0.0042648836970329285 | 0.08557050675153732
11 | MB870IR | -0.7137994560362623 | -0.0032104067504405975 | 0.07183916866779327
13 | WBUVR25 | 0.2648120055003522 | -0.03113832324743271 | 0.241638645529747
14 | WBRBR25 | 0.9461587244697228 | -0.027460074052214622 | 0.22214029729366302
15 | WBUVG58 | 0.33944875790904966 | -0.05060529336333275 | 0.32504764199256897
16 | WBRBG58 | -0.42043416066753564 | -0.03575313091278076 | 0.2683892250061035
17 | WBUVB47 | 1.5364007763142844 | -0.052557043731212616 | 0.30795878171920776
18 | WBRBB47 | 2.7186676183012546 | -0.027277830988168716 | 0.21998879313468933
19 | WBUVUVP | -0.030499106325626277 | -0.014894123189151287 | 0.15382885932922363
20 | WBUVO22 | 0.5555066082091724 | -0.03653222694993019 | 0.2655847668647766
21 | WBRBO22 | 0.2021404550443559 | -0.0311378575861454 | 0.24000751972198486
22 | WBUVUVB | 0.48008406118723423 | -0.041301969438791275 | 0.2817792296409607
f116v-marginalia-uv-colour.jpg
Use the grayscale field above for display luma. For UV chroma, assign locally normalized captures 13 WBUVR25 -> R, 15 WBUVG58 -> G, 17 WBUVB47 -> B. These are UV-illuminated captures through three different optical filters.
Each UV channel uses its own 0.5th/99.5th percentile stretch within the same fit rectangles. R/G/B ranges: [[-1.3137560510635375, 0.36494593620300314], [-1.8364973163604736, 0.4203295326232912], [-1.4626196479797364, 0.372614221572876]]
Display luma weights = (0.2126,0.7152,0.0722). Subtract UV luma from each UV RGB pixel to obtain chroma.
Subtract a constant chroma centre estimated from the brighter 40% of the fitted grayscale samples, then multiply chroma by 1.35. Recorded centre: [-0.02251860499382019, 0.006493031978607178, 0.0019894542638212442]
Add this chroma to the grayscale luma, reducing chroma per pixel only as needed to keep all RGB values within [0,1]. Quantization changes display luma by at most 0.499 of one 8-bit level. This is not physical radiometric luminance.
Export: 3650 x 920 progressive JPEG, Pillow quality 94, 4:4:4 chroma (no chroma subsampling), optimized. 1,880,707 bytes. Lossy compression; no resizing.
Grayscale export: 3650 x 920 PNG, 1,636,546 bytes, lossless and pixel-identical to the generated grayscale image.
INTERPRETATION
No final median filter, sharpening, generative enhancement or reconstructed letters was applied to these exports. Registration and local background estimation do modify pixels. The processing can amplify or alter texture, stains and show-through; it does not establish the wording or different ink chemistries.
The walkthrough sheets use scaled examples for presentation. They are not replacements for the native-resolution exported images.

