如何使用 Pytesseract 文本识别改进 OCR?
Posted
技术标签:
【中文标题】如何使用 Pytesseract 文本识别改进 OCR?【英文标题】:How to improve OCR with Pytesseract text recognition? 【发布时间】:2020-06-22 17:28:25 【问题描述】:您好,我希望使用 pytesseract 提高我在数字识别方面的表现。
我将原始图像分割成如下所示的部分:
大小可以变化。
为此,我应用了一些类似这样的预处理方法
image = cv2.imread(im, cv2.IMREAD_GRAYSCALE)
image = cv2.GaussianBlur(image, (1, 1), 0)
kernel = np.ones((5, 5), np.uint8)
result_img = cv2.blur(img, (2, 2), 0)
result_img = cv2.dilate(result_img, kernel, iterations=1)
result_img = cv2.erode(result_img, kernel, iterations=1)
我明白了
然后我将它传递给 pytesseract:
num = pytesseract.image_to_string(result_img, lang='eng',
config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')
但这对我来说还不够好,而且经常弄错数字。
我正在寻找改进的方法,我试图保持最小化和独立,但如果我不清楚,请告诉我,我会详细说明。
谢谢。
【问题讨论】:
腐蚀步骤给你什么?我会先进行模糊处理,然后再压缩动态范围,也就是说,大多数浅色变为白色,大部分深色变为黑色,为灰色留下一个相当狭窄的区域,只是为了减少边框的锯齿。跨度> 您能告诉我如何进行动态范围的压缩吗?事实上,您能否拍摄最上面的图像并向我展示您将如何处理它以使其被 tesseract 识别?如果你这样做,请给出答案,以便我接受! 【参考方案1】:通过尝试在执行 OCR 之前对图像进行预处理但使用了不正确的方法,您走在了正确的轨道上。没有理由扩大或侵蚀图像,因为这些操作主要用于去除小的噪声粒子。此外,您当前的输出不是二进制图像。它可能看起来只包含黑白像素,但它实际上是一个 3 通道 BGR 图像,这可能是您得到不正确 OCR 结果的原因。如果您查看Tesseract improve quality,您会注意到为了让 Pytesseract 执行最佳 OCR,需要对图像进行预处理,以便 要检测的所需文本为黑色,背景为白色。为此,我们可以执行Otsu's threshold
获得二进制图像,然后将其反转,使文本位于前景中。这将产生我们的预处理图像,我们可以将其放入image_to_string
。我们使用--psm 6
配置选项来假设一个统一的文本块。查看configuration options 了解更多设置。结果如下:
输入图像->
二进制->
反转
Pytesseract OCR 的结果
8
代码
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# Load image, grayscale, Otsu's threshold, invert
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
invert = 255 - thresh
# OCR
data = pytesseract.image_to_string(invert, lang='eng', config='--psm 6')
print(data)
cv2.imshow('thresh', thresh)
cv2.imshow('invert', invert)
cv2.waitKey()
【讨论】:
以上是关于如何使用 Pytesseract 文本识别改进 OCR?的主要内容,如果未能解决你的问题,请参考以下文章