Слабые и перекошенные сканы: сетка держится

Линии сетки — это границы, по которым текст режется на ячейки. Если линия не нашлась, две соседние клетки бланка слипаются в одну; если легла мимо разлиновки — ячейка рвётся там, где на бумаге ничего не нарисовано. Здесь проверено, как ложатся линии на всех 8 страницах пяти примеров: на странице как есть, на её выцветшей копии и на копии с остаточным перекосом 0.7°.

Линий мимо разлиновки — на перекошенной копии
42 → 0
из 451 найденных линий
Линий мимо разлиновки — на странице как есть
20 → 3
из 439 найденных линий
Границ столбцов найдено — на перекошенной копии
113 → 149
по всем восьми страницам
Границ строк найдено — на перекошенной копии
218 → 286
по всем восьми страницам

Видно на глаз: пример заказчика с перекосом

Одна и та же страница, один и тот же кусок. Красным нанесены линии, которые нашёл алгоритм: слева — как было, справа — как стало. На бумаге линии идут по границам клеток, значит и красные линии должны идти по ним же.

Страница с остаточным перекосом 0.7°

Было
было: Страница с остаточным перекосом 0.7°
Стало
стало: Страница с остаточным перекосом 0.7°

Та же страница с выцветшими чернилами

Было
было: Та же страница с выцветшими чернилами
Стало
стало: Та же страница с выцветшими чернилами

Страница как есть, без порчи

Было
было: Страница как есть, без порчи
Стало
стало: Страница как есть, без порчи

Перекошенная копия: по страницам

«Мимо разлиновки» — линия, у которой меньше 80% длины проходит по чернилам самой страницы. Считается одинаково для старой и новой версии.

ДокументСтр.Границ найдено
было → стало
Линий мимо разлиновки
было → стало
Пример 1130 → 592 → 0
Пример 1243 → 5215 → 0
Пример 2166 → 6310 → 0
Пример 2249 → 629 → 0
Пример 3146 → 620 → 0
Пример 4134 → 390 → 0
Пример 5147 → 776 → 0
Пример 5224 → 370 → 0

Страница как есть: по страницам

ДокументСтр.Границ найдено
было → стало
Линий мимо разлиновки
было → стало
Пример 1148 → 580 → 0
Пример 1245 → 520 → 0
Пример 2151 → 6411 → 1
Пример 2258 → 539 → 2
Пример 3145 → 610 → 0
Пример 4137 → 380 → 0
Пример 5148 → 780 → 0
Пример 5223 → 350 → 0

Выцветшие чернила

Бледная копия — это скан со слабым тонером: линии остаются, но до чёрного не доходят. Раньше такие линейки были для алгоритма просто фоном. Сколько границ таблицы находится сейчас на обычной странице и на её бледной копии:

ДокументСтр.Линий строк
обычная → бледная
Линий столбцов
обычная → бледная
Пример 1136 → 3022 → 20
Пример 1231 → 2620 → 20
Пример 2143 → 2621 → 19
Пример 2226 → 920 → 17
Пример 3142 → 3217 → 17
Пример 4121 → 2017 → 17
Пример 5154 → 4424 → 20
Пример 5230 → 243 → 2

Планка бледности считается от самой страницы

Оставалась одна дыра: планка «насколько линия должна быть темнее бумаги» была одна и та же для любого скана. У выцветшей копии слабее ВСЁ — и буквы, и линейки, — поэтому под общую планку такая разлиновка не подходила и терялась. Теперь планка считается по самой странице: от силы её же самых заметных штрихов. На нормальном скане она прежняя, ниже зерна бумаги не опускается никогда.

Границ строк — бледная
219 → 267
все восемь страниц, выцветшая копия
Границ столбцов — бледная
142 → 156
все восемь страниц, выцветшая копия
Границ строк — как есть
283 → 283
страница как есть — не изменилось
Границ столбцов — как есть
156 → 156
страница как есть — не изменилось
Границ строк — с завалом
286 → 286
копия с перекосом — не изменилось
Границ столбцов — с завалом
165 → 165
копия с перекосом — не изменилось

Видно на глаз — выцветшая копия перекошенного примера, первая страница. Было 26 границ строк и 22 границ столбцов, стало 38 и 25. Красным нанесено то, что нашёл алгоритм:

Было
выцветшая копия, было
Стало
выцветшая копия, стало

На настоящих страницах примеров ничего не поехало: тот же перекошенный пример на экране проверки — 147 ячеек, линий поперёк ячейки 0, ячеек без рамки 0.

Тот же перекошенный пример открыт в браузере на рабочей ссылке сервиса и распознан там: 132 ячеек, 56 линий сетки, линий поперёк ячейки 0, ячеек без рамки 0, сдвиг линии от границы ячейки 0.02 px. Это снимок рабочей ссылки на момент проверки — правка планки бледности встанет туда после публикации.

Рабочая ссылка, экран «Проверить и исправить»: перекошенный пример
рабочая ссылка, перекошенный пример

Сколько линий уцелело на испорченной копии

Проверка от обратного. Берём страницу как есть, запоминаем каждую найденную на ней линию — и портим ту же страницу тремя способами: гасим чернила на 55% (выцветшая копия), перебиваем линейки белыми разрывами длиной 0.6% стороны листа через каждые 8% (порванная) и доворачиваем лист на 0.7° (остаточный перекос). Дальше на каждой копии ищем линии заново и смотрим, сколько прежних линий нашлось там же — целиком, одной линией, а не обрывками.

Границ строк уцелело — бледная
245 из 283
87% линий страницы, выцветшая копия
Границ столбцов уцелело — бледная
150 из 156
96% линий страницы, выцветшая копия
Границ строк уцелело — порванная
206 из 283
73% линий страницы, линейки перебиты разрывами
Границ столбцов уцелело — порванная
127 из 156
81% линий страницы, линейки перебиты разрывами
Границ строк уцелело — с завалом
244 из 283
86% линий страницы, лист довёрнут на 0.7°
Границ столбцов уцелело — с завалом
148 из 156
95% линий страницы, лист довёрнут на 0.7°
ДокументСтр.Линий на странице
строк / столбцов
Уцелело на бледнойУцелело на порваннойУцелело с перекосом
Пример 1136 / 2230 / 2227 / 2132 / 22
Пример 1231 / 2126 / 2124 / 2026 / 21
Пример 2143 / 2234 / 2124 / 1532 / 20
Пример 2226 / 2619 / 219 / 1222 / 20
Пример 3142 / 1935 / 1927 / 1532 / 19
Пример 4121 / 1721 / 1718 / 1620 / 17
Пример 5154 / 2451 / 2451 / 2450 / 24
Пример 5230 / 529 / 526 / 430 / 5

В каждой клетке — строки / столбцы. «Порванная» копия испорчена сильнее, чем бывает на деле: разрыв ставится через каждые 8% листа, то есть на линию через весь лист приходится больше десятка разрывов сразу.

Перекошенный пример на рабочей ссылке

Тот же документ открыт в браузере на рабочем адресе сервиса, распознавание запущено там же. На 2 страницах разобрано 132 ячеек, нарисовано 56 линий сетки, линий поперёк ячейки 0, ячеек без рамки 0, наибольший сдвиг линии от границы ячейки 0.02 px.

Рабочая ссылка: сетка на перекошенном примере
рабочая ссылка, сетка на перекошенном примере

Проверка на живом экране

Перекошенный пример открыт в настоящем браузере на экране «Проверить и исправить», запущено распознавание, и на каждой странице посчитано: сколько ячеек в разборе, сколько линий сетки нарисовано, есть ли линия, которая режет ячейку посередине, и есть ли ячейка, которую линии не обводят целиком.

СтраницаЯчеекЛиний сеткиЛиний поперёк ячейкиЯчеек без рамкиСдвиг линии от границы
110347000.01 px
24419000.02 px

Ошибок на странице: 0.

Экран «Проверить и исправить», перекошенный пример: сетка нанесена на скан
экран проверки, пример 2

Что изменилось внутри

Открыть распознавание

Соседние страницы отчёта: разбивка внутри ячейки, прогон сетки по всем пяти документам.