我正在自学python,并试图编写一个简单的程序来识别图像中的字母。字母不是句子或段落形式。我正在尝试使用cv2 + pytesseract进行检测,但是我似乎无法使其可靠地工作。我开始怀疑自己在使用错误的工具来完成工作,但是找不到其他可以帮助我的东西。
这是我要提取的字母的参考图像:
理想情况下,我想要字母以及每个字母的坐标(边框)。我已经能够对图像应用蒙版和阈值来获取此信息:
但是我坚持的是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)
答案 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