Pytesseract识别手写字母准确率低 现有代码运行出错该如何解决
问题核心原因
- 预处理结果未传入识别接口:第一段代码你完成阈值、模糊处理得到
thresh后,调用image_to_string时传入的仍是原始彩色图像image,预处理操作完全没有生效。 - 训练集不匹配:Tesseract默认自带的英文训练集是针对印刷体优化的,对手写字符的识别精度极低,你需要替换为手写英文专用的训练数据文件,替换到Tesseract安装目录下的
tessdata文件夹中。 - 参数配置与场景不匹配:你使用的
--psm 6参数是假设输入为单一的统一文本块,而你的场景是零散分布的独立字母,完全不匹配该参数的适用场景。
优化方案
- 替换识别接口:如果需要同时获取字符对应坐标,将
image_to_string替换为image_to_data,该接口会直接返回每个识别结果的左上角坐标、宽高、置信度等信息。 - 调整识别参数:将
--psm 6替换为--psm 11(稀疏文本模式,适配零散分布的字符),同时增加白名单限制-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,强制仅识别英文字母,排除无关符号干扰。 - 优化预处理逻辑:去掉高斯模糊操作,避免手写字符边缘特征丢失;阈值处理后增加2x2卷积核的形态学开运算,清除画面中的小噪点。
修正后参考代码
import cv2 import pytesseract pytesseract.pytesseract.tesseract_cmd = r'C:\Users\USER\AppData\Local\Tesseract-OCR\tesseract.exe' # 读取图像 image = cv2.imread('test/task.jpg') # 预处理 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 开运算去噪 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # 识别+获取坐标 data = pytesseract.image_to_data(thresh, lang='eng', config='--psm 11 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', output_type=pytesseract.Output.DICT) # 遍历输出结果,只保留置信度大于30的结果 for i in range(len(data['text'])): text = data['text'][i].strip() if text: x, y, w, h = data['left'][i], data['top'][i], data['width'][i], data['height'][i] conf = int(data['conf'][i]) if conf > 30: print(f"字符:{text},坐标:x={x}, y={y}, 宽={w}, 高={h}, 置信度={conf}") cv2.waitKey(0)
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

