Пороги поиска линий: было / стало — «Пример 2», страница 1

Шаг 5: пороги app/linetable.py (длина полосы, которую морфология считает линией) подобраны так, чтобы алгоритм ближе совпадал с сохранённым эталоном (docs/reference-grid/1c6c0fac…-p1.json). Переключатель ниже показывает то же самое сравнение с эталоном ДО подбора (старый порог, 1/30 стороны картинки) и ПОСЛЕ (новый порог, 1/40) — сейчас в сервисе работает вариант «после».

«Пример 2», страница 1, после выравнивания
эталон (совпало с алгоритмом) линия алгоритма эталон — алгоритм не нашёл (пропуск) лишняя линия алгоритма (эталону не соответствует)

Что именно пропущено на выбранном пороге

Линия эталонаПоложение на страницеЗона

Почему не 24 из 24 — и что не поддалось подбору

После подбора порога шапка таблицы по-прежнему размечается ячейками полностью (0 пропусков в шапке — было так уже до этого шага) и один из шести пропущенных столбцов правого края («Налоговая ставка») теперь находится. Пять оставшихся столбцов правого края («Сумма налога» … «Регистрационный номер») подбором порога не восстановить: на скане это не отсутствующие, а очень бледные линии — в маске чернил после выравнивания фона больше половины их высоты вообще без следа (проверено по самой картинке, не только по счётчикам). Дальше поднимать порог (пробовали до длины полосы в 1/46 стороны) добавляло уже не настоящие линии эталона, а ложные — на «Примере 3» и «Примере 5» между строк текста внутри одной ячейки появлялась лишняя горизонтальная линия, разрезающая текст пополам. Порог 1/40 — граница, на которой прибавка на этом примере ещё есть, а лишних ячеек на всех пяти примерах заказчика ещё нет.

Область сравнения — основная товарная таблица УПД (шапка + 4 строки товаров), без блока реквизитов продавца/покупателя сверху и итоговой строки внизу. Все координаты — доли страницы «После выравнивания», сетка сопоставлена с эталоном с допуском ≈29 пикселей (0,6% стороны листа). Правым краем считаются 6 самых правых линий эталона (последние 6 из 16 столбцов таблицы).