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
,它会读作 dé
。
我添加了一些阈值和模糊,因为我认为它会改善它,但事实并非如此。
这是我更新的代码:
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
在其他如 d6
、Nf6
中总是 é
。
这里有一个例子,如果你想尝试的话:
输出:
结果: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)
我一直在试验 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
,它会读作 dé
。
我添加了一些阈值和模糊,因为我认为它会改善它,但事实并非如此。
这是我更新的代码:
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
在其他如 d6
、Nf6
中总是 é
。
这里有一个例子,如果你想尝试的话:
输出:
结果: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)