根本原因是默认不加载中文语言包。tesseract 4.x+仅预装eng,chi_sim必须单独下载、正确放置至tessdata目录、通过lang='chi_sim'显式调用,且需配合图像预处理与合理config参数(如--oem 3 --psm 6)才能有效识别中文。

为什么 tesseract 识别中文经常返回空或乱码?
根本原因是默认不加载中文语言包。Tesseract 4.x+ 默认只装 eng,chi_sim(简体中文)必须单独下载并显式指定。没配对路径或语言名,pytesseract.image_to_string(img, lang='chi_sim') 会静默失败,返回空字符串,不报错。
- 确认已安装中文语言包:
tesseract --list-langs输出里必须含chi_sim;若没有,去 tessdata 下载chi_sim.traineddata,放进 Tesseract 的tessdata目录(Windows 通常在C:\Program Files\Tesseract-OCR\tessdata) -
lang参数必须写准确:用'chi_sim',不是'chinese'、'zh'或'chi_simulated' - 图像预处理不到位时,即使语言包正确,也会识别失败——这点比语言配置更常被忽略
图片预处理怎么做才让中文识别率明显提升?
中文字符笔画密集、易粘连,原始截图/手机拍图常有灰度不均、噪点、低对比度问题。直接喂给 tesseract,image_to_string 基本靠猜。
- 强制转灰度 + 高斯模糊降噪:
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)→cv2.GaussianBlur(gray, (1,1), 0) - 用
cv2.threshold做二值化,推荐cv2.THRESH_OTSU自适应阈值:cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) - 文字区域太小(如小于 12px)识别极差,用
cv2.resize放大 2× 并插值:cv2.resize(bin_img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) - 避免过度锐化或腐蚀——中文偏旁部首多,误删一笔就成错字
pytesseract.image_to_string 的关键参数怎么选?
光靠 lang 不够,中文场景下 config 参数影响巨大。默认配置针对英文优化,对中文几乎无效。
- 必加
--oem 3(默认值,使用 LSTM 引擎)和--psm 6(假设整图是单块文本,最常用) - 加
-c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ一乙二十丁丂七丄...白名单能大幅减少符号误识,但需手动整理常用汉字集(可先跑一遍粗识别再统计高频字) - 禁用
--oem 0(旧版引擎),它对中文支持极差;也别用--psm 3(自动页面分割),中文排版复杂时反而切碎文字 - 完整调用示例:
pytesseract.image_to_string(img, lang='chi_sim', config='--oem 3 --psm 6 -c preserve_interword_spaces=1')
识别结果含大量空格、换行错乱怎么办?
Tesseract 输出的换行逻辑基于像素行高检测,中文混排标点、数字或英文时极易崩。不是 bug,是设计如此——它输出的是“布局感知文本”,不是“语义正确文本”。
- 用正则清理:
re.sub(r'[\r\n\s]+', ' ', text).strip()合并所有空白为单空格 - 遇到竖排文本(如古籍、菜牌),
--psm 9(单字)比psm 6更稳,但需配合旋转校正 - 若结果中中文夹杂大量
□或,说明字体未覆盖(如黑体、微软雅黑较稳妥),或图像 DPI - 批量处理时建议加异常捕获:
try...except pytesseract.TesseractError,避免一张图失败中断全部流程
真正卡住的往往不是“能不能识别”,而是“识别出来的字要不要、能不能用”。预处理质量、psm 模式选择、后处理清洗,三者缺一不可。尤其注意:同一套参数在扫描文档和手机截图上效果可能差 3 倍以上,得按实际图像来源调。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











