Вот что я мог бы улучшить, используя отсу-порог более эффективно отделять текст от фона, чем давать произвольное значение.Тессеракт лучше работает с черным текстом на белом фоне, и я также добавил отступы, так как тессеракт пытается распознать символы, если они находятся слишком близко к границе.
Это окончательное изображение final_image и pytesseractудалось прочитать "46"
def getNumber(image):
img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Otsu Tresholding automatically find best threshold value
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# invert the image if the text is white and background is black
count_white = numpy.sum(binary_image > 0)
count_black = numpy.sum(binary_image == 0)
if count_black > count_white:
binary_image = 255 - binary_image
# padding
final_image = cv2.copyMakeBorder(image, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=(255, 255, 255))
txt = pytesseract.image_to_string(
final_image, config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789')
return txt
РЕДАКТИРОВАТЬ: обратите внимание, что вам не нужна эта строка:
image_final = PIL.Image.fromarray(image_bin)
, так как вы можете передать pytesseractr изображение в формате массива numpy (который cv2использовать), а точность Тессеракта падает только для символов до 35 пикселей (а также больше, высота 35px на самом деле является оптимальной высотой), поэтому я не изменил ее размер.