Pytesseract 在阅读国际象棋符号时变得不准确

Pytesseract gets inaccurate in reading chess notations

我一直在试验 pytesseract,我搜索了一些提高准确性的方法,但它对我不起作用。所以这是我的 img:

这是输出:

代码:

img = cv2.imread("temp.png")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 4)
txt = pytesseract.image_to_string(thr, config='--psm 13')
print(txt) # "@)"

刚开始我什么都不知道,谁能告诉我怎么做?

编辑:Ahx 解决了我的问题,但代码中存在问题。它将 6 读为 é。例如 d6,它会读作 。 我添加了一些阈值和模糊,因为我认为它会改善它,但事实并非如此。 这是我更新的代码:

img = cv2.imread('temp.png')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lwr = np.array([0, 0, 0])
upr = np.array([179, 255, 180])
msk = cv2.inRange(hsv, lwr, upr)
msk = cv2.resize(msk, (0, 0), fx=3, fy=3, interpolation=cv2.INTER_CUBIC)
msk = cv2.adaptiveThreshold(cv2.bilateralFilter(msk, 9, 75, 75), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
msk = cv2.adaptiveThreshold(cv2.medianBlur(msk, 3), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
txt = pytesseract.image_to_string(msk, lang='eng', config=r'--psm 6 --oem 3')

e6 确实有效,但 6 在其他如 d6Nf6 中总是 é

这里有一个例子,如果你想尝试的话:

输出:

结果:Nf6é

您可以通过执行颜色分割轻松获得结果。首先,您需要加载图像,将其转换为 HSV 格式。接下来,定义上下边界以获得二进制掩码。二进制掩码将包含识别字符所需的特征。然后我们将对二进制掩码进行上采样并将输入提供给 tesseract。

  • 上采样二进制掩码

  • OCR 结果e6


代码:

import cv2
import numpy as np
import pytesseract

# Load the image
img = cv2.imread("iTO9h.png")

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

# Get binary-mask
lwr = np.array([0, 0, 0])
upr = np.array([179, 255, 180])
msk = cv2.inRange(hsv, lwr, upr)

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

# OCR
txt = pytesseract.image_to_string(msk)
print(txt)