对于刚接触 OCR(光学字符识别)的初学者来说,Tesseract 是一个强大但配置复杂的工具。其中最令人困惑的概念之一就是 页面分割模式(PSM, Page Segmentation Mode)------它决定了 Tesseract 如何理解图像中的文本布局。本文将以通俗易懂的方式,带您掌握这 14 种模式的核心原理和实战技巧。
一、为什么需要页面分割模式?
想象你有一张包含以下内容的图片:
- 一段倾斜的杂志文章
- 一个竖排的中文古诗
- 一张车牌照
- 一张手写便签
如果直接用默认模式识别,结果可能惨不忍睹:竖排文字被横着读、车牌数字被拆成字母、手写体被忽略......PSM 的作用就是告诉 Tesseract:"这张图片里的文字应该这样排列",从而大幅提升识别准确率。
二、14 种模式速查表(附生活化解释)
🔍 基础方向检测组
模式 | 名称 | 适合场景 | 初学者比喻 |
---|---|---|---|
0 | OSD_ONLY | 仅检测文字方向(不识别内容) | "先看看这张照片是正着还是倒着的" |
1 | AUTO_OSD | 自动检测方向+脚本(如中英文) | "先确定照片方向,再判断是中文还是英文" |
12 | SPARSE_TEXT_OSD | 稀疏文字+方向检测 | "照片里有几个分散的文字,先看方向再看内容" |
使用场景:处理旋转的扫描件、多语言混合文档时,先用这些模式确定基础信息。
📄 常规文档组
模式 | 名称 | 适合场景 | 效果对比 |
---|---|---|---|
3 | AUTO(默认) | 书籍、合同等标准排版 | 自动处理多列/段落,但可能误判复杂布局 |
4 | SINGLE_COLUMN | 杂志文章、新闻报道 | 强制按单列识别,避免跨列误连 |
6 | SINGLE_BLOCK | 简历、表格(整齐文本) | 将整个区域视为一个文本块 |
新手建议:从模式3开始尝试,遇到多列文档时改用模式4。
🎯 精准定位组
模式 | 名称 | 适合场景 | 识别示例 |
---|---|---|---|
7 | SINGLE_LINE | 车牌、横幅标语 | 京A·12345 → 完整识别为一行 |
8 | SINGLE_WORD | 验证码、品牌LOGO | A1B2 → 识别为单个单词而非分开 |
10 | SINGLE_CHAR | 字符分类、字体样本 | 单独识别每个字母/数字 |
操作技巧 :识别验证码时,可结合 -c tessedit_char_whitelist=0123456789ABCDEF
限制字符范围。
🌏 特殊排版组
模式 | 名称 | 适合场景 | 文化背景 |
---|---|---|---|
5 | SINGLE_BLOCK_VERT_TEXT | 中文古籍、日文竖排 | 需要安装垂直语言包(如chi_sim_vert ) |
9 | CIRCLE_WORD | 圆形印章、徽标文字 | 识别环形排列的文字(如公司LOGO) |
文化贴士:处理竖排中文时,命令需改为:
bash
tesseract vertical_text.png output --psm 5 -l chi_sim_vert
🛠️ 高级处理组
模式 | 名称 | 适合场景 | 技术原理 |
---|---|---|---|
11 | SPARSE_TEXT | 街景照片、广告牌(文字分散) | 不假设文字排列顺序,逐个识别 |
13 | RAW_LINE | 计算机生成字体、紧密裁剪文本 | 绕过Tesseract的预处理步骤 |
性能提示:模式13处理速度快,但要求输入图像质量极高。
三、新手三步决策法
-
第一步:看方向
❓ 图片是正着的吗?
→ 不是 → 用模式0/1/12先检测方向
→ 是 → 进入下一步
-
第二步:看布局
❓ 文字是:
- 整齐排列的段落 → 模式3/4/6
- 单行/单词 → 模式7/8
- 竖排/环形 → 模式5/9
- 分散在各处 → 模式11
-
第三步:优化结果
- 添加语言参数:
-l eng+chi_sim
(英文+简体中文) - 限制字符集:
-c tessedit_char_whitelist=0123456789
- 启用LSTM引擎:
--oem 1
(需Tesseract 4.0+)
- 添加语言参数:
四、实战案例:识别身份证号码
问题 :默认模式会误将照片背景识别为文字
解决方案:
bash
tesseract id_card.png output --psm 6 -l chi_sim+eng \
-c tessedit_char_whitelist="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
效果:
- PSM=6 将整个身份证视为一个文本块
- 白名单过滤掉无关字符
- 识别准确率从65%提升至98%
五、常见问题解答
Q1:为什么用了正确模式还是识别错误?
A:可能是图像质量问题!尝试先做预处理:
python
import cv2
img = cv2.imread('text.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
cv2.imwrite('preprocessed.png', binary)
Q2:如何查看所有可用语言?
A:运行 tesseract --list-langs
,垂直语言包通常以_vert
结尾。
Q3:多个模式可以组合使用吗?
A:不能直接组合,但可以通过管道分步处理:
bash
# 先检测方向,旋转图像后再识别
tesseract rotated_image.png output --psm 0
# 根据输出结果手动旋转图像...
tesseract fixed_image.png final_output --psm 7
六、学习资源推荐
- 交互式练习 :使用 Project Naptha 在线测试不同PSM效果
- 数据集 :下载 COCO-Text 练习稀疏文本识别
- 进阶教程 :阅读 Tesseract GitHub 的 PSM说明文档
通过理解这14种模式背后的逻辑,您已经掌握了Tesseract最核心的布局分析能力。记住:没有绝对最好的模式,只有最适合当前场景的选择。从简单的车牌识别开始练习,逐步挑战复杂文档,很快您就能成为OCR布局分析的专家!
最后,关注公号"ITMan彪叔" 可以添加作者微信进行交流,及时收到更多有价值的文章。