Как использовать API Tesseract для итерации по словам?
Я пытаюсь изучать Python параллельно с Tesseract API. Моя конечная цель - узнать, как использовать API Tesseract, чтобы иметь возможность читать документ и выполнять базовую проверку ошибок. Я нашел несколько примеров, которые кажутся хорошими для начала, но у меня возникают проблемы с пониманием разницы между двумя частями кода, которые, хотя и отличаются по поведению, кажутся мне эквивалентными. Они оба были слегка измененыhttps://pypi.python.org/pypi/tesserocr .
Первый пример производит этот вывод:
$ time ./GetComponentImagesExample2.py|tail -2
symbol MISSISSIPPI,conf: 88.3686599731
real 0m14.227s
user 0m13.534s
sys 0m0.397s
Это точно и завершается за 14 секунд. Рассматривая остальную часть вывода, это довольно хорошо - я, вероятно, несколько команд SetVariable от точности 99 +%.
$ ./GetComponentImagesExample2.py|wc -l
1289
Вручную просматривая результаты, кажется, получается весь текст.
#!/usr/bin/python
from PIL import Image
Image.MAX_IMAGE_PIXELS=1000000000
from tesserocr import PyTessBaseAPI, RIL, iterate_level
image = Image.open('/Users/chrysrobyn/tess-install/tesseract/scan_2_new.tif')
with PyTessBaseAPI() as api:
api.SetImage(image)
api.Recognize()
api.SetVariable("save_blob_choices","T")
ri=api.GetIterator()
level=RIL.WORD
boxes = api.GetComponentImages(RIL.WORD, True)
print 'Found {} textline image components.'.format(len(boxes))
for r in iterate_level(ri, level):
symbol = r.GetUTF8Text(level)
conf = r.Confidence(level)
if symbol:
print u'symbol {},conf: {}\n'.format(symbol,conf).encode('utf-8')
Второй пример производит этот вывод.
$ time ./GetComponentImagesExample4.py|tail -4
symbol MISSISS IPPI
,conf: 85
real 0m17.524s
user 0m16.600s
sys 0m0.427s
Это менее точно (дополнительный пробел обнаружен в слове) и медленнее (занимает 17,5 секунд).
$ ./GetComponentImagesExample4.py|wc -l
223
Этому очень не хватает большого количества текста, и я не понимаю, почему он пропускает некоторые вещи.
#!/usr/bin/python
from PIL import Image
Image.MAX_IMAGE_PIXELS=1000000000
from tesserocr import PyTessBaseAPI, RIL
image = Image.open('/Users/chrysrobyn/tess-install/tesseract/scan_2_new.tif')
with PyTessBaseAPI() as api:
api.SetImage(image)
api.Recognize()
api.SetVariable("save_blob_choices","T")
boxes = api.GetComponentImages(RIL.WORD, True)
print 'Found {} textword image components.'.format(len(boxes))
for i, (im, box, _, _) in enumerate(boxes):
api.SetRectangle(box['x'], box['y'], box['w'], box['h'])
ocrResult = api.GetUTF8Text()
conf = api.MeanTextConf()
if ocrResult:
print u'symbol {},conf: {}\n'.format(ocrResult,conf).encode('utf-8')
# print (u"Box[{0}]: x={x}, y={y}, w={w}, h={h}, "
# "confidence: {1}, text: {2}").format(i, conf, ocrResult, **box).encode('utf-8')
Моя конечная цель заключается в понимании того, где текст находится в документе, поэтому мне нужны ограничивающие рамки, как во втором примере. Насколько я могу судить, iterate_level не отображает координаты найденного текста, поэтому мне нужен GetComponentImages ... но вывод не эквивалентен.
Почему эти части кода ведут себя по-разному в скорости и точности? Могу ли я получить GetComponentImages в соответствии с GetIterator?