Как сохранить все пробелы на изображении при извлечении текста с помощью tesseract-4.0? - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над извлечением табличного текста из изображений с использованием tesseract-ocr 4.0 и экспортирую результаты в excel, сохраняя выравнивание данных.

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

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

Есть ли способ обнаружить или сохранить все пустые места в таблице при извлечении с использованием OCR? Или есть какой-то метод обнаружения пустых пространств с использованием измерения расстояния в таблице?

Прикрепление изображения к нему:

enter image description here

1 Ответ

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

Я думаю, вам следует обновить ваш tesseract до версии 5 и использовать "- c preserve_interword_spaces = 1" для сохранения пробелов. Но, возможно, вы должны выполнить постобработку, потому что результат может не соответствовать вашим ожиданиям.

EDITED

Ваш вопрос похож на this . Но так как я не могу использовать его напрямую, я немного изменил его. Кредит идет на игрини.

import cv2
import pytesseract
from pytesseract import Output
import pandas as pd

img = cv2.imread("bsShN.jpg", cv2.COLOR_BGR2GRAY)
gauss = cv2.GaussianBlur(img, (3, 3), 0)

custom_config = r' -l eng --oem 1 --psm 6  -c preserve_interword_spaces=1 -c tessedit_char_whitelist="0123456789- " '
d = pytesseract.image_to_data(gauss, config=custom_config, output_type=Output.DICT)
df = pd.DataFrame(d)

# clean up blanks
df1 = df[(df.conf != '-1') & (df.text != ' ') & (df.text != '')]

# sort blocks vertically
sorted_blocks = df1.groupby('block_num').first().sort_values('top').index.tolist()
for block in sorted_blocks:
    curr = df1[df1['block_num'] == block]
    sel = curr[curr.text.str.len() > 3]
    char_w = (sel.width / sel.text.str.len()).mean()
    prev_par, prev_line, prev_left = 0, 0, 0
    text = ''
    for ix, ln in curr.iterrows():
        # add new line when necessary
        if prev_par != ln['par_num']:
            text += '\n'
            prev_par = ln['par_num']
            prev_line = ln['line_num']
            prev_left = 0
        elif prev_line != ln['line_num']:
            text += '\n'
            prev_line = ln['line_num']
            prev_left = 0

        added = 0  # num of spaces that should be added
        if ln['left'] / char_w > prev_left + 1:
            added = int((ln['left']) / char_w) - prev_left
            text += ' ' * added
        text += ln['text'] + ' '
        prev_left += len(ln['text']) + added + 1
    text += '\n'
    print(text)

Вот вывод. Не все цифры распознаются правильно. Пробелы также должны быть исправлены в некоторых местах.

  56     0   232                  35                                    197    19363 
   0     3    22                  10                                     12     1586 
  60  200    165                   0                                    165    11626 
  44  345     69     50    610    75                                     54     7593 
  52  789    191    480    96    618                                    149     6324 
  84    71    34     50    8610   20                                     74     4837 
  77    680- 131                  61                      1              71     3000 
  11     6   103                   0                                    103     9932 
   2    52    29                   3                                     26     4451 
  12    65    23                   4                                     19     1626 
  24    62          100           10                              -1     90     6621 
497   897     63    360          292        100     0                    31     3056 
863  1285    331     50          197         50     0                   134    17037 
   0     5    24                   2                                     22     3159 
  15   131   144                  47                                     97    15070 
  44    61    86     44     4    112                                     22     1320 
  10    90    85     50          135                                      0        0 
   3     8    54                  11                              -9     43     2334
...