首页 > 解决方案 > Pytesseract 图像到字符串问题

问题描述

有谁知道我怎样才能更好地获得这些结果?

在此处输入图像描述

Total Kills: 15,230,550

Kill Details: (recorded after 2019/10,/Z3]

993,151 331,129
1,330,450 33,265,533
5,031,168

这是它返回的内容,但是它与下面发布的图像相同,我是 python 新手,所以我可以添加任何参数以使其更好地读取图像吗?

img = cv2.imread("kills.jpeg")

    text = pytesseract.image_to_string(img)

    print(text)

这是我读取图像的代码,有什么我可以添加使它更好读的吗?此外,黑匣子将覆盖干扰阅读的图像。我还想说我添加了 2 个黑框以查看它们背后的图像是否导致问题,但我仍然遇到同样的问题。

标签: pythonpython-tesseract

解决方案


缺少的知识是页面分割模式(psm)。当您无法获得所需的结果时,您需要使用它们。

如果我们查看您的图像,唯一的伪影是黑色列。除此之外,图像看起来像二进制图像。适合tesseract识别字符和数字。

让我们尝试通过将 psm 设置为 6 来读取图像。

6 假设一个统一的文本块。

print(pytesseract.image_to_string(img, config="--psm 6")

结果将是:

Total Kills: 75,230,550

Kill Details: (recorded after 2019/10/23)
993,161 331,129
1,380,450 33,265,533
5,031,168

更新


解决问题的第二种方法是获取二进制掩码并将 OCR 应用于掩码特征。

  • 二进制掩码

    • 在此处输入图像描述
  • 二元掩码的特点

    • 在此处输入图像描述

正如我们所看到的,结果与输入图像略有不同。现在,当我们应用 OCR 时,结果将是:

Total Kills: 75,230,550

Kill Details: (recorded after 2019/10/23)
993,161 331,129
1,380,450 33,265,533
5,031,168

代码:

import cv2
import numpy as np
import pytesseract

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

# Convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Get the binary mask
msk = cv2.inRange(hsv, np.array([0, 0, 0]), np.array([179, 255, 154]))

# Extract
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dlt = cv2.dilate(msk, krn, iterations=5)
res = 255 - cv2.bitwise_and(dlt, msk)

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

# Display
cv2.imshow("res", res)
cv2.waitKey(0)

推荐阅读