#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 учтет это, но вам нужно знать следующее:
Входное изображение не содержит артефакта. Поэтому на первый взгляд предварительная обработка изображений кажется ненужной. Тем не менее, вы можете применить бинаризацию, чтобы обеспечить максимальную точность.
Изображения масштабируются в соответствии с заданным размером. Как мы можем видеть, мы можем получить результат, предположив, что изображение представляет собой единый однородный блок текста.
Как вы записываете результат?
- Во-первых, вам нужно сохранить результаты распознавания в списках.
-
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. Любая помощь в этом была бы весьма признательна!