Я решил проблему с помощью opencv
и pytesseract
. Мое решение было вдохновлено этим ответом .
Ключом к этой процедуре является наличие хорошо предварительно обработанных изображений. На изображении исходного вопроса вы можете увидеть небольшое пятно черного пикселя непосредственно перед последним столбцом справа. Эти пятна должны быть очищены! Поскольку у меня было только несколько таблиц с этой проблемой, я использовал GIMP.
Обнаружение столбцов в таблице, применяя шаг расширения к инвертированному серому изображению. При выборе подходящего количества итераций столбцы приобретают форму, и также можно выделить знаки минуса.
с помощью cv2.boundingRect(cnt)
можно обрезать отдельные столбцы и сохранять их на диск.
Применить pytesseract
к различным столбцам с одинаковыми параметрами как в исходном вопросе.
Чтобы обнаружить знаки минуса: мне повезло, что только 4-й и 6-й столбцы представляли знаки минус, а в моих таблицах было ровно 25 строк (следовательно, высота каждой строки = высота изображения / 25). Итак, возьмите эти столбцы, обрежьте столбец, чтобы иметь ширину, скажем, 40px (это предположение, основанное на методе проб и ошибок). У урожая теперь должно быть несколько белых прямоугольников, где расположены знаки минус. Определите контуры этих прямоугольников. Вычислить центр тяжести каждого контура. Y-координата центроида используется для определения номера строки, в которой находится знак минус. Примените исправления (при необходимости) к результатам распознавания.
Объедините различные столбцы в файл CSV.
РЕДАКТИРОВАТЬ: с помощью этой процедуры I получил точность около 98,5%.