使用PyTesseract读取数字

时间:2020-07-17 12:22:11

标签: python opencv image-processing python-tesseract

我正在尝试从图像中读取数字,但是找不到找到使其始终如一地工作的方法(并非所有图像都有数字)。这些是图像:

example 1 example 2 example 3 example 4 example 5

(如果图片不起作用,这是相册的链接)

这是我用来在图像上运行tesseract的命令: pytesseract.image_to_string(image,timeout = 2,config ='-psm 13 -oem 3 -c tessedit_char_whitelist = 0123456789')< / strong>。我尝试了多种配置,但这似乎效果最好。

就预处理而言,这是最好的:

    gray = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2GRAY)
    gray = cv2.bilateralFilter(gray, 11, 17, 17)
    im_bw = cv2.threshold(gray, thresh, 255, cv2.THRESH_BINARY_INV)[1]

此功能适用于除第三个图像以外的所有图像。为了解决第3张图像中的线条问题,我尝试使用 cv2.Canny 和相当大的阈值来获取边缘,但该阈值可以正常工作,但是即使将其绘制得超过95%,每个数字的边缘,tesseract无法正确读取它们。

我还尝试过使用 cv2.morphologyEx 调整图像的大小,模糊图像等。我无法找到一种方法来使它适用于每种情况。

谢谢。

1 个答案:

答案 0 :(得分:0)

cv2.resize一直为我INTER_CUBIC插值工作。

在预处理中添加最后一步很可能会解决您的问题。

im_bw_scaled = cv2.resize(im_bw, (0, 0), fx=4, fy=4, interpolation=cv2.INTER_CUBIC)

您可以试一下音阶。我在上面使用了“ 4”。

编辑:

以下代码可以很好地处理您的图像,即使是特殊字符也是如此。请尝试使用您的其余数据集。结垢,OTSU和侵蚀是最好的组合。

import cv2
import numpy
import pytesseract

pytesseract.pytesseract.tesseract_cmd = "<path to tesseract.exe>"

# Page segmentation mode, PSM was changed to 6 since each page is a single uniform text block.
custom_config = r'--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789'

# load the image as grayscale
img = cv2.imread("5.png",cv2.IMREAD_GRAYSCALE)

# Change all pixels to black, if they aren't white already (since all characters were white)
img[img != 255] = 0

# Scale it 10x
scaled = cv2.resize(img, (0,0), fx=10, fy=10, interpolation = cv2.INTER_CUBIC)

# Retained your bilateral filter
filtered = cv2.bilateralFilter(scaled, 11, 17, 17)

# Thresholded OTSU method
thresh = cv2.threshold(filtered, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

# Erode the image to bulk it up for tesseract
kernel = numpy.ones((5,5),numpy.uint8)
eroded = cv2.erode(thresh, kernel, iterations = 2)

pre_processed = eroded

# Feed the pre-processed image to tesseract and print the output.
ocr_text = pytesseract.image_to_string(pre_processed, config=custom_config)
if len(ocr_text) != 0:
    print(ocr_text)
else: print("No string detected")