tesseract无法准确读取所有数字

时间:2017-07-14 08:49:40

标签: opencv image-processing ocr tesseract

我正在使用Tesseract来识别使用手机摄像头拍摄的屏幕图像中的数字。我已对图像进行了一些预处理:processed image,并使用Tesseract,我能够获得一些混合结果。在上面的图像上使用以下代码,我得到以下输出:“EOE”。但是,使用此图片processed image,我得到完全匹配:“39:45.8”

import cv2
import pytesseract
from PIL import Image, ImageEnhance
from matplotlib import pyplot as plt

orig_name  = "time3.jpg";
image_name = "time3_.jpg";

img = cv2.imread(orig_name, 0)
img = cv2.medianBlur(img, 5)

img_th = cv2.adaptiveThreshold(img, 255,\
    cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)

cv2.imshow('image', img_th)
cv2.waitKey(0)
cv2.imwrite(image_name, img_th)

im = Image.open(image_name)

time = pytesseract.image_to_string(im, config = "-psm 7")
print(time)

我能做些什么来获得更一致的结果吗?

1 个答案:

答案 0 :(得分:2)

为了使第一张图片更正确,我还做了三件事。

  1. 您可以为Tesseract设置白名单。在你的情况下,我们知道 此列表中只有字符 01234567890.: 。这个 显着提高了准确度。

  2. 我调整了图片的大小,以便更轻松地使用tesseract。

  3. 我从psm模式7切换到11(尽可能地Recoginze)
  4. <强>代码:

    import cv2
    import pytesseract
    from PIL import Image, ImageEnhance
    
    orig_name  = "./time1.jpg";
    img = cv2.imread(orig_name)
    
    height, width, channels = img.shape
    imgResized = cv2.resize(img, ( width*3, height*3))
    cv2.imshow("img",imgResized)
    cv2.waitKey()
    im = Image.fromarray(imgResized)
    time = pytesseract.image_to_string(im, config ='--tessdata-dir "/home/rvq/github/tesseract/tessdata/" -c tessedit_char_whitelist=01234567890.: -psm 11 -oem 0')
    print(time)
    

    注意: 您可以使用Image.fromarray(imgResized)将opencv图像转换为PIL图像。您不必写入磁盘并再次读取它。