如何使用PyTesseract从图像中提取单个字母?

时间:2020-04-20 16:55:26

标签: python ocr cv2 python-tesseract

我正在自学python,并试图编写一个简单的程序来识别图像中的字母。字母不是句子或段落形式。我正在尝试使用cv2 + pytesseract进行检测,但是我似乎无法使其可靠地工作。我开始怀疑自己在使用错误的工具来完成工作,但是找不到其他可以帮助我的东西。

这是我要提取的字母的参考图像:

enter image description here

理想情况下,我想要字母以及每个字母的坐标(边框)。我已经能够对图像应用蒙版和阈值来获取此信息:

enter image description here

但是我坚持的是Pytesseract无法可靠地给我个别或正确的信件。这是我的控制台输出...

$ py main.py --image test.png
D
C UL
UO

我正在使用的代码只是获取黑白文本图像并通过pytesseract运行它。我尝试过使用--psm标志,但是由于文本形状奇怪,所以运气不太好。

text = pytesseract.image_to_string(Image.open(filename), config='-l eng --psm 11')
os.remove(filename)
print(text)

1 个答案:

答案 0 :(得分:1)

您可以逐个分段和处理每个字母。您可以在我的代码中查看详细信息。

import cv2
import numpy as np
import pytesseract

img = cv2.imread("xO6JI.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

items = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = items[0] if len(items) == 2 else items[1]

img_contour = img.copy()
for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    if 100 < area < 10000:
        cv2.drawContours(img_contour, contours, i, (0, 0, 255), 2)

detected = ""
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
    ratio = h/w
    area = cv2.contourArea(c)
    base = np.ones(thresh.shape, dtype=np.uint8)
    if ratio > 0.9 and 100 < area < 10000:
        base[y:y+h, x:x+w] = thresh[y:y+h, x:x+w]
        segment = cv2.bitwise_not(base)

        custom_config = r'-l eng --oem 3 --psm 10 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZ" '
        c = pytesseract.image_to_string(segment, config=custom_config)
        print(c)
        detected = detected + c
        cv2.imshow("segment", segment)
        cv2.waitKey(0)

print("detected: " + detected)

cv2.imshow("img_contour", img_contour)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果

U
O
L
C
D
detected: UOLCD