当前位置:

首页 > 编程开发 > 基于Python+OpenCV实现文档扫描与OCR识别系统

基于Python+OpenCV实现文档扫描与OCR识别系统

本文目录

    一、项目简介 今天分享一个基于 Python + OpenCV 的文档扫描与OCR识别系统。这个项目可以自动检测文档边缘、进行透视变换校正,并使用 Tesseract OCR 提取文档中的文字内容。 项目效果: 输入:一张倾斜的文档照片输出:校正后的正面文档视图 + 识别出的文字内容 二、项目演示

    一、项目简介

    今天分享一个基于 Python + OpenCV 的文档扫描与OCR识别系统。这个项目可以自动检测文档边缘、进行透视变换校正,并使用 Tesseract OCR 提取文档中的文字内容。

    基于Python+OpenCV实现文档扫描与OCR识别系统

    项目效果:

    • 输入:一张倾斜的文档照片
    • 输出:校正后的正面文档视图 + 识别出的文字内容

    二、项目演示

    2.1 扫描流程

    • 原始图像 → 读取文档照片
    • 边缘检测 → 识别文档轮廓
    • 透视变换 → 校正为正面视图
    • 二值化处理 → 便于OCR识别

    2.2 OCR识别流程

    • 读取扫描图像 → 读取处理后的文档图像
    • 图像预处理 → 二值化或中值模糊
    • 文字识别 → 使用Tesseract提取文字
    • 输出结果 → 打印识别的文字内容

    三、技术栈

    技术用途
    Python编程语言
    OpenCV图像处理核心库
    NumPy数值计算
    Tesseract OCR文字识别引擎
    pytesseractTesseract Python封装
    Pillow图像读取

    四、项目结构

    Scan/

    ├── scan.py # 文档扫描核心模块

    ├── test.py # OCR文字识别模块

    ├── scan.jpg # 默认输入/输出图像

    ├── images/ # 示例图像目录

    │ ├── page.jpg # 示例文档图像

    │ └── receipt.jpg # 示例收据图像

    └── Tesseract-OCR/ # Tesseract OCR引擎(内置)

    五、核心代码详解

    5.1 文档扫描模块 (scan.py)

    5.1.1 角点排序函数

    def order_points(pts):
        # 初始化4个坐标点
        rect = np.zeros((4, 2), dtype = "float32")
        
        # 按顺序找到对应坐标:左上、右上、右下、左下
        s = pts.sum(axis = 1)
        rect[0] = pts[np.argmin(s)]  # 左上:x+y最小
        rect[2] = pts[np.argmax(s)]  # 右下:x+y最大
        
        diff = np.diff(pts, axis = 1)
        rect[1] = pts[np.argmin(diff)]  # 右上:x-y最小
        rect[3] = pts[np.argmax(diff)]  # 左下:x-y最大
        
        return rect

    原理:通过计算坐标点的和与差来确定四个角点的位置,确保顺序正确。

    5.1.2 透视变换函数

    def four_point_transform(image, pts):
        rect = order_points(pts)
        (tl, tr, br, bl) = rect
        
        # 计算目标宽度和高度
        widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
        widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
        maxWidth = max(int(widthA), int(widthB))
        
        heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
        heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
        maxHeight = max(int(heightA), int(heightB))
        
        # 变换后对应坐标位置
        dst = np.array([
            [0, 0],
            [maxWidth - 1, 0],
            [maxWidth - 1, maxHeight - 1],
            [0, maxHeight - 1]], dtype = "float32")
        
        # 计算变换矩阵
        M = cv2.getPerspectiveTransform(rect, dst)
        warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
        
        return warped

    原理:根据原始四个角点和目标矩形,计算透视变换矩阵,将倾斜的文档校正为正面视图。

    5.1.3 主流程

    # 1. 读取图像并缩放
    image = cv2.imread(args["image"])
    ratio = image.shape[0] / 500.0
    orig = image.copy()
    image = resize(orig, height = 500)
    
    # 2. 边缘检测
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (5, 5), 0)
    edged = cv2.Canny(gray, 75, 200)
    
    # 3. 轮廓检测
    cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]
    
    # 4. 找到四边形轮廓
    for c in cnts:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.02 * peri, True)
        if len(approx) == 4:
            screenCnt = approx
            break
    
    # 5. 透视变换和二值化
    warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)
    warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
    ref = cv2.threshold(warped, 100, 255, cv2.THRESH_BINARY)[1]
    cv2.imwrite('scan.jpg', ref)

    步骤说明:

    • 读取图像并按比例缩放
    • 灰度化 → 高斯模糊 → Canny边缘检测
    • 查找轮廓并按面积排序
    • 通过轮廓逼近找到四边形(文档边缘)
    • 进行透视变换和二值化处理

    5.2 OCR识别模块 (test.py)

    from PIL import Image
    import pytesseract
    import cv2
    import os
    
    preprocess = 'blur'  # thresh
    
    image = cv2.imread('scan.jpg')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 预处理
    if preprocess == "thresh":
        gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    elif preprocess == "blur":
        gray = cv2.medianBlur(gray, 3)
    
    # 调用Tesseract OCR
    filename = "{}.png".format(os.getpid())
    cv2.imwrite(filename, gray)
    pytesseract.pytesseract.tesseract_cmd = r'./Tesseract-OCR/tesseract.exe'
    text = pytesseract.image_to_string(Image.open(filename))
    print(text)
    os.remove(filename)

    预处理方式:

    • thresh:二值化处理,适用于对比度较高的图像
    • blur:中值模糊处理,适用于有噪点的图像

    六、安装与运行

    6.1 安装依赖

    pip install numpy opencv-python pytesseract pillow

    6.2 运行文档扫描

    # 使用默认图像
    python scan.py
    ​
    # 指定输入图像
    python scan.py -i images/page.jpg

    6.3 运行OCR识别

    python test.py

    七、使用技巧

    7.1 图像采集建议

    • 光线充足:避免阴影和反光
    • 对比度明显:文档与背景颜色差异大
    • 边缘清晰:文档边界完整可见
    • 适度距离:不要太近或太远

    7.2 参数调整

    • Canny边缘检测阈值:cv2.Canny(gray, 75, 200),根据图像调整
    • 轮廓逼近精度:0.02 * peri,值越小轮廓越接近原始
    • 二值化阈值:cv2.threshold(warped, 100, 255, ...),根据图像亮度调整

    八、常见问题

    Q1: OCR识别率低怎么办?

    A:尝试以下方法:

    1. 确保图像清晰,对比度高
    2. 调整预处理方式(thresh 或 blur)
    3. 检查图像是否倾斜或模糊
    4. 增加训练数据(添加中文训练数据支持中文识别)

    Q2: 轮廓检测不到文档边缘?

    A:可能原因:

    1. 文档与背景对比度不足
    2. 图像质量太差
    3. 调整Canny边缘检测阈值
    4. 尝试调整轮廓逼近参数

    Q3: 如何支持中文识别?

    A:下载中文训练数据 chi_sim.traineddata,放入 Tesseract-OCR/tessdata/ 目录,然后修改代码:

    text = pytesseract.image_to_string(Image.open(filename), lang='chi_sim')

    九、项目扩展

    批量处理:支持批量扫描多个文档

    图形界面:添加PyQt或Tkinter界面

    实时扫描:使用摄像头实时扫描

    多语言支持:添加多种语言的OCR训练数据

    文档分类:根据内容自动分类文档

    十、总结

    本文介绍了一个基于 Python + OpenCV 的文档扫描与OCR识别系统,通过边缘检测、轮廓提取、透视变换和OCR识别等技术,实现了从文档照片到文字提取的完整流程。

    核心知识点:

    • 图像预处理(灰度化、高斯模糊、边缘检测)
    • 轮廓检测与筛选
    • 透视变换校正
    • Tesseract OCR文字识别

    希望这个项目对大家有所帮助,如果有任何问题或建议,欢迎在评论区留言交流!

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发 Python
    相关文章 更多
    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。