Tesseract OCR技术初探(Python调用)
一、Tesseract OCR技术解析
1.1 核心架构与发展历程
Tesseract是由HP实验室于1985年研发的光学字符识别引擎,2005年由Google开源并持续维护至今。其核心技术经历了三个阶段演进:
- 传统模式(v3.x):基于特征匹配算法,识别准确率约85%
- LSTM时代(v4.0):引入长短期记忆神经网络(LSTM),准确率提升至95%+
- 多模态融合(v5.0+):结合传统算法与深度学习模型,支持复杂版式分析
技术特性对比:
版本 引擎类型 语言支持 识别速度 适用场景
v3.x 模式匹配 60+语言 快 印刷体文档
v4.x LSTM 100+语言 中等 自然场景文本
v5.x 混合引擎 130+语言 较慢 表格、多语言混合
1.2 核心技术原理
Tesseract的工作流程分为五个核心阶段:
- 图像预处理:灰度化、二值化、噪声消除
- 版面分析:基于连通域检测的文本区域定位
- 行分割:利用投影法划分文本行
- 字符切分:动态规划算法优化字符边界
- 识别引擎:LSTM网络生成字符概率矩阵
二、环境配置与安装指南
tesseract ocr是独立一个程序,需要先将其安装到系统中,然后python上安装pytesseract才可以调用。
访问官网github
2.1 多平台安装流程
Windows系统
官方主要发力在Linux和Mac系统,Windows上的安装包是第三方提供的,目前最新是v5.4.0。
访问UB Mannheim镜像站下载最新安装包(推荐v5.4.0)
安装时勾选Additional language data并指定中文包
配置环境变量:
PATH添加:C:\Program Files\Tesseract-OCR
系统变量:TESSDATA_PREFIX=C:\Program Files\Tesseract-OCR\tessdata
Linux系统
sudo apt install tesseract-ocr libtesseract-dev
sudo apt install tesseract-ocr-chi-sim # 中文包
macOS系统
brew install tesseract
brew install tesseract-lang
2.2 Python依赖库安装
pip install pytesseract pillow opencv-python
验证安装:
import pytesseract
print(pytesseract.get_tesseract_version()) # 应输出5.4.0.20240606
三、简单文本识别
import pytesseract
def tesseract_ocr_simple(image):
config = (
'--oem 3 ' # 使用LSTM+传统引擎
'--psm 6 ' # 假定单行文本
'-c preserve_interword_spaces=1' # 保留空格
)
text = pytesseract.image_to_string(image, config=config)
return text.strip()
img_path = 'pic001.png'
result = tesseract_ocr_simple(img_path)
print(f"识别结果:{result}")
参数说明表:
参数 | 取值范围 | 作用描述 |
---|---|---|
–oem | 0-3 | 引擎模式(0=传统, 1=LSTM, 2=混合, 3=默认) |
–psm | 0-13 | 页面分割模式(详细说明见下表) |
-l | 语言代码 | 指定识别语言(如eng+chi_sim) |
PSM(Page Segmentation Modes)详细说明
值 | 模式名称 | 适用场景描述 |
---|---|---|
0 | OSD_ONLY | 仅执行方向和脚本检测 |
1 | AUTO_OSD | 自动页面分割(带OSD) |
2 | AUTO_ONLY | 自动页面分割(无OSD) |
3 | AUTO | 完全自动页面分割(默认) |
4 | SINGLE_COLUMN | 单列文本 |
5 | SINGLE_BLOCK_VERT_TEXT | 垂直对齐的单个文本块 |
6 | SINGLE_BLOCK | 单个文本块(默认用于单行) |
7 | SINGLE_LINE | 单行文本 |
8 | SINGLE_WORD | 单个单词 |
9 | CIRCLE_WORD | 圆形/弧形文本 |
10 | SINGLE_CHAR | 单个字符 |
11 | SPARSE_TEXT | 查找尽可能多的文本(稀疏分布) |
12 | SPARSE_TEXT_OSD | 稀疏文本带OSD |
13 | RAW_LINE | 将图像视为单个文本行(忽略换行符) |
使用建议:
- 常规文档:3(AUTO)或6(SINGLE_BLOCK)
- 单行文本:7(SINGLE_LINE)
- 验证码识别:8(SINGLE_WORD)或10(SINGLE_CHAR)
- 不规则排列文本:11(SPARSE_TEXT)
四、图像预处理技术
4.1 OpenCV预处理流程
预处理是个大学问,如下只是简单的示例。
import cv2
def preprocess_image(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
denoised = cv2.medianBlur(binary, 3)
return denoised
processed_img = preprocess_image('low_contrast.jpg')
4.2 多维度优化策略
几何校正(倾斜矫正):
def deskew(image):
coords = np.column_stack(np.where(image > 0))
angle = cv2.minAreaRect(coords)[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
M = cv2.getRotationMatrix2D((w//2, h//2), angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
return rotated
对比度增强:
alpha = 1.5 # 对比度系数
beta = 30 # 亮度调整
adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
五、中文识别
如果安装时没用将中文识别库带上,也不要着急,可以将中文库下载放到Tessercact路径下的tessdata文件夹中。
chi_sim.traineddata可以到官网下载,不方便也可以到csdn的资源中下载。
使用时需在配置中增加语言选项,如下面例子:
def tesseract_ocr_chinese(image):
config = (
'--oem 3 ' # 使用LSTM+传统引擎
'--psm 6 ' # 假定单行文本
'-l chi_sim+eng+num' # 中文+英文+数字的识别
'-c preserve_interword_spaces=1' # 保留空格
)
text = pytesseract.image_to_string(image, config=config)
return text.strip()
六、高级应用场景
5.1 结构化数据提取
要想获得文字的位置和识别的置信度,需要使用结构化数据的方式提取。
from pytesseract import Output
data = pytesseract.image_to_data(img, output_type=Output.DICT)
for i, word in enumerate(data['text']):
if word.strip():
print(f"Word {i}: {word}")
print(f"Position: ({data['left'][i]}, {data['top'][i]})")
print(f"Confidence: {data['conf'][i]}%")
输出数据:
Word 4: NAME
Position: (34, 31)
Confidence: 96%
Word 6: .github
Position: (34, 75)
Confidence: 54%
Word 10: emake
Position: (33, 120)
Confidence: 8%
5.2 验证码识别实战
def captcha_recognize(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
custom_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
text = pytesseract.image_to_string(gray, config=custom_config)
return text
最后
从默认中英文识别库的测试来看,识别率并不高。看来要使用它商用,必须要自己训练不可了。