使用Pytesseract OCR从表格图像中识别特定数字

3

我想从一个附加的图片(png文件)中读取一列数字。

点击查看图片

我的代码是:

import cv2
import pytesseract
import os

img = cv2.imread(os.path.join(image_path, image_name), 0)
config= "-c 
        tessedit_char_whitelist=01234567890.:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

pytesseract.image_to_string(img, config=config)

这段代码输出字符串:'n113\nun\n1.08'。我们可以看出,有两个问题:
  1. 它无法识别1.13中的小数点(参见附图)。
  2. 它完全无法读取1.11(参见附图)。它只返回“nun”。
这些问题的解决方案是什么?
最好的祝愿
1个回答

1
你需要预处理图像。一个简单的方法是调整图像大小,转换为灰度,并使用Otsu阈值获得二进制图像。从这里开始,我们可以应用轻微的高斯模糊,然后反转图像,使所需提取的文本为白色,背景为黑色。这是经过处理的图像,准备好进行OCR。

OCR的结果

1.13
1.11
1.08

代码

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=400)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Blur and perform text extraction
thresh = 255 - cv2.GaussianBlur(thresh, (5,5), 0)
data = pytesseract.image_to_string(thresh, lang='eng',config='--psm 6')
print(data)

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

只是想知道 (1) 为什么您必须调整图像大小,使其宽度=400?(2) 为什么您将GaussianBlur中的ksize参数设置为(5, 5)? - MollyBFL
图像被放大以帮助OCR处理,图像放大的量是任意的。高斯模糊核设为(5,5)以帮助平滑图像并在阈值化之前去除微小的点。这只是典型的核大小。其他可行的大小有(3,3)(7,7),这取决于图像和存在噪声的数量。 - nathancy

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