Как эффективно обнаруживать и удалять направляющие линии из отсканированного изображения / документа? - PullRequest
2 голосов
/ 23 июня 2010

Для моего проекта я пишу библиотеку предварительной обработки изображений для отсканированных документов.На данный момент я застрял с функцией удаления линии.

Описание проблемы: Образец отсканированной формы:

Name*  : ______________________________
Age* : ______________________________

Email-ID: |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|

Примечание: Ниже приведены следующие условия:

  • Отсканированный документ можетсодержат гораздо больше вертикальных и горизонтальных направляющих.
  • Толщина линий может превышать 1px
  • Сам документ напечатан неправильно и может иметь помехи в виде вздутий или неравномерной толщины
  • Возможно, документ окрашенфон или линии

Теперь я пытаюсь обнаружить эти строки и удалить их.И при этом рукописное содержание не должно быть потеряно.

Решение так: текущее решение реализовано на Java.

Обнаружил эти линии, используя комбинацию детекторов границ Canny / Sobel и порогового фильтра (чтобы сделать изображение битовым).Из предыдущего действия я получаю черно-белый массив пикселей.Обойдите массив и проверьте, падает ли яркость этого пикселя ниже указанного значения бина.И если я нашел 30 (минимальная длина строки в пикселях) таких пикселей, я удаляю их.Я повторяю то же самое для вертикальных линий, но принимая во внимание тот факт, что из-за удаления горизонтальных линий будут прорези.

Хотя решение, похоже, работает.Но есть такие проблемы, как

  • Удаление перекрывающихся символов
  • Если символы на изображении не расположены должным образом, то это также считается строкой.
  • Выходное изображение с распознаванием краев черно-белое.
  • Немного медленный.Обычно требуется около 40 секунд для изображения 2480 * 3508.

Пожалуйста, ознакомьтесь с инструкциями, как сделать это правильно и эффективно.И если есть библиотека с открытым исходным кодом, тогда, пожалуйста, направьте.

Спасибо

1 Ответ

1 голос
/ 29 июня 2010

Во-первых, я хочу отметить, что я ничего не знаю об обработке изображений в целом и об оптическом распознавании символов в частности.

Тем не менее, мне приходит в голову очень простая эвристика:

  1. Разделение пикселей на изображении на подключенные компоненты.
  2. Для каждого подключенного компонента определите, является ли он линией или нет, используя одну или несколько следующих эвристик:
    1. Это больше, чем средняя длина букв?
    2. Он появляется рядом с другими буквами? (Для удаления чернильных пятен или артефактов).
    3. Достаточно ли велики его градиент X и Y? Это может гарантировать, что этот подключенный компонент содержит не только горизонтальную линию.

Единственная проблема, которую я вижу, это если кто-то пишет буквы по горизонтали, например, так:

   /\     ___
  /  \   /   \
  |__|   |___/
 -|--|---|---|------------------
  |  |    \__/

В этом случае строка останется, но вы все равно должны обработать этот случай.

Как я уже говорил, я ни в коем случае не эксперт по обработке изображений, но иногда работают очень простые приемы.

...