Pytesseract с пользовательским шрифтом неправильно классифицирует числа - PullRequest
2 голосов
/ 11 февраля 2020

Я пытаюсь определить цены с помощью pytesseract.

Однако у меня очень плохие результаты.

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

Я знаю, что текст будет содержать только 0123456789 $ ¢.

Я тренировал свой новый шрифт с помощью trainyourtesseract.com.

Например, я беру это изображение.

sdf

Удвойте его размер и пороговое значение, чтобы получить его.

sdf

Запустите его через tesseract и получите вывод 8.

Любая помощь приветствуется.

def getnumber(self, img):
   grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   thresh, grey = cv2.threshold(grey, 50, 255, cv2.THRESH_BINARY_INV)

   filename = "{}.png".format(os.getpid())
   cv2.imwrite(filename, grey)

   text = pytesseract.image_to_string(Image.open(filename), lang='Droid',
                                      config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789.$¢')
   os.remove(filename)
   return(text)

1 Ответ

0 голосов
/ 11 февраля 2020

Вы на правильном пути. При предварительной обработке изображения для оптического распознавания текста вы хотите получить черный текст с белым фоном. Идея состоит в том, чтобы увеличить изображение, порог Оцу, чтобы получить двоичное изображение, а затем выполнить OCR. Мы используем --psm 6, чтобы сказать Pytesseract, чтобы он принимал один единый блок текста. Посмотрите здесь для получения дополнительных параметров конфигурации. Вот обработанное изображение:

enter image description here

Результат от распознавания:

Код

import cv2
import pytesseract
import imutils

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

# Resize, grayscale, Otsu's threshold
image = cv2.imread('1.png')
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Perform text extraction
data = pytesseract.image_to_string(thresh, lang='eng',config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imwrite('thresh.png', thresh)
cv2.waitKey()

Машина характеристики:

Windows 10
opencv-python==4.2.0.32
pytesseract==0.2.7
numpy==1.14.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...