Tesseract无法准确识别所有数字

3
我正在使用Tesseract来识别使用手机相机拍摄的屏幕图片中的数字。我对图片进行了一些预处理:处理后的图片,并且使用Tesseract,我能够得到一些混合的结果。在上面的图片上运行以下代码,我得到以下输出:"EOE"。然而,在这张图片处理后的图片中,我得到了完全匹配的结果:"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)

有什么方法可以获得更加一致的结果吗?

您可以运行连通组件分析,然后对于每个组件运行检测。 - Amitay Nachmani
1个回答

3

我为了让第一张图片正确,做了三件事情。

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

  2. 我调整了图像大小,以便更容易地使用Tesseract。

  3. 我从psm模式7切换到11(尽可能多地识别)

代码:

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图像。您不必将其写入磁盘并再次读取。


我尝试了你建议的方法,确实提高了数字识别的准确性,但我想澄清一下,你是否完整读取了第一张图片。通过你的额外修改,我得到了第一张图片的“2408”和第二张图片的“39 458”。似乎缺少了冒号和句点。我需要包括--tessdata-dir选项吗? - Eric Chuu
尝试使用tessdata选项是否效果更好。您需要将oem模式设置为0。白名单对于tesseract lstm模式(4.0)无效。 - TruckerCat
我已经包含了你建议的所有选项:time = pytesseract.image_to_string(im, config ='--tessdata-dir "/usr/share/tesseract-ocr/tessdata/" -c tessedit_char_whitelist=01234567890.: -psm 11 -oem 0'),但是对于第一张和第二张图片,我仍然得到了"2408"和"39 458"。你还有其他建议吗?也许需要对图像进行更多的预处理?提前感谢! - Eric Chuu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接