简介:Tesseract OCR 安装包与中文语言包面向需要在本地完成图片文字识别的开发者、测试人员及自动化办公用户,尤其适合用 Python 调用 OCR 引擎处理中文文档、票据或截图的人群。压缩包共 723 个文件,约 36.01MB,以 C++ 源码(cpp、h)和 Java、XML 等工程文件为主,同时包含训练数据、语言模型、命令行工具说明及少量图片与脚本,可支撑从安装部署到识别调试的完整流程。资源内附简体中文语言包,配合 tesseract 命令行或 Python 接口即可识别中文内容,并保留 unicharset、训练与词典相关文件,便于理解 OCR 识别链路与自定义优化。目前已有 941 人学习下载,适合希望快速搭建本地 OCR 环境、研究识别原理或排查中文识别问题的读者参考使用。
1. 从一张 zip 说起:为什么 OCR 装完还是认不出中文
很多人第一次接触 OCR,都是从一个压缩包开始的:tesseract-ocr安装包和中文语言包.zip。解压、双击、一路下一步,装完打开命令行敲一句tesseract --version,看到版本号输出,心里觉得稳了。然后拿一张中文截图丢进去,出来的结果是一堆乱码或者空白——这就是最典型的翻车现场。问题不在安装包,而在于你只装了引擎,没把中文语言包放到引擎能找到的位置,或者环境变量没配对。
这个标题背后其实包含三件事:Tesseract 引擎本体、中文语言包(通常是chi_sim和chi_sim_vert)、以及让两者正确关联的配置。它适合两类人:一类是想在本地快速跑通中文 OCR 的开发者,另一类是要把 OCR 集成进自己工具链、需要离线可用的工程师。读完你应该能独立完成安装、验证、调参、排错这一整条链路,而不是停留在“装完了但不会用”的状态。
2. Tesseract 的安装路径与语言包定位逻辑
2.1 引擎、语言包、配置三者的关系
Tesseract 的工作方式可以理解成“引擎 + 数据”两层。引擎负责图像预处理、字符分割、特征匹配这些计算;语言包提供的是特定语言的字符集、字典和训练模型。引擎启动时会去一个固定的目录找语言包,这个目录叫TESSDATA_PREFIX。如果这个变量没设,或者设错了,引擎就只认英文,中文自然出不来。
在 Windows 上,默认安装路径通常是C:\Program Files\Tesseract-OCR,语言包放在其下的tessdata文件夹里。Linux 上通过包管理器安装时,tessdata一般在/usr/share/tesseract-ocr/4.00/tessdata或/usr/share/tessdata。macOS 用 Homebrew 装的话,路径在/opt/homebrew/share/tessdata或/usr/local/share/tessdata。这些路径不是固定的,取决于安装方式和版本,所以第一步永远是确认你的tessdata到底在哪。
语言包文件本身是.traineddata格式。中文简体对应的文件名是chi_sim.traineddata,繁体是chi_tra.traineddata。如果你拿到的是一个 zip 包,里面通常会有这两个文件,可能还有eng.traineddata。你要做的就是把它们复制到tessdata目录下,而不是放在桌面或者随便一个文件夹里。
2.2 验证安装是否真正可用
装完之后不要急着跑图片,先用命令确认引擎和语言包都就位。下面这组命令在 Windows、Linux、macOS 上通用,只是路径写法不同。
# 查看 Tesseract 版本,确认引擎已安装 tesseract --version # 列出当前可用的所有语言包 tesseract --list-langs # 如果输出里包含 chi_sim,说明中文语言包已被识别如果--list-langs的输出里没有chi_sim,说明语言包没放对位置,或者TESSDATA_PREFIX指向了错误的目录。这时候不要反复重装引擎,先检查环境变量。
# Linux/macOS 下查看当前 TESSDATA_PREFIX echo $TESSDATA_PREFIX # Windows PowerShell 下查看 echo $env:TESSDATA_PREFIX如果这个变量为空,而你的语言包确实放在了默认tessdata目录里,那通常也能正常工作。但如果语言包放在自定义目录,就必须手动设置。Linux/macOS 下可以这样临时设置:
# 临时指定语言包目录,仅对当前终端会话有效 export TESSDATA_PREFIX=/your/custom/path/tessdata # 再次确认语言包列表 tesseract --list-langsWindows 下则通过系统环境变量界面添加TESSDATA_PREFIX,值指向包含tessdata的父目录或tessdata本身,具体取决于版本。一个常见的坑是:有的版本要求指向tessdata的父目录,有的要求直接指向tessdata,所以设置完要用--list-langs验证,不要凭感觉。
2.3 最小可运行的中文识别命令
确认chi_sim出现在语言列表之后,就可以跑第一张图了。假设你有一张名为test.png的中文截图。
# 基本用法:指定语言为简体中文,输出到 stdout tesseract test.png stdout -l chi_sim # 输出到文件,默认生成 test.txt tesseract test.png test -l chi_sim # 同时指定中英文混合识别 tesseract test.png stdout -l chi_sim+eng这里-l参数指定语言,多个语言用加号连接。stdout表示结果直接打印到终端,方便快速验证。如果输出是乱码,先确认图片本身是否清晰、文字是否水平、背景是否干净。Tesseract 对图像质量很敏感,尤其是中文,笔画密集,低分辨率或压缩过度的图片识别率会断崖式下降。
3. 中文识别效果调优:参数、预处理与训练数据选择
3.1 页面分割模式(PSM)怎么选
Tesseract 默认的页面分割模式是PSM 3,即全自动分割。这个模式适合整页文档,但对截图、单行文字、表格里的单元格往往不友好。中文场景下,最常见的需求是识别一张截图里的几行字,这时候应该换模式。
# PSM 6:假设是一块统一的文本区域 tesseract test.png stdout -l chi_sim --psm 6 # PSM 7:假设是单行文本 tesseract test.png stdout -l chi_sim --psm 7 # PSM 11:稀疏文本,适合零散文字 tesseract test.png stdout -l chi_sim --psm 11--psm的值从 0 到 13,常用的就是 3、6、7、11。我的经验是:整页文档用 3,截图段落用 6,单行标题用 7,界面上的零散按钮文字用 11。选错模式不会报错,但结果会差很多,这是很多人觉得“Tesseract 中文不行”的主要原因之一。
3.2 图像预处理:灰度、二值化、缩放
Tesseract 内部会做一定的预处理,但它的预处理比较保守。对于中文,手动做几步简单的图像处理,效果提升非常明显。下面用 Python 的 Pillow 和 OpenCV 演示。
import cv2 import pytesseract # 读取图片 img = cv2.imread('test.png') # 转灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 放大两倍,中文小字放大后识别率提升明显 gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # 自适应二值化,比固定阈值更适应光照不均 binary = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, # 邻域大小,通常取 11 到 31 之间的奇数 10 # 常数,从均值中减去该值 ) # 调用 Tesseract,指定中文和 PSM text = pytesseract.image_to_string(binary, lang='chi_sim', config='--psm 6') print(text)这段代码里,fx=2, fy=2是放大倍数,中文小字建议至少放大到原始尺寸的两倍。adaptiveThreshold的31是邻域大小,图片越大这个值可以适当增大;10是常数,值越大二值化越激进,背景噪点多的时候可以调高。注意不要过度二值化,否则笔画会断裂,反而降低识别率。
3.3 语言包版本与训练数据的取舍
Tesseract 4.x 之后用的是 LSTM 神经网络模型,语言包分两种:tessdata(标准)、tessdata_best(精度优先)、tessdata_fast(速度优先)。如果你拿到的 zip 包里只有chi_sim.traineddata,那大概率是标准版。标准版在多数场景下够用,但如果你的图片质量差、字体特殊,可以换tessdata_best里的chi_sim.traineddata,代价是速度慢一些。
| 语言包类型 | 识别精度 | 速度 | 适用场景 |
|---|---|---|---|
| tessdata_fast | 一般 | 最快 | 实时性要求高、图片清晰 |
| tessdata(标准) | 较好 | 中等 | 通用场景 |
| tessdata_best | 最好 | 最慢 | 图片质量差、精度优先 |
换语言包的方法很简单:下载对应的chi_sim.traineddata,覆盖tessdata目录下的同名文件,然后重新跑--list-langs确认。注意不要混用不同版本的引擎和语言包,Tesseract 4 的引擎配 Tesseract 3 的语言包会直接报错。
4. 避坑与排查:中文 OCR 最常见的五类问题
4.1 报错 “Failed loading language ‘chi_sim’”
现象:命令行执行时提示无法加载chi_sim,或者--list-langs里根本没有中文。
原因:语言包文件不在TESSDATA_PREFIX指向的目录里,或者文件名不对。常见的是下载到的文件叫chi_sim.traineddata但被浏览器改成了chi_sim(1).traineddata,或者解压后多了一层文件夹。
解决:进入tessdata目录,用ls或dir确认文件名严格是chi_sim.traineddata。如果TESSDATA_PREFIX没设,就把它设到tessdata的父目录或本身,然后用--list-langs验证。不要靠猜,一定要看到chi_sim出现在列表里。
4.2 识别结果全是乱码或空白
现象:命令没报错,但输出的文字完全不可读,或者干脆没有输出。
原因:图片本身质量太差,或者 PSM 模式选错。中文对分辨率要求比英文高,一张 72 DPI 的截图直接丢进去,基本没戏。
解决:先用图片查看器放大看,文字是否清晰可辨。如果人眼都觉得模糊,先做放大和锐化。然后换--psm 6或--psm 7再试。如果还是不行,用 Python 做灰度加自适应二值化,再喂给 Tesseract。
4.3 中英文混合时英文识别错乱
现象:中文识别正常,但夹杂的英文单词被拆成乱码。
原因:只指定了-l chi_sim,引擎用中文模型去匹配英文字符,自然对不上。
解决:用-l chi_sim+eng同时加载两个语言包。注意顺序会影响优先级,chi_sim+eng表示中文优先,eng+chi_sim表示英文优先。根据你的文档以哪种语言为主来调整。
4.4 安装包自带的语言包版本过旧
现象:某些生僻字、异体字识别不出来,或者标点符号错乱。
原因:zip 包里附带的chi_sim.traineddata可能是几年前的老版本,训练数据覆盖不够。
解决:去官方 tessdata 仓库下载最新的chi_sim.traineddata,覆盖旧文件。覆盖前备份原文件,万一新版本在你的场景下表现更差,可以回滚。这是典型的“后悔药”操作,花三十秒备份,省半小时重装。
4.5 环境变量改了但不生效
现象:明明设置了TESSDATA_PREFIX,但--list-langs还是看不到中文。
原因:Windows 下改了系统环境变量但没重启终端;Linux/macOS 下export只对当前会话有效,新开终端就丢了。
解决:Windows 下关掉所有命令行窗口重新打开,或者直接在命令行里临时set TESSDATA_PREFIX=...测试。Linux/macOS 下如果要永久生效,把export写进~/.bashrc或~/.zshrc,然后source一下。测试阶段建议先用临时设置,确认路径正确后再固化。
5. 把 Tesseract 中文识别集成进自动化流程的实用技巧
5.1 用 Python 批量处理图片并输出结构化结果
单张图片验证通过之后,下一步通常是批量处理。下面这个脚本遍历一个文件夹里的所有图片,输出对应的文本文件,并打印每张图的识别耗时。
import os import time import cv2 import pytesseract # 输入输出目录 input_dir = './images' output_dir = './results' os.makedirs(output_dir, exist_ok=True) # 支持的图片格式 exts = ('.png', '.jpg', '.jpeg', '.bmp', '.tiff') for fname in os.listdir(input_dir): if not fname.lower().endswith(exts): continue img_path = os.path.join(input_dir, fname) img = cv2.imread(img_path) # 统一预处理:灰度 + 放大 + 二值化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) binary = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 10 ) start = time.time() text = pytesseract.image_to_string(binary, lang='chi_sim+eng', config='--psm 6') elapsed = time.time() - start out_name = os.path.splitext(fname)[0] + '.txt' out_path = os.path.join(output_dir, out_name) with open(out_path, 'w', encoding='utf-8') as f: f.write(text) print(f'{fname} -> {out_name}, 耗时 {elapsed:.2f}s, 字符数 {len(text)}')这个脚本的关键点在于:预处理参数是统一的,但实际项目中不同来源的图片可能需要不同的预处理策略。如果发现某类图片识别率明显偏低,可以按文件名前缀分组,对每组用不同的fx或阈值参数。另外,pytesseract需要你提前安装好 Tesseract 引擎并确保tesseract命令在 PATH 里,否则会报TesseractNotFoundError。
5.2 用 hOCR 输出保留文字位置信息
纯文本输出丢掉了文字在图片中的位置。如果你要做版面分析、表格提取或者把识别结果叠加回原图,就需要 hOCR 格式。
# 输出 hOCR 格式,包含每个词的坐标和置信度 tesseract test.png test_hocr -l chi_sim --psm 6 hocr生成的test_hocr.hocr是一个 HTML 文件,里面每个识别到的词都有bbox坐标和x_wconf置信度。置信度低于 60 的词基本可以认为是误识别,可以在后处理时过滤掉。这个技巧在做票据识别、证件识别时特别有用,因为你可以根据坐标判断哪些区域识别可信、哪些需要人工复核。
5.3 一个我常犯的错误:忽略 DPI 参数
Tesseract 在处理图片时会参考 DPI 信息。如果图片没有 DPI 元数据,Tesseract 会假设一个默认值,通常是 70 左右。对于中文小字,这个假设值太低,导致引擎在缩放时丢失细节。我吃过这个亏:同一张图,用图片查看器另存为 300 DPI 后识别率从 60% 跳到 90%。
# 用 Pillow 设置 DPI 后保存,再喂给 Tesseract from PIL import Image img = Image.open('test.png') img.save('test_300dpi.png', dpi=(300, 300))或者在调用时直接告诉 Tesseract 图片的 DPI:
tesseract test.png stdout -l chi_sim --psm 6 --dpi 300这个参数不显眼,但对中文识别的影响比很多花哨的预处理都大。如果你试了各种二值化、放大、锐化都没明显改善,先检查一下 DPI 设置。希望帮到你。
本文还有配套的精品资源,点击获取