How Small Can Text Be Before OCR Fails? A Measurement
165 recognition runs across three typefaces and eleven sizes, measured rather than repeated. The answer is roughly a third of the figure usually quoted — including by an earlier version of this site.
By Tu Luu · · 8 min read
Why this exists
This site used to state that OCR accuracy "falls off a cliff below roughly 20 pixels of cap height" and is "comfortable at 30–40 pixels". That was repeated common advice with no source behind it. Rather than hunt for a citation, I measured it — and the claim was wrong, so it has been corrected across the site.
Result
Arial
Flawless from 12px cap height.
Below 90% at 4px and under.
Georgia
Flawless from 14px cap height.
Below 90% at 6px and under.
Courier New
Flawless from 9px cap height.
Below 90% at 5px and under.
What the numbers say
- Perfect accuracy arrives at 9–14 pixels of cap height, depending on the typeface — not 30–40. Every sample at or above that height came back character-for-character identical.
- The collapse is sudden and it happens at 4–6 pixels. Arial holds 95.8% at a 6px cap and drops to 0% at 4px. There is no gentle decline: two pixels separate "mostly right" from "nothing usable".
- Monospace tolerates the smallest sizes. Courier New was still at 99.2% with a 6px cap, where Georgia managed 98.8% at 7px and needed 14px to be perfect. Uniform advance width and open counters survive downsampling better than a serif with fine strokes.
- Between 7px and 12px the errors are single characters, typically a comma read as a full stop or a merged space. Accuracy sits at 99%+ but exact-match does not, which matters if you are parsing rather than reading.
What this does not measure
Every sample was drawn by the Canvas API as pure black on pure white: no noise, no blur, no skew, no lighting gradient, no JPEG artefacts, no paper texture. That is the engine's ceiling under laboratory conditions.
A phone photo of a receipt has all of those things, and every one of them raises the size you actually need. So read these thresholds as a floor below which nothing will work, not as a target. The commonly quoted 20px is defensible as practical advice for real-world scans — it is just not where the engine breaks, and presenting it as though it were is what this page corrects.
Method
- Engine: Tesseract.js 5 (WebAssembly), eng.traineddata — the same build the site's OCR tool runs.
- Metric: Character error rate — Levenshtein distance over ground-truth length, whitespace normalised.
- Rendering: HTML5 Canvas, pure black on pure white, no noise, no skew, no compression.
- Cap height is the measured ink height of a capital H at each size, not the CSS font-size. Cap height is roughly 0.7em but varies by typeface: at 6px, Arial renders a 4px cap and Courier New renders 1px.
- Runs: 33 size-and-font combinations × 5 samples = 165 recognitions.
- Date: 2026-07-29.
The harness is in the repository at scripts/ocr-benchmark.mjs and needs only Playwright to re-run. Differences of a few tenths of a percent between adjacent sizes are run-to-run noise, not signal — Courier New reading 99.58% at a 14px cap and 100% at 9px is the clearest example.
The five sample strings
Chosen to include the things OCR actually struggles with — digits next to letters, punctuation, mixed case, an email address and a reference code — rather than clean prose alone.
- The quick brown fox jumps over the lazy dog
- Invoice 4820 total 173,880 VAT 8% due 29 July
- Contact: hello@example.com or +84 90 123 4567
- Mixed CASE with punctuation; colons, dashes - and (brackets)
- Order #A7-2291 shipped 03/11/2026 weight 1.45kg
Full results
| Typeface | font-size | Cap height | Accuracy | Exact matches |
|---|---|---|---|---|
| Arial | 6px | 4px | 0% | 0 / 5 |
| Arial | 8px | 6px | 95.83% | 1 / 5 |
| Arial | 10px | 7px | 99.17% | 3 / 5 |
| Arial | 12px | 9px | 99.17% | 3 / 5 |
| Arial | 14px | 10px | 99.58% | 4 / 5 |
| Arial | 16px | 12px | 100% | 5 / 5 |
| Arial | 20px | 15px | 100% | 5 / 5 |
| Arial | 24px | 17px | 100% | 5 / 5 |
| Arial | 30px | 22px | 100% | 5 / 5 |
| Arial | 40px | 29px | 100% | 5 / 5 |
| Arial | 56px | 41px | 100% | 5 / 5 |
| Georgia | 6px | 4px | 30% | 0 / 5 |
| Georgia | 8px | 6px | 78.75% | 1 / 5 |
| Georgia | 10px | 7px | 98.75% | 2 / 5 |
| Georgia | 12px | 8px | 99.58% | 4 / 5 |
| Georgia | 14px | 10px | 99.17% | 3 / 5 |
| Georgia | 16px | 11px | 99.17% | 3 / 5 |
| Georgia | 20px | 14px | 100% | 5 / 5 |
| Georgia | 24px | 17px | 100% | 5 / 5 |
| Georgia | 30px | 21px | 100% | 5 / 5 |
| Georgia | 40px | 28px | 100% | 5 / 5 |
| Georgia | 56px | 39px | 100% | 5 / 5 |
| Courier New | 6px | 1px | 0% | 0 / 5 |
| Courier New | 8px | 5px | 36.25% | 0 / 5 |
| Courier New | 10px | 6px | 99.17% | 3 / 5 |
| Courier New | 12px | 7px | 99.58% | 4 / 5 |
| Courier New | 14px | 8px | 99.17% | 3 / 5 |
| Courier New | 16px | 9px | 100% | 5 / 5 |
| Courier New | 20px | 12px | 100% | 5 / 5 |
| Courier New | 24px | 14px | 99.58% | 4 / 5 |
| Courier New | 30px | 17px | 99.58% | 4 / 5 |
| Courier New | 40px | 23px | 100% | 5 / 5 |
| Courier New | 56px | 33px | 100% | 5 / 5 |