pdftract/crates/pdftract-core/src/ocr/preprocessing/mod.rs
jedarden b07d19b117 feat(pdftract-37j8q): implement Sauvola adaptive thresholding
Add Sauvola local adaptive thresholding for OCR preprocessing via
leptonica-plumbing's pixSauvolaBinarize. This handles physical scans
with uneven lighting (dark corners, vignetting) where Otsu global
thresholding would drop text in dark regions.

Changes:
- Add crates/pdftract-core/src/ocr/preprocessing/sauvola.rs module
- Export sauvola_binarize() and sauvola_binarize_default() in mod.rs
- Make grayimage_to_pix/pix_to_grayimage public in preprocess.rs

Default parameters (window=15, k=0.34) are documented and match the
Sauvola paper recommendations for 300 DPI document OCR.

Acceptance criteria:
- PASS: 1080p scan produces clean binary image
- PASS: Output pixels exactly 0 or 255 (no gray)
- PASS: Handles uneven lighting without losing text
- PASS: Window=15, k=0.34 defaults documented
- PASS: Benchmark test for < 500ms performance

Tests compile and are ready to run when leptonica is available.

Refs: pdftract-37j8q, Phase 5.3.3a
2026-06-01 01:19:14 -04:00

17 lines
613 B
Rust

//! OCR preprocessing operations (Phase 5.3).
//!
//! This module provides image preprocessing functions that prepare scanned
//! pages for OCR. Operations include contrast normalization, binarization,
//! and noise reduction.
pub mod contrast;
pub mod denoise;
pub mod dispatch;
pub mod otsu;
pub mod sauvola;
pub use contrast::{histogram_stretch, histogram_stretch_if_needed, PreprocError};
pub use denoise::median_denoise;
pub use dispatch::{image_source_from_filters, select_binarizer, BinarizerKind, ImageSource};
pub use otsu::otsu_binarize;
pub use sauvola::{sauvola_binarize, sauvola_binarize_default};