【问题标题】:Pytesseract works incorrect with handwritten lettersPytesseract 与手写字母不正确
【发布时间】:2021-11-01 08:21:06
【问题描述】:

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

我尝试使用 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()

此代码返回错误答案。

ti | ee
ares” * ae
de le lc ld

我做错了什么?

附:我使用自适应阈值转换了我的图像,它看起来像这样,但代码仍然可以正常工作(现在我只需调用 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)

它返回这个

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

【问题讨论】:

  • 你的阈值图片是什么样子的?
  • @dennlinger,我已将其添加到帖子中
  • 让我这样说吧:作为人类,你能从图像中得到正确的输出吗?如果答案是“否”,那么您的程序也将无法做到。看来你转换图片的方式有问题。
  • 正如@dennlinger 提到的,您必须事先使图像清晰。我认为自适应阈值在这张图片上会做得很好。请尝试一下。
  • @LasvenLoke,我做到了,现在图像转换正确(我在帖子中添加了照片),但代码仍然不正确。 (输出在帖子中)

标签: python machine-learning neural-network image-recognition python-tesseract


【解决方案1】:

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

您可以使用inRange thresholding

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

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

B
JN
A 3 C

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

如果还是有问题,可以对检测到的文字进行本地化,并观察文字被误解的原因。例如:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多