如何提高 Tesseract 的输出

How to improve Tesseract's output

我有一张看起来像这样的图片:

这是处理后的图片

我几乎什么都试过了。我这样处理图像:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Converting to GrayScale
(h, w) = gray.shape[:2]
gray = cv2.resize(gray, (w*2, h*2))
thresh = cv2.threshold(gray, 150, 255.0, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
gray = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, rectKernel)
blur  = cv2.GaussianBlur(gray,(1,1),cv2.BORDER_DEFAULT)
text = pytesseract.image_to_string(blur, config="--oem 1 --psm 6")

但是 Tesseract 没有打印出任何东西。我正在使用这个版本的 tesseract 5.0.0-alpha.20201127

如何提高它的性能?这是非常不可靠的。 编辑:

下面的答案在上述图像上做得很好。 但是当我将这种技术应用于像这样的图像时,我得到了错误的输出

这是为什么?他们看起来大致相同。

问题是字符不在图像的中心。

有时,tesseract 很难识别不在中心的字符或数字。

因此我的建议是:

    1. 将字符居中
    1. 上采样并转换为灰度

    1. 居中字符:

      • cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])
        
      • 50只是一个填充变量,你可以设置为任何其他值。

      • 背景变成蓝色是因为数值。 OpenCV 以 BGR 方式读取图像。将 255 作为输入与 [255, 0, 0] 相同,后者显示蓝色通道,但分别不显示绿色和红色。

      • 您可以尝试其他值。对我来说没关系,因为我会在下一步将其转换为灰度。

    1. 上采样并转换为灰度:

      • 与您完成的步骤相同。您的代码的前三行。

现在当你阅读:

MEHVISH MUQADDAS

Code:


import cv2
import pytesseract

# Load the image
img = cv2.imread("onf0D.jpg")

# Center the image
img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])

# Up-sample
img = cv2.resize(img, (0, 0), fx=2, fy=2)

# Convert to gray-scale
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# OCR
txt = pytesseract.image_to_string(gry, config="--psm 6")
print(txt)

阅读更多tesseract-improve-quality

您不需要执行 thresholdGaussianBlurmorphologyEx

原因是:

  • Simple-Threshold用于获取图像的特征。输入图像的功能已经可用。

  • 不必smooth图片,图片没有光照效果

  • 您不需要segmentation,因为背景是纯白色的。


更新-1

第二张图片需要预处理。但是,应用 simple-threshold 不适用于此图像。您需要使用二进制蒙版去除背景,然后才能应用 OCR。

  • 二进制掩码的结果:

现在,如果您应用 OCR:

IRUM FEROZ

代码:


import cv2
import numpy as np
import pytesseract

# Load the image
img = cv2.imread("jCMft.jpg")

# Center the image
img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])

# Up-sample
img = cv2.resize(img, (0, 0), fx=2, fy=2)

# Convert to HSV color-space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Adaptive-Threshold
msk = cv2.inRange(hsv, np.array([0, 0, 0]), np.array([179, 255, 130]))

# OCR
txt = pytesseract.image_to_string(msk, config="--psm 6")
print(txt)

Q:如何找到cv2.inRange方法的下限和上限?

A:可以用下面的.

:第二张图你改了什么?

A: 首先我将图像转换为 HSV 格式,而不是灰度格式。原因是我想删除背景。如果你用 adaptiveThreshold 进行试验,你会发现背景上有很多伪影限制了 tesseract 的识别。然后我用 cv2.inRange 得到一个二进制掩码。将二进制掩码输入输入给了我想要的结果。