PixelFontTrieOCR

Deterministic OCR for tiny (5–8px) crystal-clear pixel fonts using a multi-way Trie keyed by 8-bit column bitmasks.

Replaces noisy general OCR (e.g., Tesseract) with perfect accuracy, early pruning, and microsecond performance on exact fonts.

Installation

Add this line to your application's Gemfile:

gem 'pixel_font_trie_ocr'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install pixel_font_trie_ocr

Dependencies: Requires RMagick for image handling and TTFunk for font parsing.

Quick Start

require 'pixel_font_trie_ocr'

ocr = PixelFontTrieOCR.new
ocr.font_name = 'hex-synergy_font.ttf'  # Default font
ocr.font_size = 8  # Default size

# Render text to image
img = ocr.text_image('Hello World')

# Extract column bitmasks
masks = ocr.bitmask(img)

# Recognize text
text = ocr.parse_mask(masks)
puts text  # => "Hello World"

# Or directly parse an image
text = ocr.parse_image(img)

Advanced Usage

Building and Using the Trie

ocr = PixelFontTrieOCR.new

# Generate character masks from font (memoized)
char_masks = ocr.char_masks  # { 'A' => [mask1, mask2, ...], ... }

# Build trie
trie = ocr.trie  # Or PixelFontTrieOCR::Trie.new(char_masks)

# Insert custom character
trie.insert('!', [0b101, 0b010])

# Parse masks
masks = [0b101, 0b010, 0]  # Example masks with trailing zero
text = trie.parse(masks)  # Handles variable-width and whitespace

Image Manipulation

# Create image from masks
mask_img = ocr.mask_image(masks)

# Write text image to file
ocr.write_text_image('Test', 'test.png')

# Bitmask utilities
bitmask = ocr.array_to_bitmask([1, 0, 1])  # => 5
bits = ocr.bitmask_to_array(5)  # => [1, 0, 1]

Custom Font Configuration

ocr.font_dir = '/path/to/fonts'
ocr.font_name = 'custom_font.ttf'
ocr.font_size = 6

puts ocr.height  # Calculated pixel height
puts ocr.characters.to_a  # Supported characters

Extracting Masks from Existing Image

img = Magick::Image.read('path/to/image.png').first
extractor = PixelFontTrieOCR::ImageColumnExtractor.new(img, threshold: 50000)
masks = extractor.extract

Features

  • Deterministic Recognition: 100% accuracy for exact pixel matches; no ML heuristics.
  • Fast: Microsecond per character; early trie pruning.
  • Variable-Width Support: Handles fonts with varying glyph widths.
  • Memoization: Heavy use for performance (e.g., font loading, mask generation).
  • Utilities: Image rendering, bitmask conversion, font metadata extraction.
  • Customization: Adjustable threshold for black/white detection in images.

Core Components

Component Purpose
PixelFontTrieOCR Main class including all modules; entry point for usage.
Trie Core trie for inserting masks and parsing text.
Trie::Node Trie nodes with recursive matching.
ImageColumnExtractor Converts images to bitmask arrays.
FontMetadata (module) Font loading and metadata (characters, ascent, etc.).
ImageUtils (module) Image creation and writing (text_image, mask_image).
Parsing (module) Builds trie and performs recognition (parse_image).
Methods (module) Bitmask utilities (array_to_bitmask).

Development

After checking out the repo, run bin/setup to install dependencies. Then, run bundle exec rspec to run the tests.

You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Rake Tasks

  • rake spec: Run RSpec tests.
  • rake rubocop: Run RuboCop linter.
  • rake font_map: Generate glyph images and YAML mask map to /tmp/.
  • rake build: Build the gem.
  • rake install: Install locally.
  • rake release: Tag and publish to RubyGems.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[YOUR_USERNAME]/pixel_font_trie_ocr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

License

The gem is available as open source under the terms of the MIT License.