Функция Tesseract для разделения на 2 столбца

#ocr #tesseract #python-tesseract

#ocr #тессеракт #python-tesseract

Вопрос:

Я хотел бы использовать PyTesseract и OpenCV для чтения (сотен) страниц информации, подобной следующей, в формате JSON или CSV. Как я могу сообщить tesseract о сплошной линии посередине, разделяющей два столбца информации? Кроме того, некоторые строки данных состоят из 2 строк вместо 1. Каков наилучший способ объяснить это?

Я довольно новичок в использовании тессеракта, и любая помощь будет оценена!

введите описание изображения здесь


Редактировать!!

Это то, что у меня есть сейчас:

 # OCR
txt = pytesseract.image_to_string(thr, config="--psm 11")

# Add ocr to the corresponding part
txt = txt.split("n")

row = 0
col = 0

for txt1 in txt:

    # Skip over OCR strings that are just spaces or ''
    if txt1.isspace() or txt1 == '':
        continue

    # Hard code detection in...let's just place it into the last column for now
    # Theoretically, the state ("Alaska" in this case) will be in column 0 in the same row
    if re.match(r"d*sOpensRestaurants", txt1):
        col == 3
        
    worksheet.write(row//4, col%4, txt1)
    col  = 1
    row  = 1

workbook.close()
 

Все, что находится над этим фрагментом кода, идентично.

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

Я подумал, что, возможно, я мог бы обеспечить, чтобы каждый четвертый текст располагался в алфавитном порядке, и использовать это для обнаружения смещения? Но если даже первая строка неверна, я не уверен, насколько сильно я хочу вносить жесткие исправления в код. Кроме того, иногда многострочные записи возникают из столбца адреса, в то время как в других случаях они возникают из столбца названия (например, 258 Interstate Commercial Park Loop в левой части страницы).

Вот несколько скриншотов путаницы слева: введите описание изображения здесь

И справа:

введите описание изображения здесь

Ответ №1:

  • Я хотел бы использовать PyTesseract и OpenCV для чтения (сотен) страниц информации, подобной следующей, в формате JSON или CSV.

У вас есть несколько вариантов, xlswriter, pandas и т. Д. Например, вы можете посмотреть учебник для xlswriter .

  • Как я могу сообщить tesseract о сплошной линии посередине, разделяющей два столбца информации?

Вы не можете. Вам нужно вручную разделить изображение по ширине на две части. Например: первая часть, вторая часть

Как вручную разделить изображение по ширине?

Сначала получите размер изображения, затем задайте индексы.

 # Get the size
(h, w) = img.shape[:2]

# First part
first_part = img[0:h, 0:int(w/2)]

# Second part
second_part = img[0:h, int(w/2):w]
 
  • Кроме того, некоторые строки данных состоят из 2 строк вместо 1. Каков наилучший способ объяснить это?

Tesseract учтет это, но вам нужно знать следующее:


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

Часть-1 Часть — 2
введите описание изображения здесь введите описание изображения здесь
Northpor. 13620 Шоссе 43 Северный Хардиккумар Патель (205) 339-1188
Северный порт 1836 Макфаленд Блд Хариккумар Патель {205} 339-1782
Северный порт 5550 Макфарланд Блд Шармишта Патель (205) 200-7822
Оденвиле 130 Муниципальный Орив Граттон Кербоу (205) 629-7827
Онеонта 511-я авеню Говиндхай Патель ( 205) 625,5847

velxa 1017 Columbus Parkway Луис Крибб (934) 749-3628

alka 2300 Gateway или Donna Cribb (234) 749-2308
стр. 101 Stewart Ave ‘Utpa! Patel {334} 433-7325,
Оранж-Бич 25755, Пердидо-Бич, округ Колумбия. Патрик Шедд (251) 981-6881
Оранж Бич 25814 Канал Рд Патрик Шедд (251) 91-4184
Перекресток Оуэнс 6707 шоссе 43) Юг Ричард Хайд (256) 519-2425
Владеет Гросс-роуд 330 Саттон-роуд Ричард Хайд (256) 518-2004
. . .
. . .
. . .

Талладега 244 Хейнс СИ тус Крисп (258} 315-0191
Талладега 608 Ист Батле Стрит Луис Крибб (256) 362-0781
Таласси 454 Гимере авеню Донна Крибб (334) 283-2067
Таннер 5956 шоссе 31 Н Майк Надеси (256) 352-9808
Торани 1806 Пиньон Вэлли Ре Санджайкнат Патель (205) 849-0112
Теодор 5827 шоссе СОУ Мукешкумар Сопарвала (251) 854-0048,
Теодор 6860 Теодор Доуз Рд Энтони Лаф Эниер (251) 853-2010
Тамасвили 33202 Шоссе 43 Ранджив Ачарья (334) 636-0333
Томасвилл 3430-е Шоссе 43 Ранджей Ачарья (334) 636-0830
Тиус 80 Тус Роуд Гаррет Грей (G34) 514-9930
Таун-Крик 2795 шоссе 20 Мадхав Майна (256) 686-3900
Трой 1003 Шоссе 231 Саут Луис Крибб (339) 568-7944
Трой 1420 США 231 Саут Дехуа Патель (334) 670-6390
. . .
. . .
. . .

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

Как вы записываете результат?


  • Во-первых, вам нужно сохранить результаты распознавания в списках.
    •  if i == 0:
          for sentence in txt:
              part1.append(sentence)
      else:
          for sentence in txt:
              part2.append(sentence)
       
  • Во-вторых, вам нужно связать кортежи списка.
    •  for txt1, txt2 in zip(part1, part2):
          worksheet.write(row, col, txt1)
          worksheet.write(row, col   1, txt2)
          row  = 1
       

функция zip позволяет нам получать пару данных из каждого столбца в каждом итераторе. Затем мы записываем значения в соответствующие столбцы.

Некоторые данные в Excel могут быть неточными. Если это так, то вам нужно попробовать изображение с различными методами обработки с различными режимами сегментации страницы.


Код:

 # Load the libraries
import cv2
import pytesseract
import xlsxwriter

# Load the image in BGR format
img = cv2.imread("WFJO2.jpg")

# Initialize the workbook
workbook = xlsxwriter.Workbook('result.xlsx')
worksheet = workbook.add_worksheet()

row = 0
col = 0

part1 = []
part2 = []

# Get the size
(h, w) = img.shape[:2]

# Initialize indexes
increase = int(w / 2)
start = 0
end = start   increase

# For each part
for i in range(0, 2):

    # Get the current part
    cropped = img[0:h, start:end]

    # Convert to the gray-scale
    gry = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY)

    # Threshold
    thr = cv2.threshold(gry, 0, 255, cv2.THRESH_BINARY   cv2.THRESH_OTSU)[1]

    # OCR
    txt = pytesseract.image_to_string(thr, config="--psm 6")

    # Add ocr to the corresponding part
    txt = txt.split("n")

    if i == 0:
        for sentence in txt:
            part1.append(sentence)
    else:
        for sentence in txt:
            part2.append(sentence)

    # Set indexes
    start = end
    end = start   increase

for txt1, txt2 in zip(part1, part2):
    worksheet.write(row, col, txt1)
    worksheet.write(row, col   1, txt2)
    row  = 1

workbook.close()
 

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

1. Есть ли способ вставить (подразумеваемые) столбцы города, адреса, имени и номера телефона в 4 разных столбца в рабочей книге? Аналогично, есть ли способ сообщить pytesseract об этих подразумеваемых столбцах? Это могло бы улучшить транскрипцию.

2. Кроме того, можем ли мы отличить строки, указывающие на новое состояние, от других строк, указывающих на каждый отдельный ресторан? Например. «Аляска 61 Открытый ресторан» на правой картинке.

3. Я думаю, вы могли бы это сделать, где вы застряли?

4. Я обновил свою первоначальную проблему, включив в нее код, который я изменил, и некоторые скриншоты / описания проблем, с которыми я столкнулся. Заранее большое вам спасибо!

5. Любая помощь в этом была бы весьма признательна!