Извлечь выровненную таблицу из отсканированного документа opencv python - PullRequest
2 голосов
/ 21 марта 2019

Я хочу извлечь информацию из отсканированной таблицы и сохранить ее в формате CSV.Прямо сейчас мой алгоритм извлечения таблиц выполняет следующие шаги:

  1. Применение коррекции перекоса
  2. Применение фильтра Гаусса для шумоподавления.
  3. Выполнение бинаризации с использованием Otsu thresholding
  4. Выполнить морфологическое открытие.
  5. Обнаружение Canny egde
  6. Выполнить грубое преобразование для получения строк таблицы.
  7. Удалить повторяющиеся строки (те же строки в диапазоне10 пикселей)
  8. фильтрует горизонтальные и вертикальные линии, используя наклон линии (наклон должен быть меньше +/- 5 градусов для горизонтали и нормали к вертикали).

Этот алгоритмхорошо работает для цифровых PDF-файлов и большинства отсканированных документов.Но некоторые документы имеют шумную таблицу, и поэтому в ней неправильно определяются строки.

Вот пример изображения, в котором мой алгоритм не работает.

raw image

Это операции, которые я делаю с этой таблицей.1. Размытие по Гауссу

Gaussian blur

2.Отсу пороговое значение

Otsu thresholding

3.Морфологическое отверстие

Morphological opening

4. Обнаружение края ручки

Canny edge detection

5.фильтрованные линии, как вы можете видеть, линии явно не определены правильно.

filtered lines,as you can see the lines are clearly not identified correctly.

Может ли кто-нибудь предложить лучший метод для выделения горизонтальных и вертикальных линий из этого вида менее качественных сканов.

Заранее спасибо!!

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

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

  • Порог изображения в градациях серого, как вы сделали.
  • Теперь найдите самый большой контур на изображении, которым будет ваша таблица.
  • Теперь используйте Floodfill, чтобы отделить таблицу от изображения, выбрав любую точку на контуре для создания заливной маски,
1 голос
/ 24 апреля 2019

Я нашел идеальное решение в этом блоге. https://medium.com/coinmonks/a-box-detection-algorithm-for-any-image-containing-boxes-756c15d7ed26

Здесь мы выполняем морфологические преобразования, используя вертикальное ядро ​​для обнаружения вертикальных линий и горизонтальное ядро ​​для обнаружения горизонтальных линий, а затем комбинируем их для получения всех необходимых линий.

Вертикальные линии Vertical lines

Горизонтальные линии Horizontal lines

требуемый вывод required output

0 голосов
/ 16 апреля 2019

Проблема может быть в HoughLinesTransform ()

Вы можете попробовать использовать: HoughLinesTransformP ()

Для HoughLinesTranform () чтобы работать идеально, линии должны быть идеальными.На предоставленном вами изображении четко видны искажения, которые явно вызывают сбой метода.

Сначала попробуйте расширить изображение. Расширение изображения в Python.

...