使用自定义字体的 Pytesseract 错误地对数字进行分类

Posted

技术标签:

【中文标题】使用自定义字体的 Pytesseract 错误地对数字进行分类【英文标题】:Pytesseract with custom font incorrectly classifying numbers 【发布时间】:2020-05-26 08:24:18 【问题描述】:

我正在尝试使用 pytesseract 检测价格。

但是我的结果很糟糕。

我有一张大图,其中包含不同位置的多个价格。 这些位置是恒定的,因此我将图像裁剪下来并将每个区域保存为新图像,然后尝试检测文本。

我知道文本将只包含 0123456789$¢。

我使用 trainyourtesseract.com 训练了我的新字体。

例如,我拍这张照片。

将它的大小加倍,并设置阈值以获得这个。

通过 tesseract 运行它并获得8 的输出。

任何帮助将不胜感激。

def getnumber(self, img):
   grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   thresh, grey = cv2.threshold(grey, 50, 255, cv2.THRESH_BINARY_INV)

   filename = ".png".format(os.getpid())
   cv2.imwrite(filename, grey)

   text = pytesseract.image_to_string(Image.open(filename), lang='Droid',
                                      config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789.$¢')
   os.remove(filename)
   return(text)

【问题讨论】:

【参考方案1】:

你在正确的轨道上。在为 OCR 预处理图像时,您希望获得黑色文本和白色背景。这个想法是放大图像,Otsu的阈值得到二值图像,然后执行OCR。我们使用--psm 6 告诉 Pytesseract 假设一个统一的文本块。查看here 了解更多配置选项。这是处理后的图像:

OCR 的结果:

代码

import cv2
import pytesseract
import imutils

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Resize, grayscale, Otsu's threshold
image = cv2.imread('1.png')
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Perform text extraction
data = pytesseract.image_to_string(thresh, lang='eng',config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imwrite('thresh.png', thresh)
cv2.waitKey()

机器规格:

Windows 10
opencv-python==4.2.0.32
pytesseract==0.2.7
numpy==1.14.5

【讨论】:

非常感谢,现在看来可以了。 500 像素宽是一个很好的一般尺寸,还是只是您为这些图像选择的随机值? 它是一个随机值,主要是放大图像以提高检测。根据我的经验,至少大于300 像素是好的。它只是一个很好的一般尺寸 如果它对你有用 consider accepting the answer 让其他人知道你的问题已经解决:)

以上是关于使用自定义字体的 Pytesseract 错误地对数字进行分类的主要内容,如果未能解决你的问题,请参考以下文章

Next.js + Tailwind 中的自定义字体:没有错误,但字体错误

Fabric.js 一些自定义字体以非常小的尺寸和错误的字体呈现

CSS 自定义字体垂直偏移(错误?)

错误呈现自定义字体的 UILabel

带有自定义后退按钮字体的错误大标题动画

UILabel 在使用文本设置属性时显示自定义字体错误,但在代码中设置时工作正常