fix(#350): OCR-Merge nutzt Center-Y-Distanz statt y-Überlapp #351

Merged
admin-mrrm merged 1 commit from fix/350-merge-center-heuristic into main 2026-05-19 23:19:29 +02:00
Owner

Summary

Follow-up zu #325 / PR #346. Im echten Foto-Test wurden zwei semantisch getrennte Handschrift-Zeilen („300g Kirschen" + „Erdbeeren") fälschlich zusammengemerged.

Ursache

Alte Heuristik in _merge_overlapping_bboxes: y_overlap / min(h) > 0.4. Bei deutscher Handschrift mit Unterlängen (g, p) und Oberlängen (E, K) erzeugen vertikal benachbarte Zeilen oft 40–50 % Streifen-Überlapp — ohne semantisch eine Zeile zu sein.

Fix

Umstellung auf Center-Y-Distanz:

|center_y(box) - center_y(cluster)| < 0.5 * max(h_box, h_cluster)

Zwei Boxen gehören nur dann zur selben Zeile, wenn ihre Mittellinien wirklich auf gleicher Höhe liegen. Ist robust gegen Ober-/Unterlängen.

Tests

  • Neuer Test test_merge_overlapping_bboxes_keeps_stacked_lines_with_descender_overlap mit Geometrie aus dem realen Failure-Case (45 % y-Überlapp, aber Center-Differenz 22 px > 20 px = halbe Box-Höhe).
  • Alle sechs Tests aus #325 sowie der extract_text-Mock-Test bleiben grün (offline geprüft, vollständige Suite läuft auf Drone).

Fixt #350.

Test plan

  • pytest apps/ocr/tests/test_ocr.py -v grün (Drone-CI)
  • Smoke: dasselbe Foto aus dem Screenshot → 300g Kirschen und Erdbeeren als zwei separate Einträge
## Summary Follow-up zu #325 / PR #346. Im echten Foto-Test wurden zwei semantisch getrennte Handschrift-Zeilen („300g Kirschen" + „Erdbeeren") fälschlich zusammengemerged. ## Ursache Alte Heuristik in `_merge_overlapping_bboxes`: `y_overlap / min(h) > 0.4`. Bei deutscher Handschrift mit Unterlängen (g, p) und Oberlängen (E, K) erzeugen vertikal benachbarte Zeilen oft 40–50 % Streifen-Überlapp — ohne semantisch eine Zeile zu sein. ## Fix Umstellung auf Center-Y-Distanz: ``` |center_y(box) - center_y(cluster)| < 0.5 * max(h_box, h_cluster) ``` Zwei Boxen gehören nur dann zur selben Zeile, wenn ihre Mittellinien wirklich auf gleicher Höhe liegen. Ist robust gegen Ober-/Unterlängen. ## Tests - Neuer Test `test_merge_overlapping_bboxes_keeps_stacked_lines_with_descender_overlap` mit Geometrie aus dem realen Failure-Case (45 % y-Überlapp, aber Center-Differenz 22 px > 20 px = halbe Box-Höhe). - Alle sechs Tests aus #325 sowie der `extract_text`-Mock-Test bleiben grün (offline geprüft, vollständige Suite läuft auf Drone). Fixt #350. ## Test plan - [ ] `pytest apps/ocr/tests/test_ocr.py -v` grün (Drone-CI) - [ ] Smoke: dasselbe Foto aus dem Screenshot → 300g Kirschen und Erdbeeren als zwei separate Einträge
fix(#350): OCR-Merge nutzt Center-Y-Distanz statt y-Überlapp
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
73a41696d7
Der bisherige Threshold (y_overlap / min-Höhe > 0.4) hat bei
deutscher Handschrift Nachbarzeilen fälschlich zusammengemerged —
Unterlängen (g, p) und Oberlängen (E, K) erzeugen Streifen-Überlapp
zwischen optisch klar getrennten Zeilen.

Neue Regel: |center_y(box) - center_y(cluster)| < 0.5 * max(h_box,
h_cluster). Damit zählt nur, ob die Mittellinien wirklich auf einer
Höhe liegen, nicht der Streifen-Überlapp.

Neuer Test deckt den konkreten Failure-Case aus dem Screenshot
(„300g Kirschen" + „Erdbeeren" mit 22 px Center-Differenz und 18 px
Y-Überlapp) — bleibt jetzt korrekt als zwei Einträge bestehen. Alle
sechs Tests aus #325 plus der Mock-Test in test_extract_text_uses_easyocr
bleiben grün.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!351
No description provided.