Summary
OCR is the shared backbone for scanned documents, plain images, and DICOM burned-in text, but OM-045 bundles it into the epic without a discrete, swappable adapter layer. We need one OCR contract (word text + bbox + confidence + page) with two interchangeable backends so all image/scan paths reuse it and tests can stub OCR deterministically.
Scope
Acceptance criteria
Out of scope
- Training or fine-tuning OCR models.
- Pixel redaction rendering (image-redaction task).
- Non-English OCR language packs (separate config task).
Files
- openmed/multimodal/ocr.py
- pyproject.toml
- tests/unit/multimodal/test_ocr_contract.py
- tests/unit/multimodal/test_ocr_engines.py
Task: OM-061 · Milestone: v1.7 · Priority: P1 · Size: M
Depends on: OM-045, OM-058 · Blocks: OM-065, OM-075
Roadmap: OPENMED_V2_UNIFIED_ROADMAP.md sec 5.8 (PaddleOCR/Tesseract); RESEARCH_APPENDIX sec 7; OM-045 scope (c)
Spec: PLANS/V2/EXECUTION/tasks/OM-061.md
Summary
OCR is the shared backbone for scanned documents, plain images, and DICOM burned-in text, but OM-045 bundles it into the epic without a discrete, swappable adapter layer. We need one OCR contract (word text + bbox + confidence + page) with two interchangeable backends so all image/scan paths reuse it and tests can stub OCR deterministically.
Scope
ocr(image, *, engine=...)entry point.Acceptance criteria
Out of scope
Files
Task: OM-061 · Milestone: v1.7 · Priority: P1 · Size: M
Depends on: OM-045, OM-058 · Blocks: OM-065, OM-075
Roadmap: OPENMED_V2_UNIFIED_ROADMAP.md sec 5.8 (PaddleOCR/Tesseract); RESEARCH_APPENDIX sec 7; OM-045 scope (c)
Spec: PLANS/V2/EXECUTION/tasks/OM-061.md