Страницы

Поиск по вопросам

четверг, 26 декабря 2019 г.

Распознавание ячеек таблиц на картинке

#nodejs


Использую google vision api для распознавания текста на картинке. Проблема в том,
что он распознаёт текст, но не распознаёт колонки.

Представим себе к примеру такую таблицу:

Картинка в полном размере

С виду кажется, что решение очень простое:


  Чтобы получить текст из колонки с 3 параграфом - мне всего-лишь нужно
  указать точки на картинке(левый-верхний угол и правый-нижний угол).
  Но проблема кроется в том, что колонка с 4 параграфом может иметь другую ширину
и точки колонки с параграфом 4 изменятся.
  
  Так-же можно было бы искать точки по заголовкам ячеек, но если
  качество картинки плохое, то заголовок может не распознаться, т.к.
  заголовок на несколько пунктов меньше чем обычный текст.


Я пробовал использовать OpenCV на node.js. Но он мне выделял не границы ячеек, а
границы всего, вплоть до границ каждой буквы.

В какую сторону мне стоит смотреть в поиске решения моей проблемы?
    


Ответы

Ответ 1



Предлагаю Вам решение, которое я когда-то делал. Оно НЕ собирается из коробки. Но ядро там рабочее. Написано на python3.* и использует openCV. Если у Вас будет запрос, то Вы можете мне написать и я соберу его для Вас. На момент 2 года назад на гите не было решений открытых, которые решают данную задачу более или менее удовлетворительно. Моя тулза обеспечивает более или менее устойчивое выделение ячеек, если они не слишком мелкие. Ответ предоставляется в виде dict со списком углов ячеек. Таким образом, их можно распарсить и рассматривать как отдельные картинки. Есть Adobe Reader, который это умеет. Но он дорогой. Описание: Хошимин предназначен для извлечения текстовой информации из таблиц, представленных в PDF, картинках или ином формате. Если таблица сильно наклонена, то данные извлекутся некорректно. PDF предварительно преобразуется в картинки (постранично), а затем каждое изображение обрабатывается отдельно. Утилита игнорирует текстовый слой и рассматривает любой pdf как картинку. Предполагается, что на одной странице существует ровно одна таблица, которая не переносится на следующую страницу. Если на странице существует несколько таблиц, то вероятнее всего распознование произойдёт некорректно. Хошимин не умеет работать со сложными таблицами, в которых несколько ячеек объеденены воедино. Идея распознования заключается в выделении компонент связности достаточно длинных блоков, которые с большой вероятностью являются линиями. Затем производится замыкание этих линий, и, собственно, они извлекаются. Это всё сдобрено рядом эвристик, которые были подобраны опытным путём. Примерные этапы работы: Детекция горизонтальных и вертикальных линий Замыкание [ Фильтрация ненужных точек [ Для работы Вам потребуется openCV, а также сам hochiminh: Пример: from hochiminh import pdf_parser from hochiminh.image_processing import hochiminh from hochiminh.image_processing.connected_components import ConnectedComponents from hochiminh.image_processing.cross_detector import CrossDetector from hochiminh.image_processing.lines_detector import SobelDirector from hochiminh.image_processing.ocr import TesseractWrapper from hochiminh.io import pdfconverter, reader path = "../data/test/ho_chi_minh/" parser = pdf_parser.PDFParser( table_extractor=hochiminh.HoChiMinh( reader=reader.ImagePDFReader( pdfconverter.PDFConverter(in_path=path + 'pdf/', out_path=path + 'pdf/images/', resolution=130) ), lines_detector=SobelDirector(), connected_components=ConnectedComponents(), cross_detector=CrossDetector(max_steps=20, detected_steps=18, line_width=8), ocr=TesseractWrapper(), binarization=210 ) ) tabels = parser.extract_table() for tabel in tabels: print('--------------- Table ---------------') for cell in tabel: print(cell.__dict__)

Ответ 2



Использовать детектор границ Кенни на изображении, после чего отсечь все не вертикальные/горизонтальные линии. Или использовать minAreaRect, как здесь

Комментариев нет:

Отправить комментарий