当前位置: 首页 > news >正文

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

✅ 优点

  1. 高精度识别数学公式

    • 相比通用 OCR(如 Tesseract),LaTeX-OCR 针对数学符号、上下标、分式、矩阵等复杂结构优化,识别率更高。

    • 适合学术论文、教材、试卷等场景。

  2. 输出 LaTeX 代码

    • 可直接生成 LaTeX 格式,方便在 Overleaf、Markdown($E=mc^2$)等场景使用。

  3. 支持手写公式识别(部分工具)

    • 如 MyScriptMathpix Handwriting 可识别手写公式。

  4. 开源替代方案可用

    • 如 pix2tex(基于深度学习),可本地运行,无需依赖 API。


❌ 缺点

  1. 依赖清晰印刷体

    • 手写潦草或低分辨率图片识别率下降。

  2. 复杂公式可能出错

    • 嵌套结构(如多重积分、复杂矩阵)可能解析错误。

  3. 部分工具需要付费

    • Mathpix 免费版限制 100 次/月,商用需订阅。

  4. 训练数据要求高(自定义模型)

    • 如果需要训练自己的模型,需大量标注数据。


二、常用 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 通常分为以下阶段:

  1. 图像预处理 → 提升图像质量

  2. 文本检测(Text Detection) → 定位文本位置

  3. 文本识别(Text Recognition) → 识别文本内容

  4. 后处理(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

  • 手写识别

  • 文档分类

  • 批量处理

http://www.lryc.cn/news/603375.html

相关文章:

  • 译 | 介绍PyTabKit:一个试图超越 Scikit-Learn的新机器学习库
  • 如何查询并访问路由器的默认网关(IP地址)?
  • 主应用严格模式下,子应用组件el-date-picker点击无效
  • 【Dify】-进阶14- 用 Dify 搭建法律文档解析助手
  • Vue.js 指令系统完全指南:深入理解 v- 指令
  • 智能图书馆管理系统开发实战系列(一):项目架构设计与技术选型
  • Ubuntu上开通Samba网络共享
  • Ambari 3.0.0 全网首发支持 Ubuntu 22!
  • Kafka——消费者组重平衡全流程解析
  • cpolar 内网穿透 ubuntu 使用石
  • Spark SQL 数组函数合集:array_agg、array_contains、array_sort…详解
  • 【MySQL】从连接数据库开始:JDBC 编程入门指南
  • Vim与VS Code
  • 【CodeTop】每日练习 2025.7.29
  • LibTorch使用-基础版
  • Jetpack - Room(Room 引入、Room 优化)
  • Spring Boot 自动配置:从 2.x 到 3.x 的进化之路
  • 牛顿拉夫逊法PQ分解法计算潮流MATLAB程序计算模型。
  • 微信小程序私密消息
  • GaussDB 数据库架构师修炼(十) 性能诊断常用视图
  • 原生html+js+jq+less 实现时间区间下拉弹窗选择器
  • 鸿蒙网络编程系列59-仓颉版TLS回声服务器示例
  • 42、鸿蒙HarmonyOS Next开发:应用上下文Context
  • Apache Ignite 的分布式原子类型(Atomic Types)
  • 专业Python爬虫实战教程:逆向加密接口与验证码突破完整案例
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博文章数据可视化分析-文章评论量分析实现
  • Apache Ignite Cluster Groups的介绍
  • U3D中的package
  • 【PHP】Swoole:CentOS安装Composer+Hyperf
  • vue2 使用liveplayer加载视频