pytesseract无法识别字母前/单词间符号仅数字前符号可识别求助
问题解决建议
核心原因
Tesseract默认启用上下文语义匹配规则,会优先匹配常见字符组合。非数字前缀的#/$/%等特殊符号不符合常规英文单词的组合逻辑,会被误识别为外观相似的H、S等字母;而数字前的同类符号符合价格、标签的常用书写规则,因此可以正常识别。
如果之前调整参数未生效,大概率是没有搭配字符白名单使用,Tesseract的语义推断优先级高于形状匹配,仅修改psm等参数很难修正这类上下文相关的识别错误。
可行解决方案
- 方案1:强制限定识别字符白名单
把需要识别的所有字符(包括特殊符号、大小写字母、数字)全部加入白名单,让Tesseract只能从给定字符集里匹配,完全禁用默认的语义推断,修改image_to_string的config参数即可:# 可根据实际需求增删白名单内的字符 custom_config = r'-c tessedit_char_whitelist=#$%abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ' msg = pytesseract.image_to_string(pil_img, config=custom_config) - 方案2:搭配更适配的识别模式
配合字符白名单使用逐块/稀疏文本识别模式,关闭段落级别的语义推断,优先按字符形状匹配:# --psm 6 适合图片为统一整块文本的场景,--psm 12适合稀疏分布的文本场景 custom_config = r'--psm 6 -c tessedit_char_whitelist=#$%abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ' msg = pytesseract.image_to_string(pil_img, config=custom_config) - 方案3:优化图像预处理逻辑
你当前使用的固定阈值二值化容易受光照影响导致符号边缘变形,可改用自适应阈值处理减少识别误差,替换原有的二值化代码即可:img_binarized = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
内容的提问来源于stack exchange,提问作者mattwatkins
相关产品推荐
相关产品推荐

