fastApi中的ocr
1. Tesseract
优点:
完全免费开源
支持100多种语言
可以本地运行,无需网络连接
适合简单的OCR需求
缺点:
准确率相对商业方案较低
对复杂布局(如表格)处理能力有限
需要自行训练以提高特定场景的准确率
接口常用方法:
由于Tesseract引入是以pytesseract进行封装引入的
tesseract下载路径Index of /tesseract,安装时勾选语言包 # 指定 tessdata 路径 os.environ['TESSDATA_PREFIX'] = r'E:\python\tesseract\tessdata' pytesseract.pytesseract.tesseract_cmd = r'E:\python\tesseract\tesseract.exe'
# 基本识别 text = pytesseract.image_to_string(Image.open("image.jpg"), lang="eng")# 获取文本框、置信度等详细信息 data = pytesseract.image_to_data(Image.open("image.jpg"), output_type=pytesseract.Output.DICT)# 仅识别数字 text = pytesseract.image_to_string(Image.open("image.jpg"), config="--psm 6 digits")# 获取 OCR 的 HOCR 输出(包含位置信息) hocr = pytesseract.image_to_pdf_or_hocr("image.jpg", extension="hocr")
多语言混合识别:
text = pytesseract.image_to_string(image, lang="eng+chi_sim")
输出格式控制:
image_to_boxes
: 返回字符边界框image_to_data
: 返回单词级信息(坐标、置信度)image_to_osd
: 检测方向和脚本
自定义配置文件:
创建config.txt
文件,内容如:tessedit_char_whitelist 0123456789 # 仅识别数字
调用时加载配置:
pytesseract.image_to_string(image, config="path/to/config.txt")
2. PaddleOCR
优点:
由百度开发的中文OCR效果优秀
支持中英文混合识别
轻量级模型可选
支持版面分析
相比 Tesseract,它在中文场景和复杂布局(如多方向文本、表格)上表现更优
缺点:
英文识别能力不如Tesseract
需要一定配置和依赖
核心功能与方法
(1) 单张图片识别(检测+识别)
# 识别图片文本(返回结果包含文本框坐标、文本内容、置信度) result = ocr.ocr("image.jpg", cls=True) # cls=True启用方向分类# 解析结果 for line in result:boxes = line[0] # 文本框坐标(4个点,格式:[x1,y1], [x2,y2], [x3,y3], [x4,y4])text = line[1][0] # 识别文本confidence = line[1][1] # 置信度(0~1)print(f"文本: {text}, 置信度: {confidence}, 位置: {boxes}")
(2) 仅文本检测
# 只检测文本位置(不识别内容) det_result = ocr.ocr("image.jpg", det=True, rec=False) for boxes in det_result:print("文本框坐标:", boxes[0]) # 输出检测框
(3) 仅文本识别
# 对已裁剪的文本区域进行识别(需提供单行文本图片) rec_result = ocr.ocr("cropped_text.jpg", det=False, rec=True) print("识别结果:", rec_result[0][1][0])
端到端OCR(检测+识别)
# 默认端到端模式 result = ocr.ocr("image.jpg", cls=True)# 保存可视化结果 image = draw_ocr("image.jpg", result, font_path="simfang.ttf") # 指定中文字体 image.save("output.jpg")
表格识别
from paddleocr import PPStructuretable_engine = PPStructure(recovery=True) # 恢复表格结构 result = table_engine("table.jpg") for region in result:print(region['type']) # 'table' 或 'text'print(region['res'])
多语言混合识别
# 需下载混合语言模型(如中英) ocr = PaddleOCR(lang="ch_en")
自定义字典
# 添加用户词典(如专业术语) ocr = PaddleOCR(rec_char_dict_path="custom_dict.txt")
3. EasyOCR
优点:
简单易用
支持80+语言
适合初学者
相比 Tesseract 和 PaddleOCR,它的优势在于 开箱即用、多语言支持和 简洁的 API
缺点:
准确率中等
模型较大
快速识别文本
import easyocr# 初始化 Reader(指定语言,例如英文和中文) reader = easyocr.Reader(['en', 'ch_sim']) # 'ch_sim' 是简体中文# 读取图片并识别文本 result = reader.readtext('image.jpg')# 打印结果 for detection in result:print(detection[1]) # 打印识别到的文本
输出示例:
[([[10, 20], [100, 20], [100, 50], [10, 50]], 'Hello', 0.99),([[50, 80], [200, 80], [200, 120], [50, 120]], '你好', 0.98)]
每个结果包含:
detection[0]
:文本框坐标(四个点的[x, y]
坐标)detection[1]
:识别的文本detection[2]
:置信度(0~1)
核心功能
(1) 多语言识别
EasyOCR 支持 80+ 种语言,例如:
reader = easyocr.Reader(['en', 'ch_sim', 'ja', 'ko', 'fr']) # 英文、中文、日文、韩文、法文
(2) 检测 + 识别
默认情况下,readtext()
会执行 文本检测(Detection) 和 文本识别(Recognition):
result = reader.readtext('image.jpg')
(3) 仅文本检测
bounds = reader.readtext('image.jpg', detail=0) # 只返回文本,不返回坐标和置信度
(4) 调整识别参数
result = reader.readtext('image.jpg',decoder='beamsearch', # 解码方式('greedy' 或 'beamsearch')beamWidth=5, # beamsearch 的宽度(越大越准,但越慢)batch_size=1, # 批处理大小(GPU 可增大)contrast_ths=0.1, # 对比度阈值(低对比度文本可能被忽略)adjust_contrast=0.5, # 自动调整对比度(0~1)width_ths=0.5, # 合并相邻文本框的宽度阈值height_ths=0.5, # 合并相邻文本框的高度阈值 )
3. 图像预处理优化
EasyOCR 内置预处理,但某些场景需手动优化:
(1) 调整对比度 & 亮度
import cv2image = cv2.imread('image.jpg') image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) image = cv2.equalizeHist(image) # 直方图均衡化 result = reader.readtext(image)
(2) 二值化(黑白处理)
_, binary_image = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY) result = reader.readtext(binary_image)
(3) 降噪(去模糊)
image = cv2.GaussianBlur(image, (3, 3), 0) # 高斯模糊去噪 result = reader.readtext(image)
(4) 批量识别(GPU 加速)
results = reader.readtext_batch(['img1.jpg', 'img2.jpg'], batch_size=2) # GPU 批处理
(5) 自定义模型路径
reader = easyocr.Reader(['en', 'ch_sim'],model_storage_directory='custom_models/', # 自定义模型存储路径download_enabled=False # 禁用自动下载模型 )
(6) 识别特定区域(ROI)
import numpy as npimage = cv2.imread('image.jpg') roi = image[100:300, 200:400] # 截取感兴趣区域 result = reader.readtext(roi)
4.LaTeX-OCR
✅ 优点
高精度识别数学公式
相比通用 OCR(如 Tesseract),LaTeX-OCR 针对数学符号、上下标、分式、矩阵等复杂结构优化,识别率更高。
适合学术论文、教材、试卷等场景。
输出 LaTeX 代码
可直接生成 LaTeX 格式,方便在 Overleaf、Markdown(
$E=mc^2$
)等场景使用。
支持手写公式识别(部分工具)
如 MyScript、Mathpix Handwriting 可识别手写公式。
开源替代方案可用
如 pix2tex(基于深度学习),可本地运行,无需依赖 API。
❌ 缺点
依赖清晰印刷体
手写潦草或低分辨率图片识别率下降。
复杂公式可能出错
嵌套结构(如多重积分、复杂矩阵)可能解析错误。
部分工具需要付费
Mathpix 免费版限制 100 次/月,商用需订阅。
训练数据要求高(自定义模型)
如果需要训练自己的模型,需大量标注数据。
二、常用 LaTeX-OCR 工具及方法
1. Mathpix(推荐,高精度)
安装与使用
import requests import base64# 使用 Mathpix API(需注册获取 app_id 和 app_key) def mathpix_ocr(image_path):with open(image_path, "rb") as f:img_base64 = base64.b64encode(f.read()).decode()headers = {"app_id": "YOUR_APP_ID","app_key": "YOUR_APP_KEY","Content-type": "application/json"}data = {"src": f"data:image/png;base64,{img_base64}", "formats": ["latex"]}response = requests.post("https://api.mathpix.com/v3/text", json=data, headers=headers)return response.json()["latex"]latex_code = mathpix_ocr("equation.png") print(latex_code) # 输出 LaTeX,如 "\frac{x}{y} = \sqrt{2}"
适用场景:学术论文、精准公式提取。
2. pix2tex(开源替代)
安装
pip install pix2tex[gui] # 安装带 GUI 的版本 pip install pix2tex[gui] -i https://pypi.tuna.tsinghua.edu.cn/simple #镜像版本
使用
from pix2tex.cli import LatexOCRmodel = LatexOCR() latex_code = model(Image.open("equation.png")) # 识别图片 print(latex_code) # 输出 LaTeX 代码
适用场景:本地免费使用,适合简单公式。
4. Tesseract + 自定义训练(低成本方案)
如果坚持使用 Tesseract,可尝试:
python
复制
下载
import pytesseract from PIL import Image# 预处理图片(二值化 + 增强对比度) img = Image.open("equation.png").convert("L") # 转灰度 pytesseract.image_to_string(img, config="--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789+-=(){}[]")
适用场景:简单印刷体公式,无复杂结构。
5.自研OCR
优点:
完全定制化(针对特定场景优化)
数据隐私可控(本地部署)
长期成本可控(无API调用费)
缺点:
需标注大量训练数据
开发周期长(模型训练/迭代)
维护成本高
适用场景:特殊格式(工业标签/手写体)、数据敏感领域
核心流程
自研 OCR 通常分为以下阶段:
图像预处理 → 提升图像质量
文本检测(Text Detection) → 定位文本位置
文本识别(Text Recognition) → 识别文本内容
后处理(Post-processing) → 矫正错误
2. 关键技术方法
(1) 图像预处理
目标:增强文本区域,抑制噪声。
灰度化:
import cv2 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
二值化(固定阈值/Otsu):
_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)
去噪(中值滤波/高斯模糊):
denoised = cv2.medianBlur(binary, 3)
边缘增强(CLAHE):
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) enhanced = clahe.apply(gray)
(2) 文本检测(Text Detection)
传统方法
MSER(最大稳定极值区域) + SWT(笔画宽度变换)
OpenCV 轮廓检测:
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours:x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
深度学习方法
CTPN(Connectionist Text Proposal Network) → 适合水平文本
EAST(Efficient and Accurate Scene Text Detector) → 支持多方向文本
DBNet(Differentiable Binarization Network) → 高精度二值化检测
YOLOv8/PP-YOLOE(检测+OCR 端到端) → 适用于特定场景(如车牌)
示例(使用 PaddleDetection):
from paddledetection import PPYOLOE model = PPYOLOE(model_dir='text_det_model') results = model.predict('image.jpg')
(3) 文本识别(Text Recognition)
深度学习方法
CRNN(CNN + RNN + CTC) → 经典序列识别
Transformer-based(如 TrOCR) → 高精度但计算量大
SVTR(百度自研) → 中文场景优化
示例(CRNN 训练):
import torch model = CRNN(num_classes=len(charset)) # 字符集大小 criterion = torch.nn.CTCLoss() optimizer = torch.optim.Adam(model.parameters())
6. MMOCR
优点:
支持多种语言和多种算法
各组件可灵活替换(如backbone、neck、head)
提供大量预训练模型
缺点:
资源消耗,部分模型(如SAR)需要较大显存
对结构化文档(如表格)支持有限
7.商业OCR软件
1. Adobe Acrobat Pro
PDF文档OCR
保持原始布局
多语言识别
2. ABBYY FineReader
表格识别准确率高
支持190+种语言
格式保留能力强
3. Readiris
手写识别
文档分类
批量处理