pytesseract fail to recognise digits from image

余生长醉 提交于 2020-05-11 04:36:45

问题


I've this python code which i use to convert a text written in a picture to a string, it does work for certain images whom have large characters, but not for the one i'm trying right now which contains only digits.

There is my code:

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)

Why is it failing recognising this specific image and how can i solve this problem ? thank you.

There is the picture:


回答1:


I have two suggestions.

First, and this is by far the most important, in OCR preprocessing images is key to obtaining good results. In your case I suggest binarization. Your images look extremely good so you shouldn't have any problem but if you do, then maybe you should try to binarize your images:

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)

And then try the ocr again with the binarized image.

Check if your image is in grayscale and uncomment if needed.

This is simple thresholding. Adaptive thresholding also exists but it is noisy and does not bring anything in your case.

Binarized images will be much easier for Tesseract to handle. This is already done internally (https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality) but sometimes things can be messed up and very often it's useful to do your own preprocessing.

You can check if the threshold value is right by looking at the images :

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

Second, if what I said above still doesn't work, I know this doesn't answer "why doesn't pytesseract work here" but I suggest you try out tesserocr. It is a maintained python wrapper for Tesseract.

You could try:

import tesserocr
text_from_ocr = tesserocr.image_to_text(pil_img)

Here is the doc for tesserocr from pypi : https://pypi.org/project/tesserocr/

And for opencv : https://pypi.org/project/opencv-python/

As a side-note, black and white is treated symetrically in Tesseract so having white digits on a black background is not a problem.



来源:https://stackoverflow.com/questions/55994807/pytesseract-fail-to-recognise-digits-from-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!