Следующий прототип в Mathematica находит координаты блоков текста и выполняет OCR внутри каждого блока. Возможно, вам придется адаптировать значения параметров в соответствии с размерами ваших реальных изображений. Я не рассматриваю часть вопроса машинного обучения; возможно, вам даже не понадобится это приложение.
Импортируйте рисунок, создайте двоичную маску для напечатанных частей и увеличьте эти части, используя горизонтальное закрытие (расширение и эрозия).
Запросите ориентацию каждого BLOB-объекта, сгруппируйте ориентации и определите общий поворот, усредняя ориентации самого большого кластера.
Используйте предыдущий угол для выпрямления изображения. В это время OCR возможен, но вы потеряете пространственную информацию для блоков текста, что сделает последующую обработку намного более сложной, чем это необходимо. Вместо этого найдите сгустки текста путем горизонтального закрытия.
Для каждого подключенного компонента запросите положение ограничительной рамки и положение центроида. Используйте ограничивающие рамки, чтобы извлечь соответствующий патч изображения и выполнить распознавание патча.
На данный момент у вас есть список строк и их пространственное положение. Это еще не 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