обработка изображения документа - PullRequest
11 голосов
/ 07 октября 2011

Я работал над приложением для обработки изображений документов (главным образом счетов) и, в основном, я хотел бы преобразовать определенные области интереса в XML-структуру, а затем классифицировать документ на основе этих данных. В настоящее время я использую ImageJ для анализа изображения документа и Asprise / tesseract для распознавания текста.

Сейчас я ищу что-нибудь, чтобы облегчить разработку. В частности, я ищу что-то для автоматического выравнивания изображения документа и анализа структуры документа (например, преобразование изображения в структуру дерева квадрантов для облегчения обработки). Хотя я предпочитаю Java и ImageJ, мне интересны любые библиотеки / коды / документы независимо от того, на каком языке они написаны.

Хотя система, над которой я работаю, должна, насколько это возможно, обрабатывать данные автоматически, пользователь должен следить за результатами и, при необходимости, корректировать классификацию, предложенную системой. Поэтому я заинтересован в использовании методов машинного обучения для достижения более надежных результатов. Когда аналогичные документы обрабатываются, например, Счета конкретной компании, ее структура обычно одинакова. Когда пользователь предварительно исправил данные документов компании, эти исправления следует учитывать в будущем. У меня есть только ограниченные знания в технике машинного обучения, и я хотел бы знать, как я могу реализовать свою идею.

Ответы [ 3 ]

12 голосов
/ 15 ноября 2011

Следующий прототип в Mathematica находит координаты блоков текста и выполняет OCR внутри каждого блока. Возможно, вам придется адаптировать значения параметров в соответствии с размерами ваших реальных изображений. Я не рассматриваю часть вопроса машинного обучения; возможно, вам даже не понадобится это приложение.

Импортируйте рисунок, создайте двоичную маску для напечатанных частей и увеличьте эти части, используя горизонтальное закрытие (расширение и эрозия).

enter image description here

Запросите ориентацию каждого BLOB-объекта, сгруппируйте ориентации и определите общий поворот, усредняя ориентации самого большого кластера.

enter image description here

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

enter image description here

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

enter image description here

На данный момент у вас есть список строк и их пространственное положение. Это еще не XML, но звучит как хорошая отправная точка для непосредственного приспособления к вашим потребностям.

Это код. Опять же, параметры (структурирующие элементы) морфологических функций могут нуждаться в изменении в зависимости от масштаба ваших реальных изображений; Кроме того, если накладная слишком наклонена, вам может понадобиться примерно «повернуть» структурирующие элементы, чтобы все еще добиться хорошего «раскачивания».

img = ColorConvert[Import@"http://www.team-bhp.com/forum/attachments/test-drives-initial-ownership-reports/490952d1296308008-laura-tsi-initial-ownership-experience-img023.jpg", "Grayscale"];
b = ColorNegate@Binarize[img];
mask = Closing[b, BoxMatrix[{2, 20}]]
orientations = ComponentMeasurements[mask, "Orientation"];
angles = FindClusters@orientations[[All, 2]]
\[Theta] = Mean[angles[[1]]]
straight = ColorNegate@Binarize[ImageRotate[img, \[Pi] - \[Theta], Background -> 1]]
TextRecognize[straight]
boxes = Closing[straight, BoxMatrix[{1, 20}]]
comp = MorphologicalComponents[boxes];
measurements = ComponentMeasurements[{comp, straight}, {"BoundingBox", "Centroid"}];
texts = TextRecognize@ImageTrim[straight, #] & /@ measurements[[All, 2, 1]];
Cases[Thread[measurements[[All, 2, 2]] -> texts], (_ -> t_) /; StringLength[t] > 0] // TableForm
1 голос
/ 10 ноября 2011

Я работал над подобным проектом один раз, и, поскольку я долгое время пользовался OpenCV , я снова использовал его. OpenCV - это популярная кроссплатформенная библиотека компьютерного зрения , которая предлагает программные интерфейсы для C и C ++.

Я нашел интересный блог, в котором была запись на , как определять угол перекоса текста с помощью OpenCV, а затем на , как на столе .

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

Я не знаюесли вы несете ответственность за процедуру получения изображения, но если это так, возможно, вы захотите взглянуть на то, как выполнить калибровку камеры с помощью OpenCV , чтобы исправить искажение изображения, вызванное некоторыми объективами камеры.

1 голос
/ 09 октября 2011

Бумага, которую мы используем для определения угла перекоса: Обнаружение перекоса и определение положения строки текста в оцифрованных документах по Gatos et.и др.Единственным ограничением этой бумаги является то, что она может обнаруживать перекос до -5 и +5 градусов.После этого нам нужно что-то ударить пользователя с сообщением!:)

В вашем случае, когда в первую очередь выполняется сканирование счетов-фактур, вы можете красиво использовать: Многоуровневый анализ при извлечении контрольных линий из документов с серым фоном от Tag et.al.

Мы написали код в MATLAB, если вам нужна помощь, дайте мне знать!

...