能否在PyTesseract脚本运行过程中切换配置适配不同识别场景?
PyTesseract动态切换配置实现多场景OCR的解决思路
你的需求完全可实现,PyTesseract的配置参数为单次调用生效,不需要全局修改,每次调用识别接口时传入对应配置即可实现动态切换。
1. 预定义两套适配不同场景的OCR配置
# 普通词典关键词配置:保留原有逻辑,开启词典匹配保证常规词识别准确率 CONFIG_NORMAL = '--psm 11' CONFIG_NORMAL_BLUR = '--psm 6' # 字母数字组合非词典字段配置:关闭词典匹配、限制识别字符范围,避免随机串被纠错为词典词 CONFIG_ALPHANUM = '--psm 11 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -c load_system_dawg=0 -c load_freq_dawg=0' CONFIG_ALPHANUM_BLUR = '--psm 6 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -c load_system_dawg=0 -c load_freq_dawg=0'
其中字符白名单可根据你实际的文档名规则调整,比如添加小写字母、特殊符号等
2. 新增关键词类型判断逻辑
两种实现方案可选:
- 自动判断:根据业务规则写判断函数,自动归类关键词类型,示例如下:
def is_alphanum_keyword(keyword): # 自定义判断规则示例:同时包含字母和数字,长度在6-10位 has_letter = any(c.isalpha() for c in str(keyword)) has_digit = any(c.isdigit() for c in str(keyword)) return has_letter and has_digit and 5 < len(str(keyword)) < 11
- 手动指定:给
OCRscreen函数新增可选参数is_alphanum:bool = False,调用时如果是识别文档号就传True,精度更高不会出现误判。
3. 改造原有OCR调用逻辑
把原有硬编码的config参数替换为动态选择的配置变量即可,核心改造点如下:
# 识别前先判断当前关键词对应的配置 if is_alphanum_keyword(keyword): cur_config = CONFIG_ALPHANUM cur_config_blur = CONFIG_ALPHANUM_BLUR else: cur_config = CONFIG_NORMAL cur_config_blur = CONFIG_NORMAL_BLUR # 非模糊识别时传入动态配置 results = pytesseract.image_to_data(Image.open(tempFile), lang='eng', config=cur_config, output_type=Output.DICT) # 模糊识别时传入动态配置 results_Blur = pytesseract.image_to_data(Image.open(tempFile_Blur), lang='eng', config=cur_config_blur, output_type=Output.DICT)
额外优化建议
- 修复现有代码的坐标获取bug:当前代码如果关键词是在模糊识别的
results_Blur中命中的,后续遍历只取了非模糊的results,会找不到坐标直接退出,需要把两个结果合并后再遍历 - 无需写临时文件到磁盘:pytesseract支持直接传入opencv的图像对象,跳过读写磁盘步骤可提升识别速度
- 可根据业务需求调整判断规则:如果你的文档号是固定格式,比如「2位大写字母+6位数字」,可以写正则匹配做判断,准确率更高
内容的提问来源于stack exchange,提问作者MontX
相关产品推荐
相关产品推荐

