tesseract вообще не точен, даже с конфигом

Мой код ⠀

for index, img in enumerate(data): # data is list of base64 decoded strings
    b64 = base64.b64decode(bytes(img[22:], encoding='utf-8'))
    raw = BytesIO(b64)
    im = Image.open(raw).convert('LA')
    pixels = im.load()
    width, height = im.size
    for x in range(width):
        for y in range(height):
            if pixels[x, y][0] > 100: pixels[x, y] = (255, 255)
            else: pixels[x, y] = (0, 255)
    print(pytesseract.image_to_string(im, config='tessedit_char_whitelist=1234567890plus?'))

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

Вывод:
Te Ys
⠀ Что я могу сделать, чтобы сделать это лучше, я пытался использовать каждый psm от 0 до 13 и флаг -c в ключе конфигурации ⠀ ⠀


person Ozballer31    schedule 11.08.2020    source источник
comment
можно попробовать инвертировать изображение? это лучше всего работает для черных букв на белом фоне   -  person Marat    schedule 11.08.2020
comment
Отвечает ли это на ваш вопрос? функция pytesseract image_to_string не совсем точна   -  person D. S.    schedule 12.08.2020


Ответы (1)


Вам нужно инвертировать изображение. Тогда будет точно.

import pytesseract
import cv2

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

image = cv2.imread('addition.png', 0)
image = 255 - image

for psm in range(6,13+1):
    config = '--oem 3 --psm %d' % psm
    txt = pytesseract.image_to_string(image, config = config, lang='eng')
    print('psm ', psm, ':',txt)

что дает хорошие результаты для всех значений psm

psm  6 : 18 plus 16?
psm  7 : 18 plus 16?
psm  8 : 18 plus 16?
psm  9 : 18 plus 16?
psm  10 : 18 plus 16?
psm  11 : 18 plus 16?
psm  12 : 18 plus 16?
psm  13 : 18 plus 16?
person bfris    schedule 13.08.2020