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)
我必须识别手写字母及其坐标,例如这张图片。
我尝试使用 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)
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)