You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pytesseract识别手写字母准确率低 现有代码运行出错该如何解决

问题核心原因
  1. 预处理结果未传入识别接口:第一段代码你完成阈值、模糊处理得到thresh后,调用image_to_string时传入的仍是原始彩色图像image,预处理操作完全没有生效。
  2. 训练集不匹配:Tesseract默认自带的英文训练集是针对印刷体优化的,对手写字符的识别精度极低,你需要替换为手写英文专用的训练数据文件,替换到Tesseract安装目录下的tessdata文件夹中。
  3. 参数配置与场景不匹配:你使用的--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:27:03