Pytesseract (Tesseract OCR) 没有收到一些数字

Posted

技术标签:

【中文标题】Pytesseract (Tesseract OCR) 没有收到一些数字【英文标题】:Pytesseract (Tesseract OCR) not picking up some numbers 【发布时间】:2021-12-12 22:13:56 【问题描述】:

我一直在开发一个使用光学字符识别来读取财务报表的程序,但在我的一生中,我无法弄清楚为什么我使用的开源模块仍然无法读取某些数字。

我创建了一个输出文件,其中在检测到文本的原始输入周围带有绿色框。在这种情况下,“381”的行被拾取,但下面的行(具有相同的确切格式)被忽略。

我在提取数据之前使用此代码对图像进行预处理,因为之前的缺失率高达 20%,现在接近 5%。

img = cv2.imread(filename)
img = cv2.resize(img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((1, 1), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)

在此预处理之后,我还运行了一个算法以从文档中删除超过一定大小的实线,但在这种情况下,原始文件中没有“35”或“381”下划线,所以我怀疑这是导致问题的原因。我还验证了线检测算法没有删除 5 的顶部。

我不是 OCR 或 CV 方面的专家,我的专长是更多的数据和通用编程——我真的只需要让这个库完成它所宣传的工作,这样我就可以继续前进并完成程序.有谁知道可能是什么导致了这个问题?

【问题讨论】:

【参考方案1】:

我建议考虑将您的配置设置为特定的页面分段方法 (PSM),例如 11,因为您正在寻找稀疏文本。例如,我的代码有:

results = pytesseract.image_to_data(Image.open(tempFile), lang='eng', config='--psm 11', output_type=Output.DICT)       

PSM 如下:

  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.
 11    Sparse text. Find as much text as possible in no particular order.
 12    Sparse text with OSD.
 13    Raw line. Treat the image as a single text line,
                        bypassing hacks that are Tesseract-specific.

还有一种通过数字而不是文本搜索的方法也可能有所帮助。

【讨论】:

谢谢!它立即解决了我最初的问题,但是,在进一步检查时更改该参数导致了一个新问题,即“顶部”值不再准确。不确定我是否可以解决这个问题,因为确定数字所在的行对于程序的其余部分如何运行至关重要。一个例子是一个最初是 1393 的数字现在是 1376,并且在财务报表上被分组到错误的行中。有什么想法吗? 跟进想法:我总是可以使用默认设置来获取“顶部”值(页面上的垂直位置)并运行 psm=11 然后将数据集连接在一起,但这不会是理想的,因为它会使程序运行所需的时间增加一倍以上...... 你试过模糊你的图像吗?这可能有助于 PyTesseract 的准确性 我使用 cv2 库来应用一些模糊,如下所示:“cv2.GaussianBlur(thresh, (3,3), 0)" 有趣的是,即使看起来 PyTesseract 会更难使用模糊的图像,它证明了更好的结果 我过去曾尝试过模糊和阈值化,但我认为这会导致 OCR 将数字误认为字母的问题。实际上,我想我已经弄清楚了这个问题——它似乎只会在上面的线上有一个破折号(财务报表上的破折号表示零)时才搞砸最高价值。当我删除破折号并仅推断空白为零时,顶部值会自行修复。很奇怪....PyTesseract 必须将破折号与其下方的数字组合在一起,而不是将其识别为它自己的单独值。

以上是关于Pytesseract (Tesseract OCR) 没有收到一些数字的主要内容,如果未能解决你的问题,请参考以下文章

OCR引擎Tesseract以及pytesseract详解及实例

tesseract-OCR + pytesseract安装

没有这样的文件或目录:'tesseract': 'tesseract' 即使在 pytesseract.py 中指定了在哪里可以找到 tesseract

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your P

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your p

解决pytesseract.pytesseract.TesseractError: (1, ‘Error opening data file C:\Program Files\Tesseract-(代