Pytesseract 对手写字母的处理不正确

Pytesseract works incorrect with handwritten letters

我必须识别手写字母及其坐标,例如这张图片。

我尝试使用 pytesseract 来执行此操作,但它只能识别印刷文本并且无法正确处理我的图像。我没有时间自己写神经网络,想用一个现成的解决方案,比如pytesseract。我知道它可以做到这一点,但这段代码工作不正确。

import cv2
import pytesseract
import imutils
image = cv2.imread('test/task.jpg')
image = imutils.resize(image, width=700)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
thresh = cv2.GaussianBlur(thresh, (3,3), 0)
data = pytesseract.image_to_string(image, lang='eng', config='--psm 6')
print(data)
cv2.imshow('thresh', image)
cv2.imwrite('images/thresh.png', thresh)
cv2.waitKey()

此代码 returns 错误答案。

ti | ee
ares” * ae
de le lc ld

我做错了什么?

P.S。我使用自适应阈值转换了我的图像,它看起来像这样,但代码仍然工作不正确(现在我只是调用 image_to_string() 方法转换良好的图像)

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r'C:\Users\USER\AppData\Local\Tesseract-OCR\tesseract.exe'
image = cv2.imread('output.png')
data = pytesseract.image_to_string(image, lang='eng', config='--psm 6')
print(data)
cv2.waitKey(0)

它returns这个

a Oe '
Pee ee
eee ee ee ee
re
eB
STI AT TTT
“Shen if
ae 6
jal ne
yo l
a) Ne es oe
Seaneaeer =
ee es ee
a en ee
ee rt

我有一个建议,让图像更清晰,去除背景。

你可以使用inRange thresholding.

要使用inRange thresholding你需要将图像转换为“hsv”颜色-space,然后你必须设置inRange方法的上下边界。边界值可以手动设置。 inRange 方法的结果将是图像的遮罩,您可以在其中使用遮罩去除背景。例如:

之后,可以使用tesseract page segmentation modes(psm)。每个 psm 值都会给出不同的输出。例如,psm 6 将给出结果:

B
JN
A 3 C

如果答案不是你想要的输出,那么你可以使用其他improvement methods。像其他图像处理方法,或其他方法(EAST Text detector)。

如果您仍然遇到问题,您可以定位检测到的文本并观察文本被误解的原因。例如:

Cropped image psm mode 6 output
BS
A
8
(_

正如我们在 psm 模式 6 中看到的那样,B 和 C 被误解了。也许 psm 7 会正确解释它们,您需要尝试使用其他值。如果你不想尝试,你可以使用其他深度学习方法,如 EAST text detector

代码:

import cv2
from numpy import array
import pytesseract
from pytesseract import Output


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

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

# Get binary-mask
msk = cv2.inRange(hsv, array([0, 0, 0]), array([179, 255, 80]))
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dlt = cv2.dilate(msk, krn, iterations=1)
thr = 255 - cv2.bitwise_and(dlt, msk)

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

用于检测和定位图像中的文本:

# OCR
d = pytesseract.image_to_data(thr, config="--psm 6", output_type=Output.DICT)
n_boxes = len(d['level'])

for i in range(n_boxes):

    # Get the localized region
    (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])

    # Draw rectangle to the detected region
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 5)

    # Crop the image
    crp = thr[y:y+h, x:x+w]

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

    # Display the cropped image
    cv2.imshow("crp", crp)
    cv2.waitKey(0)