
简介Tesseract OCR是谷歌维护的开源OCR引擎可将图片中的文字转为可编辑文本支持多语种识别尤其适合需要离线处理中文文档、批量识别扫描件的开发者和自动化使用者。该压缩包提供完整的Windows安装程序与中文语言包含chi_sim、chi_tra解压后将语言包放入tessdata目录并通过-l chi_sim参数即可调用同时附带大量C、Java、Python等语言接口的源码、头文件、训练工具与文档便于二次开发或研究识别原理。包体共722个文件约33.84MB除核心可执行文件和traineddata模型外还包括274个h头文件、271个cpp源文件以及xml、html、txt等说明文档结构清晰。已有936人学习下载适合正在部署Tesseract或希望定制中文识别模型的入门与进阶用户。 手头有一百多张截图要转成可编辑文本试过几个在线 OCR 网站要么限制识别次数要么得把图片传到别人的服务器上心里总归不踏实。来回折腾一圈之后我把方案定在了 tesseract-ocr 上——这个开源 OCR 引擎配合中文语言包能完全离线跑命令行和 Python 都能调用批量识别一个 for 循环就解决。这篇文章是给准备入坑 OCR 的人准备的完整实操记录围绕 tesseract-ocr 的安装包选择、中文语言包配置、实际识别调优和常见坑展开照着做基本能一步到位。1. 为什么 OCR 的活儿我会选 Tesseract1.1 在线工具的三个痛点让我决心换方案先说场景。我手头那批截图大多是带中文的界面截屏、聊天记录、扫描版 PDF 的页面图。一开始图省事用在线 OCR用过几次就发现了问题免费额度紧巴巴一天几十张的量根本不够部分平台要求注册传图还有大小和格式限制最难受的是隐私有些截图带账号信息甚至合同内容传到第三方服务器上总归不安心。后来我尝试用微信自带的提取文字功能做替代单张图确实好用但一旦想批量处理就得一张张手动操作输出格式也不可控。对于需要把几百张图转成结构化文本并继续做处理的场景在线工具和聊天软件都撑不住。这时候就必须上本地 OCR 引擎而 tesseract-ocr 是绕不开的第一选择。1.2 Tesseract 的底细和生态现状Tesseract 的历史挺有意思最早是惠普实验室开发的后来开源被 Google 接手维护到现在。它支持 100 多种语言的识别中文简体、繁体都有对应的语言包这是它被广泛使用的重要原因之一。从 4.0 开始Tesseract 默认使用基于 LSTM 的神经网络识别引擎相比老版本的模板匹配方式对印刷体中文的识别率提升非常明显。现阶段的稳定版本是 5.x。GitHub 上 tesseract-ocr/tesseract 仓库保持着比较活跃的更新节奏社区也长期维护着简体中文语言包 chi_sim.traineddata。配合 pytesseract、OpenCV 这些 Python 库可以很方便地搭出图片输入 - 预处理 - 识别 - 结构化输出的完整链路这也是很多自动化脚本、爬虫辅助工具、票据识别小项目的底层方案。1.3 它的短板也得提前说清楚Tesseract 不是万能的尤其是中文场景它有非常明显的边界复杂版面表格混排、多栏排版需要额外调参甚至版面分析手写体基本识别不动印刷体才是它的主场图像质量太差时识别结果会惨不忍睹。我在项目里踩过几次坑之后总结出一个经验Tesseract 的识别效果很大程度取决于输入图片的质量和版面规整程度它是一把需要伺候的刀而不是塞什么图都能吐对的万能工具。但话说回来在完全离线、可批量、可定制的本地 OCR 方案里它已经是最可靠的选择。2. 安装包怎么选不同系统的装机细节2.1 WindowsUB Mannheim 社区安装包是首选Windows 机器上Tesseract 官方仓库并没有提供可执行的安装包社区维护的 UB Mannheim 版本是事实上的标准方案。直接在搜索引擎搜 tesseract-ocr UB Mannheim进入 GitHub 的 tesseract-ocr/tesseract 仓库后在 releases 区能找到对应的 Windows 安装器文件名类似 tesseract-ocr-w64-setup-5.x.x.exe。安装过程有几个细节值得留意。安装器默认只装英文的识别数据如果之后想省事可以在安装到Choose Components那一步把 Additional language data 里面的 Chinese (Simplified) 勾上安装器会自动把 chi_sim.traineddata 中文语言包一起放进 tessdata 目录。这一步很多人会忽略等跑命令时报Failed loading language再回头补装也比手动下载文件要麻烦一些。安装时候还有一点需要注意安装器默认不会自动把安装目录加进 PATH如果安装完成后在命令行里敲 tesseract 提示找不到命令需要自己手动把 Tesseract 的安装目录比如 C:\Program Files\Tesseract-OCR添加到系统环境变量里或者安装时勾选Add Tesseract to your system PATH选项。2.2 Debian/Ubuntu 和 CentOS 的 apt/yum 方案Linux 上装 tesseract-ocr 要省心得多各发行版的软件源里基本都收录了。Debian/Ubuntu 一条命令就能搞定主程序和简体中文语言包sudo apt update sudo apt install tesseract-ocr tesseract-ocr-chi-sim这里 tesseract-ocr-chi-sim 就是简体中文语言包装完不需要再手动下载任何 traineddata 文件这是 Linux 上最方便的地方。CentOS/RHEL 系稍微绕一点默认源里通常没有需要先启用 EPEL 源sudo yum install epel-release sudo yum install tesseract tesseract-langpack-chitesseract-langpack-chi 会带上简体、繁体等一批中文相关语言包。安装完成后可以用 tesseract --list-langs 检查看到 chi_sim 出现在列表里就说明语言包就位了。2.3 macOS 和 Termux 的补充macOS 用户直接用 Homebrew 装也是一条命令brew install tesseract tesseract-langtesseract-lang 包含全部语言数据装完连下载语言包的步骤都省了。另外热搜里出现了 termux 中文语言包的词我也顺手说一下Android 上的 Termux 环境里用 pkg install tesseract 就能安装主程序之后把 chi_sim.traineddata 手动复制到 $PREFIX/share/tessdata 目录下即可。这个场景适合想在手机上快速做 OCR 验证的朋友安卓机上跑 Tesseract 的性能虽然不比桌面端但简单识别是够用的。2.4 版本选择4.x 还是 5.x如果你是在旧系统上安装偶尔会遇到仓库默认版本还是 4.x 的情况。两个版本在命令行用法上基本一致但 5.x 修复了 4.x 的一些识别问题也在语言数据格式上有细微改进建议优先装 5.x。判断版本就一条命令tesseract --version。如果系统源里的版本过低可以考虑手动编译或找第三方源不过一般情况下并不值得为此折腾太久4.x 配合 LSTM 引擎--oem 1的识别效果也能接受。3. 中文语言包chi_sim.traineddata 的下载、放置与验证3.1 下载地址与 fast/best 的选择语言包的核心文件是 chi_sim.traineddata它就是 Tesseract 识别简体中文所需的模型数据。如果安装时没有勾选或系统源里没有现成语言包就需要手动下载。官方维护了两个 tessdata 仓库tessdata_fast体积小、识别速度更快精度略低适合日常批量处理tessdata完整精度模型识别效果更好但体积大、速度慢适合对准确率要求高的场景实际使用中我多数时候用 tessdata_fast 里的 chi_sim.traineddata文件大概 2MB 左右绝大多数印刷体中文截图都已经能识别得不错。如果对精度有更高要求可以换成 tessdata 仓库里的版本文件会到几十 MB速度会有明显下降。还有一点要注意不要随意从第三方网站下载 traineddata 文件很可能版本不匹配导致加载时报Error opening data file之类的错误老老实实从官方 GitHub 仓库拿最稳妥。3.2 放对位置才有用tessdata 目录与 TESSDATA_PREFIXtraineddata 文件下回来以后存放位置很关键。Tesseract 默认从它编译时指定的 tessdata 目录读取语言数据不同系统位置不一样系统tessdata 默认路径WindowsUB Mannheim 安装C:\Program Files\Tesseract-OCR\tessdataDebian/Ubuntu/usr/share/tesseract-ocr/5/tessdata/ 或 /usr/share/tesseract-ocr/4.00/tessdata/macOSHomebrew/opt/homebrew/share/tessdata/Termux$PREFIX/share/tessdata如果文件放到了非默认目录可以通过设置环境变量 TESSDATA_PREFIX 指向实际目录来覆盖默认路径。我自己就被这个变量坑过一次环境变量指向了一个旧版的 tessdata 文件夹导致明明下载了新语言包Tesseract 却一直读取旧文件识别效果怎么调都不对。排查了半天才反应过来是环境变量路径的问题。所以记住这句话安装文件和语言包都到位的前提下检查 TESSDATA_PREFIX 是否正确应该和检查文件本身是否存在放在同等优先级。3.3 用 --list-langs 验证语言包是否就绪语言包是否放对位置、环境变量是否生效不需要去看配置文件直接跑一句命令验证tesseract --list-langs正常输出里会出现List of available languages (3): eng osd chi_sim看到 chi_sim 出现在列表里就说明简体中文语言包已经可以被 Tesseract 正常加载了。如果报错或列表里没有 chi_sim优先检查文件是否存在、文件名是否被误改、TESSDATA_PREFIX 路径是否正确。这个验证动作应该作为安装流程的最后一步来执行它能帮你把后续所有为什么识别不了中文的问题提前扼杀掉。4. 第一次跑通中文识别命令行的正确打开方式4.1 最基础的一条命令Tesseract 的命令行用法非常简洁。假设有一张名为 demo.png 的图片内容是中文印刷体执行tesseract demo.png output -l chi_sim这条命令会读取 demo.png用简体中文语言包进行识别并把结果写入 output.txt。这是最常用的形态适合快速验证环境是否通。如果图片内容是中英文混排可以用加号把语言包串起来tesseract demo.png output -l chi_simeng我自己在识别截图时通常会用这种中英文混合模式因为很多界面截图里中英文是并存的只用 chi_sim 会把英文或数字丢掉只用 eng 又识别不了中文混合模式能兼顾。4.2 影响识别效果的几个关键参数命令行除了指定输入输出还有两个参数需要理解--oem 和 --psm。OEM 表示 OCR 引擎模式0 是传统引擎1 是 LSTM 引擎3 是自动选择。5.x 版本里默认情况通常会自动选 LSTM但有些老环境可能跑回传统引擎导致识别效果明显下降这时候可以用 --oem 1 强制指定 LSTMtesseract demo.png output -l chi_sim --oem 1PSM 表示页面分割模式这个参数直接影响 Tesseract 如何理解图像的版面结构。完整的模式列表很长但日常用到最多的有三个--psm 3自动检测版面完全交给引擎判断默认值--psm 6假设图片是一整块均匀文本适合截图、扫描文字较多的场景--psm 11适合稀疏文本文字之间空距较大我处理大段中文截图时如果发现 --psm 3 识别出的顺序乱掉多半是版面太复杂换成 --psm 6 往往能立刻改善。它让引擎不去猜测文字块分布而是把整张图当作一个段落来处理逻辑更简单识别更稳定。4.3 试试不同 PSM 的差异举个我在实际项目中遇到的例子一张包含标题、正文、表格截图的全屏页面用默认 --psm 3 识别时正文内容被切割得七零八落段落顺序也乱了。改成 --psm 6 后整块正文保持完整顺序也对上号了。反过来如果是一张只有两三行文字的图用 --psm 3 反而可能多出一些误判把图片背景也当成文字区域扫描一遍这种情况用 --psm 6 或 --psm 7单行文本模式效果会更好。所以遇到识别结果不理想可以按从简单到复杂的顺序试试不同的 PSM 模式。我的经验是截图类图片优先 --psm 6扫描文档类优先 --psm 3拍歪的纸面文字先做图像矫正再考虑 --psm 4单列文本。PSM 对结果的影响有时比换语言包版本还大值得多花几分钟做对比实验。5. 识别质量不够图像预处理和 Python 集成5.1 图像质量决定识别上限命令行能调整的参数只是把 Tesseract 的能力发挥出来真正决定识别上限的是输入图像本身。我刚开始用 Tesseract 时把一张手机拍的模糊照片直接丢进去中文识别率惨不忍睹一度以为是语言包有问题。后来才意识到Tesseract 对低分辨率、光照不均、背景杂乱的中文图片几乎束手无策这不是它的 bug而是所有 OCR 引擎的通病。正确做法是在识别之前先对图像做预处理把图片喂到一个更适合 OCR 的状态。我用得最多的预处理动作有三个灰度化、二值化、放大。灰度化是去掉颜色干扰二值化是把前景文字和背景彻底拉开放大则是提升分辨率让笔画细节更清晰。看似简单但这三步组合起来对识别率带来的提升往往比换任何模型参数都大。5.2 OpenCV/PIL 预处理步骤下面是基于 Python OpenCV 的预处理示例我已经在实际项目中反复用过稳定可靠import cv2 import numpy as np def preprocess_image(image_path): # 读取图像 img cv2.imread(image_path) # 转灰度 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 放大 2 倍提升小字识别率 gray cv2.resize(gray, None, fx2, fy2, interpolationcv2.INTER_CUBIC) # 自适应二值化 binary cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 10 ) return binary自适应二值化相比固定阈值的好处在于它根据每个像素周围局部的亮度做判断能有效处理图片上有阴影或亮度不均的情况。我用固定阈值处理一批扫描件时局部阴影处的文字全被吞掉了换成自适应阈值之后立刻恢复了。如果你的图片背景非常干净固定阈值比如阈值 127 或 150也够用且速度更快但在我处理过的截图场景里自适应阈值更省心。5.3 pytesseract 把 OCR 请进 Python 代码图像处理搞定之后就要把 OCR 接进代码了。pytesseract 是 Python 的常用封装库本质上它是通过命令行调用 tesseract 程序并不是真正的原生 Python 库所以要先保证系统里 tesseract 已经装好。安装很简单pip install pytesseractWindows 上如果 tesseract 不在 PATH 里需要指定安装路径import pytesseract pytesseract.pytesseract.tesseract_cmd rC:\Program Files\Tesseract-OCR\tesseract.exe from PIL import Image import cv2 # 读取并预处理 binary preprocess_image(demo.png) # 调用 OCR text pytesseract.image_to_string( Image.fromarray(binary), langchi_sim, config--oem 1 --psm 6 ) print(text)要注意的是pytesseract.image_to_string 的 config 参数里--psm 和 --oem 可以随时调整实际项目里我会针对不同来源的图片分别采样测试配置不同的 PSM然后按最佳效果固化下来。整个过程完全本地化不产生任何外部请求批量处理也只是循环调用 preprocess_image 和 image_to_string 的事。6. 安装配置中最容易踩的几个坑与修复6.1 Failed loading language chi_sim 是什么原因这个错误是中文 OCR 常见的拦路虎。报错出现时首先确认语言包文件存在且名称准确文件名必须是 chi_sim.traineddata不能是 chi_sim.traineddata.zip 之类的名字。第二个容易出错的位置是 TESSDATA_PREFIX 环境变量如果它指向的目录里没有 chi_sim.traineddata哪怕系统默认路径下有同样会报加载失败。我在排查时习惯先跑 tesseract --list-langs如果列表里没有 chi_sim就按文件是否在 - 路径是否对 - 环境变量是否指错的顺序逐个排查这套流程基本没有解决不了的问题。6.2 终端输出中文乱码命令行模式下Tesseract 输出的 text 文件内容默认是 UTF-8 编码本身没有问题。出现乱码多数是终端显示问题尤其是 Windows 的 PowerShell 或 CMD 默认代码页是 GBK直接 type 一个 UTF-8 的 txt 文件就会乱。解决办法是在执行前切换代码页chcp 65001或者不要依赖终端预览直接用 Python 读取文件内容并打印。我个人习惯在 Python 里用 open(output.txt, r, encodingutf-8) 读取这样最稳妥不受终端代码页影响。6.3 中文识别率低到没法用如果语言包没问题、命令也正确识别率还是低问题多半出在图像质量或版面复杂度上。按我的经验优先检查三点图片是否太小、背景是否有大面积干扰、文字是否歪斜。小图放大两到三倍背景干扰通过二值化或裁剪处理歪斜的文字先做旋转矫正。还有一点值得说Tesseract 对中文大字符集本来就比英文容易误识别同音字、形近字的问题无法完全避免所以识别结果 90% 以上正确已经算比较好的状态剩下的可以通过后处理字符替换或人工校对来弥补不要追求 100% 完美。6.4 批量识别慢怎么办批量处理数量多的时候性能就成了瓶颈。我实测下来影响速度的主要因素是语言包大小和 PSM 复杂度。tessdata_fast 的中文语言包比完整 tessdata 版本快很多如果对精度要求不是极端高优先用 fast 版本。另外 --psm 6 的版面分析逻辑比 --psm 3 简单速度也会快一截。如果图片数量上千还可以用 multiprocessing 做多进程并行把一组图片分成多份同时识别处理时间能大幅压缩。我已经用这个思路处理过几千张截图机器性能足够的情况下整体效率提升非常明显。最后再分享一个小技巧是我实际用了很久的习惯安装配置完成之后把 tesseract --version 和 tesseract --list-langs 的输出保存到一个备忘文件里下次换机器或重装系统时直接对照能省不少重新踩坑的时间。OCR 这条链路真正难的从来不是跑通第一行命令而是让它在不同质量、不同版面的真实图片上稳定产出可用的结果。把上面这些细节稳住Tesseract 就是一套非常顺手的本地文字提取工具。本文还有配套的精品资源点击获取