r/computervision • u/decorator • 2h ago
Showcase Analysis-by-synthesis on a 32×32 texture: decoding the unreadable Super Mario 64 plaque. Looking for people to poke holes in the method
The courtyard plaque in Super Mario 64 is a single 32×32 RGBA16 texture (5 bits per channel, so 32 grey levels). Its two lines of text are 3-5 px tall. People have argued for ~30 years about what it says ("L is real 2401" is the well-known rumor), mostly by eyeballing or running it through upscalers.
I treated it as an inverse problem instead. A forward model of how a 1996 artist would have made it:
- render a candidate text in a real font on a canvas (canvas size, font size, tracking, word spacing are free)
- downsample to 32×32 (box / bilinear / bicubic tested)
- Gaussian blur + gamma on the coverage
- composite onto the stone background:
texture = stone + L · coverage^γ
Then I search over fonts × process parameters × texts and score each by weighted SSE against the real texture.
Some details:
- Stone: estimated from the text-free pixels and inpainted under the letters with a Gaussian process. The pixel variance from the inpainting feeds into the weights.
- Calibration: the scoring was tested on synthetic plaques with known text, and every result is compared against a noise floor.
- Fonts: ~530 fonts from the era; best is Adobe Palatino Bold Italic (1990 Type 1). As a control, I ran 4,583 modern Google Fonts styles through the same three-stage search. The best modern font scores 905 vs 789, and every Palatino variant from the era beats all of them.
- Text: "Eternal Star / We hope so". For line 1, I scored every first word: a beam search over letter strings (4-10 letters, no dictionary) plus a 245k-word vocabulary, 1.24M strings in total. "Eternal" ranks #1 and the blind beam finds it on its own. Line 2 comes from a blind DP over 17.7k words.
- Rival reading: "L is real 2401" scores ~2,031 vs 789 on line 1, even with its own best process parameters.
Where I'd most like input:
- Identifiability: at this resolution, strings with the same letter shapes ("Stoi" vs "Star") score almost the same. The pixels fix the shapes and the language prior picks the word. Is there a principled way to report this, e.g. a posterior over strings instead of a ranking?
- Metric: weighted SSE with a GP-based variance. Would you use something else for 5-bit data with structured background noise?
- Stone: the background comes from a 90s stock photo (Sozaijiten SC003, brushed steel). Registering the text-free pixels against 1024 px web copies (masked NCC with plane removal, rotation/scale/mirror search) gives no unique lock: best 0.51 vs a mirrored control at 0.41. Is there a better way to register a tiny, heavily downsampled crop of a nearly self-similar texture?
Code, all result files and a 50-page report: https://github.com/supermochi64/sm64-plaque-decode
GIFs of the real texture vs. the model: https://github.com/supermochi64/sm64-plaque-decode#see-it-move