文章目录

  • 前言
  • 一、安装Tesseract-OCR
  • 二、文档扫描
    • 1.需要透视变换的图像
    • 2.直接Tesseract-OCR
  • 总结

前言

这里实现文档扫描主要是依靠Tesseract,Tesseract是一个光学字符识别引擎。支持多种操作系统,基于Apache许可证的自由软件,由Google赞助开发。 Tesseract被认为是最精准的开源光学字符识别引擎之一。是一个光学字符识别引擎。支持多种操作系统,基于Apache许可证的自由软件,由Google赞助开发。 Tesseract被认为是最精准的开源光学字符识别引擎之一。

一、安装Tesseract-OCR

首先下载Tesseract安装包

链接:https://pan.baidu.com/s/1NGnl_ZOpUQ2403G9PPTjyg
提取码:2333

因为要识别中文,所以要勾选支持中文的语言包

chi_sim包含了简化汉字和英文字符,需要用到中文繁体的可以勾选Chinese(Traditional)

为了避免使用Tesseract-OCR报错,安装完成后需要将安装路径添加到环境变量中

Tesseract-OCR安装完成后还需要安装pytesseract包,直接pip就行

pip install pytesseract

安装完成后需要将tesseract_cmd的路径改为绝对路径,也就是安装Tesseract-OCR的路径

这样Tesseract-OCR的环境配置就完成了

二、文档扫描

经过我摸爬滚打踩坑过来发现,可以将扫描归为两大类,一类是图像中文档的文字位置不是水平(也就是倾斜,或者什么乱七八糟的),这一类在使用Tesseract-OCR之前需要进行图像预处理(比如透视变换);另外一类就是图像文字水平,这类图像直接使用Tesseract-OCR的效果要比图像预处理后再使用Tesseract-OCR要好。最后将识别到的内容保存到文档中。

1.需要透视变换的图像

透视变换就是将看起来歪歪扭扭的图像转换成规规矩矩的图像。类似这种图像的需要经过图像预处理后在使用Tesseract-OCR。

首先读入图像,因为图像太大了需要resize一下在处理,将图像转为灰度图,然后检测小票的轮廓,cv2.CHAIN_APPROX_SIMPLE是只保留轮廓的四个点,这样我们就得到了小票4个顶点的轮廓,在经过four_point_transform透视变换后就的到了适合Tesseract-OCR的图像。

透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为:
(u,v)为原始图像像素坐标,(x=x’/w’,y=y’/w’)为变换之后的图像像素坐标。透视变换矩阵图解如下:
代码

#导入工具包
import cv2
import argparse
import func
import pytesseract
#设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True,help = "Path to the image to be scanned")
args = vars(ap.parse_args())#读取图像
image = cv2.imread(args["image"])
#复制图像
orig = image.copy()
#修改图像大小
image = cv2.resize(image,(0,0),fx=0.2,fy=0.2)
#图像预处理
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#灰度图
gray = cv2.GaussianBlur(gray,(5,5),0)#高斯滤波
edg =cv2.Canny(gray,100,255)#边缘检测#展示处理结果
print("SETP 1:边缘检测")
func.cv_show("edg", edg)#轮廓检测
cnt,hierarchy =cv2.findContours(edg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#只保留顶点
cnts =sorted(cnt,key = cv2.contourArea,reverse = True)[:5]#轮廓由大到小排序,只保留五个#遍历轮廓
for c in cnts:#计算轮廓近似peri = cv2.arcLength(c,True)# C表示输入的点集# epsilon表示从原始轮廓到近似轮廓的最大距离,它是一个准确度参数# True表示封闭的approx = cv2.approxPolyDP(c, 0.02 * peri, True)#轮廓近似# 4个点的时候就拿出来if len(approx) == 4:screenCnt = approxbreak#展示结果
print("SETP 2:获取轮廓")
cv2.drawContours(image,[screenCnt],-1,(0,0,255),2)
func.cv_show("ima",image)# 透视变换
warped = func.four_point_transform(orig, screenCnt.reshape(4, 2)*5)
# 二值处理
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(warped, 100, 255, cv2.THRESH_BINARY)[1]
print("STEP 3: 透视变换")
ref = cv2.resize(ref,(0,0),fx=0.2,fy=0.2)
cv2.imwrite('scan.jpg', ref)
func.cv_show("ref",ref)
print("STEP 4: OCR文档识别")
text = pytesseract.image_to_string(gray,'chi_sim')
print(text)
#将文档保存
file_handle=open('test.docx',mode='w',encoding='utf-8')
file_handle.write(text)

效果:

可以看出基本识别还是可以识别出来的,效果就有点差强人意了。

2.直接Tesseract-OCR

类似这样的图像就可以直接使用Tesseract-OCR,因为我们之前安装了中文包,所以可以识别到中文。
代码:

#导入工具包
import cv2
import argparse
import func
import pytesseract
#设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True,help = "Path to the image to be scanned")
args = vars(ap.parse_args())#读取图像
image = cv2.imread(args["image"])
#复制图像
orig = image.copy()
#修改图像大小
image = cv2.resize(image,(0,0),fx=0.5,fy=0.5)
text = pytesseract.image_to_string(orig,'chi_sim')
print(text)
#将文档保存
file_handle=open('test.docx',mode='w',encoding='utf-8')
file_handle.write(text)

效果:
这个识别效果也是半斤八两,后续可以自己训练一个中文包,可以会有更好的效果。

总结

完整代码放到gitee上面了总的来说Tesseract还是很好用的,识别效果差很大原因是图像本来效果就差,用清晰的图片识别效果会更好。

Opencv实战——OCR文档扫描相关推荐

  1. OpenCV计算机视觉实战(Python)| 10、项目实战:文档扫描OCR识别

    文章目录 简介 总结 1. 介绍 2. 流程 3. 程序 4. 知识点总结 简介 本节为<OpenCV计算机视觉实战(Python)>版第10讲,项目实战:文档扫描OCR识别,的总结. 总 ...

  2. 【OpenCV】OCR文档识别

    文章目录 前言 一.pytesseract 二.PPOCR 三.百度API 四.TrWebOCR 总结 前言 OCR文档识别方法有多种,例如EasyOCR,PP-OCR,cnOCR,PP_OCR等. ...

  3. opencv图像处理—项目实战:文档扫描OCR识别

    目录 1.边缘检测 2.获取轮廓 3.变换 4.tesseract-OCR安装配置 5.使用pycharm运行检测 出现错误 1 出现错误2 出现错误3 出现问题4 完整代码 # 导入工具包 impo ...

  4. 实战:基于OpenCV实现偏斜文档校正

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|OpenCV学堂 纸质文档扫描中经常会发生扫描出来的图像有 ...

  5. OpenCV OCR实战 文档扫描与文字检测

    本文讲述使用OpenCV- python以及easyocr库实现文档扫描与文字检测的思路和具体实现过程. 目录 知识准备 项目概述 实现过程 代码讲解 1.读入图片并进行预处理(灰度转换,高斯滤波) ...

  6. opencv项目实战(2)——文档扫描OCR识别

    文章目录 思路 文档扫描 代码 运行结果 文字识别 预处理 代码 运行结果 Debug 记录 思路 STEP 1: 边缘检测 STEP 2: 获取轮廓 STEP 3: 变换 文档扫描 代码 scan. ...

  7. 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)

    人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...

  8. 计算机视觉-OpenCV(文档扫描OCR识别)

    一.边缘检测 二.获取轮廓 三.变换 四.OCR识别 import cv2 import numpy as np import argparse import pytesseract import o ...

  9. 项目实战——文档扫描OCR识别

    扫描全能王的实现,maybe 目录 一.文档扫描 1.引入所需要的库 2.图像的读取与预处理 读取图像 图像reszie, 图像灰度化.滤波.边缘检测. 3.轮廓检测 4.透视与二值变换 二.文字识别 ...

最新文章

  1. SQL Server 中master..spt_values的应用
  2. Windows server 2003 R2之三:通过域对统一部署客户端软件
  3. 面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病!
  4. 路由器和宽带路由器故障汇总!
  5. 【流媒體】jrtplib—VS2010 下RTP开源协议库JRTPLIB3.9.1编译
  6. chromedriver与chrome版本映射表
  7. 发挥游戏人工智能的最大价值:线程化
  8. loadrunner录制脚本,页面无法显示
  9. 【WebRTC---入门篇】(十四)WebRTC音视频录制
  10. Pick!闲鱼亿级商品库中的秒级实时选品
  11. redis-数据操作-键命令
  12. Linux入门学习(十一)
  13. css 语音,纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
  14. Tcp keepalive详解
  15. Xshell官网下载地址
  16. ureport 显示html,UReport2 与业务结合
  17. 硬件工程师需要掌握什么基础知识
  18. 你口口声声想要的自由
  19. 2020胡润80后白手起家富豪榜公布,掌门教育张翼强势登榜
  20. mysql 复制 1032_mysql slave复制1032错误解决方法

热门文章

  1. 修改pdf文件在浏览器里的标题
  2. 从互动直播到在线抓娃娃,实时视频超低延迟架构的思考与实践
  3. Magnetically actuated soft capsule robot for fine-needle biopsy
  4. 维达东南亚新总部正式投入运营;西门子能源在粤港澳大湾区持续深化务实合作 | 美通企业日报...
  5. Android 9.0 Toast源码改变引发的问题
  6. linux打开xml文件,查看 XML 文件
  7. Python代码画小鸭穿雨靴--turtle绘图
  8. display:flex 意思是弹性布局
  9. QQ、微信消息定时发送/自动发送【支持发送文件】
  10. 2021年秋招面经分享·平头哥【芯片设计/验证/DFT工程师】