Pytesseract не может распознать цифры с изображения - PullRequest
10 голосов
/ 05 мая 2019

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

Вот мой код:

from PIL import Image


img = Image.open('img.png')
pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract'
result = pytesseract.image_to_string(img)
print (result)

Почему не удается распознать этот конкретный образ и как я могу решить эту проблему? спасибо.

есть картинка:

enter image description here

1 Ответ

6 голосов
/ 09 мая 2019

У меня есть два предложения.

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

import cv2
from PIL import Image

img = cv2.imread('gradient.png')
# If your image is not already grayscale :
# img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
threshold = 180 # to be determined
_, img_binarized = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)
pil_img = Image.fromarray(img_binarized)

А затем снова попробуйте ocr с бинаризованным изображением.

Проверьте, не находится ли ваше изображение в градациях серого, и при необходимости удалите комментарий.

Это простой порог. Адаптивный порог также существует, но он шумный и ничего не приносит в вашем случае.

Бинаризованные изображения будут намного проще для Тессеракта обрабатывать. Это уже сделано внутренне (https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality), но иногда вещи могут быть испорчены, и очень часто полезно выполнить собственную предварительную обработку.

Вы можете проверить правильность порогового значения, посмотрев на изображения:

import matplotlib.pyplot as plt
plt.imshow(img, cmap='gray')
plt.imshow(img_binarized, cmap='gray')

Во-вторых, если то, что я сказал выше, все еще не работает, я знаю, что это не отвечает "почему здесь не работает pytesseract", но я предлагаю вам попробовать tesserocr. Это поддерживаемая оболочка Python для Tesseract.

Вы можете попробовать:

import tesserocr
text_from_ocr = tesserocr.image_to_text(pil_img)

Вот документация для tesserocr от pypi: https://pypi.org/project/tesserocr/

А для opencv: https://pypi.org/project/opencv-python/

В качестве примечания к черному и белому в Тессеракте применяется симметричное отношение, поэтому наличие белых цифр на черном фоне не является проблемой.

...