【问题标题】:How to improve Tesseract's output如何提高 Tesseract 的输出
【发布时间】:2021-05-22 19:52:30
【问题描述】:

我的图像看起来像这样:

这是处理后的图像

我几乎尝试了所有方法。我这样处理图像:

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 的图像的红色矩形部分是否?

标签: python opencv tesseract


【解决方案1】:

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

有时,如果字符或数字不在中心,则 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

第二张图片需要预处理。但是,应用简单阈值不适用于此图像。您需要使用二进制掩码去除背景,然后才能应用 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:您可以使用以下script

:你在第二张图片中做了什么改变?

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

【讨论】:

  • 感谢您的回答。请检查我的编辑
  • 我为什么要检查你的编辑?当我不断回答它们时,您会一张一张地添加所有图像吗?抱歉,对help-vampires没有帮助
  • 只是询问直觉 :p 第二张图片底部似乎没有边框,而文字与边框接触。因此,当您将其值替换为 255 时,一些文本会被删除。这就是它无法识别文本的原因吗?
  • 当然,如果你这样问我,我会帮忙的。查看 Update-1 下的答案
  • 您是否应用了预处理,因为它有点模糊?您尝试解决的具体问题是什么
猜你喜欢
  • 2017-07-21
  • 2016-06-02
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多