1算法原理

OCR 的基本原理可分为:图像预处理、图像分割、字符识别和识别结果处理四个部分(如下图)。

1.1 图像预处理

对包含文字的图像进行处理以便后续进行特征提取、学习。这个过程的主要目的是减少图像中的无用信息,以便方便后面的处理。在这个步骤通常有:灰度化、降噪、二值化、字符切分以及归一化等子步骤。经过二值化后,图像只剩下 黑和白两种颜色。降噪在这个阶段非常重要,降噪算法的好坏对特征提取的影响 很大。字符切分则是将图像中的文字分割成单个文字——识别的时候是一个字一 个字识别的。如果文字行有倾斜的话往往还要进行倾斜校正。归一化则是将单个的文字图像规整到同样的尺寸,在同一个规格下,才能应用统一的算法。

1.2 图像分割

图像预处理之后,进行图像分割,常用的方法有阈值分割或边缘分割等方法。
·阈值分割:灰度阈值分割法是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。阈值分割方法实际上是输入图像 f 到输出图像 g 的如下变换:
G(i,j)={1G(i,j)≥T0G(i,j)<TG(i,j)=\left\{ \begin{array}{rcl} 1 & & {G(i,j)≥T}\\ 0 & & {G(i,j)<T}\\ \end{array} \right. G(i,j)={10​​G(i,j)≥TG(i,j)<T​其中, T 为 阈 值 ,对 于 物 体 的 元素G(i,j)=1 ,对 于 背 景 的 图 像 元 素 G(i,j)=0 。 由此可见,阈值分割算法的关键是确定阈值,如果能确定一个合适的阈值就可准 确地将图像分割开来。阈值确定后,将阈值与像素点的灰度值逐个进行比较,而 且像素分割可对各像素并行地进行,分割的结果直接给出图像区域。阈值分割的 优点是计算简单、运算效率较高、速度快。
·边缘分割:图像分割的一种重要途径是通过边缘检测,即检测灰度级或者结构具有突变的地方。这种不连续性称为边缘。不同的图像灰度不同,边界处一般有明显的边缘,利用此特征可以分割图像。 图像中边缘处像素的灰度值不连续,这种不连续性可通过求导数来检测到。 对于阶跃状边缘,其位置对应一阶导数的极值点,对应二阶导数的过零点。因此 常用微分算子进行边缘检测,常用的一阶微分算子有 Roberts 算子、Prewitt 算 子和 Sobel 算子,二阶微分算子有 Laplace 算子和 Kirsh 算子等。利用Laplace算子锐化结果如下:
其中T表示阈值常数。

在实际中各种微分算子常用小区域模板来表示,微分运算是利用模板和图像 卷积来实现。这些算子对噪声敏感,只适合于噪声较小不太复杂的图像。由于边 缘和噪声都是灰度不连续点,在频域均为高频分量,直接采用微分运算难以克服 噪声的影响。因此用微分算子检测边缘前要对图像进行平滑滤波。LoG 算子和 Canny 算子是具有平滑功能的二阶和一阶微分算子,边缘检测效果较好。其中 loG 算子是采用 Laplacian 算子求高斯函数的二阶导数,Canny 算子是高斯函数的一 阶导数,它在噪声抑制和边缘检测之间取得了较好的平衡。

1.3 特征提取和降维

特征是用来识别文字的关键信息,每个不同的文字都能通过特征来和其他文字进行区分。对于数字和英文字母来说,数据集比较小,数字有 10 个,英文字母有 52 个。对于汉字来说,特征提取比较困难,因为首先汉字是大字符集,国标中光是最常用的第一级汉字就有 3755 个;第二个汉字结构复杂,形近字多。 在确定了使用何种特征后,还有可能要进行特征降维,这种情况就是如果特征的维数太高,分类器的效率会受到很大的影响,为了提高识别速率,往往就要进行降维。 一种较通用的特征提取方法是 HOG。HOG 是方向梯度直方图,这里分解为方向梯度与直方图。具体做法是首先用[-1,0,1]梯度算子对原图像做卷积运算,得到 x 方向的梯度分量 gradscalx,然后用[1,0,-1]T 梯度算子对原图像做卷积运算,得到 y 方向的梯度分量 gradscaly。然后再用以下公式计算该像素点的梯度大小和方向:
Gx(x,y)、Gx(x,y)、H(x,y)分别表示输入图像像素点 ( x,y) 处的水平方向梯度、垂直方向梯度和像素值。像素点( x,y ) 处的梯度幅值和梯度方向分别为: 下一步是为局部图像区域提供一个编码,可以将图像分成若干个“单元格 cell”。我们采用 n 个扇形的直方图来统计这单元格的梯度信息,也就是将 cell 的梯度方向 360 度分成 n 个方向块,如下图:
这样,对 cell 内每个像素用梯度方向在直方图中进行加权投影(映射到固 定的角度范围),梯度大小就是投影的权值。然后把细胞单元组合成大的块 (block),块内归一化梯度直方图。我们将归一化之后的块描述符(向量)称 之为 HOG 描述符,即这个 cell 对应的 n 维特征向量。 最后一步就是将检测窗口中所有重叠的块进行 HOG 特征的收集,并将它们 结合成最终的特征向量供分类使用。

1.4 分类器设计

分类器是用来进行识别的,对于上一步,对一个文字图像,提取出特征值,传输给分类器,分类器就对其进行分类,输出这个特征该识别成哪个文字。一种简单的分类器器是模板匹配方法,它使用图像的相似度来进行文字识别,两图像的相似程度可以用以下方程表示:

其中A,B为图像矩阵。选取相关度最大的max{ri}作为最终输出结果。
得到结果后,我们有时需要对对识别结果处理,又称后处理。首先,分类器的分类有时候不一定是完全正确的,比如汉字中由于形近字的存在,很容易将一个字识别成其形近字。后处理中可以去解决这个问题,比如通过语言模型来进行校正——如果分类器将“在哪里”识别成“存哪里”,通过语言模型会发现“存哪里”是错误的,然后进行校正。第二个,OCR的识别图像往往是有大量文字的,而且这些文字存在排版、字体大小等复杂情况,后处理中可以尝试去对识别结果进行格式化。

2 算法步骤

步骤 实现功能
0 输入灰度或彩色图像
1 计算自适应阈值
2 获得二进制图像
3 进行连接成分分析
4 查找文字行和单词
5 识别字符轮廓
6 处理字体识别结果
7 输出识别的文本

3 python tesseract库原理

4算法代码

4.1 识别英文

# 导入PIL,pytesseract库
from PIL import Image
from pytesseract import image_to_string  # 读取待识别的图片
image = Image.open("5.jpg");
# 将图片识别为英文文字
text = image_to_string(image)
# 输出识别的文字
print(text)

4.2 中文段落识别

# 导入PIL,pytesseract库
from PIL import Image
from pytesseract import image_to_string  # 读取待识别的图片
image = Image.open("5.jpg");
# 将图片识别为英文文字
text = image_to_string(image)
# 输出识别的文字
print(text)

5 识别结果展示

5.1 英文识别

待识别英文图片

识别结果

5.2 中文识别

(1)待识别图片

识别结果

(2)待识别图片2

识别结果

(3)这个库很强大,甚至可以识别带色彩背景的图片

识别结果

如果这篇文章对您有用别忘了点赞哦!

基于python和tesseract库的中英文识别(OCR)相关推荐

  1. python人脸识别库_基于Python的face_recognition库实现人脸识别

    Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...

  2. 基于python的dlib库的人脸识别

    首先通过pip安装cmake,只有安装了cmake才能装上dlib库,建议装dlib的时候关闭后台的360杀毒软件. 源代码如下: import dlib import cv2 as cvimage_ ...

  3. python dlib opencv人脸识别准确度_基于dlib和opencv库的人脸识别

    基于dlib和opencv库的人脸识别 需下载68个特征点的人脸检测模型: http://dlib.net/files/ 文件名为shape_predictor_68_face_landmarks.d ...

  4. 基于Python通过OpenCV实现的口罩识别系统理论篇

    基于Python通过OpenCV实现的口罩识别系统理论设计篇 一.项目实现环境 基于Python 3.8.1版本 opencv-python 4.2.0.34版本 需要自己下载OpenCV的库文件,添 ...

  5. NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码

    NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码 目录 全部代码 相关文章 NLP之情感分析:基于python编程(jieba库)实现中文文本情 ...

  6. Python之PIL之绘图:基于Python的PIL库绘制各种图形、添加文字等

    Python之PIL之绘图:基于Python的PIL库绘制各种图形.添加文字等 目录 一.绘制各种形状各种案例 1.绘制矩形 2.绘制圆形.弧线形

  7. python如何安装wordcloud_基于python的wordcloud库的安装方法

    基于python的wordcloud是最近十分流行的一项技术,而在学习这门技术之前,一定要学会安装.下面给大家介绍一下wordcloud的安装步骤. Tip: python第三方组件有很多都是whl文 ...

  8. python的tesseract库几个重要的命令

    python的tesseract库几个重要的命令 在调用tesseract时,最重要的三个参数是 -l, -oem 和 -psm -l 参数控制识别文本的语言.可以通过命令 tesseract --l ...

  9. 《Python与硬件项目案例》— 基于Python的口罩检测与指纹识别签到系统设计

    <Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 目录 <Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 1 ...

  10. 《Python与硬件项目案例》— 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇)(期末大作业、课程设计、毕业设计、结课项目)

    目录 <Python与硬件项目案例>- 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇) 概述 参考代码 <Python与硬件项目案例>- 基于Python与 ...

最新文章

  1. lua sleep函数实现
  2. 【开发环境】安装 Visual Studio Ultimate 2013 开发环境 ( 下载软件 | 安装软件 | 运行软件 )
  3. CTFshow 信息收集 web8
  4. 银行业数据中心性能测试的策略与实践(PPT)
  5. 部分标点符号和数学符号的英文名字
  6. go benchmark 性能测试 单元测试 基准测试 使用方法详解
  7. C++总结8——shared_ptr和weak_ptr智能指针
  8. Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
  9. 12bit的图像如何向8bit转化_干货分享 | 如何鉴别Western Blot图像的真实性?
  10. flex4的新数据类型ArrayList
  11. access两位小数不进位_人教版小学数学三年级下册笔算乘法(不进位)公开课优质课课件教案视频...
  12. 深入学习golang—channel
  13. kettle中止是怎么用的_【Kettle】第一篇,Pan 的使用
  14. isis宣告网络_ISIS协议及其配置
  15. linux pam鉴定令牌错误,linux – chsh:PAM身份验证失败
  16. 什么是SOCKS5代理 它的原理是什么
  17. php验证码手册,验证码 - ThinkPHP 5.1 完全开发手册
  18. win10 便签显示设置
  19. 记忆测试系统java代码_JAVA课程设计——记忆测试系统(附源程序).doc
  20. shell实现除法计算器

热门文章

  1. 数字图像入门 色彩的抖动
  2. python课本图片_python爬虫当当网python书籍图片
  3. python推箱子游戏代码_推箱子游戏,推箱子游戏代码python实现
  4. Super-pack按键精灵安卓离线打包发布
  5. 《237 Gbit ps unrolled hardware polar decoder》237 Gbit / s展开的硬件极化解码器
  6. 红蓝药丸的选择:大脑在缸中还是颅中?
  7. 神器!亲自教大家一键用手机远程控制电脑,让手机秒变高配电脑!
  8. matplotlib4 --设置line的属性, color,linestyle, linewidth, marker等
  9. 影响力最大化 RIS 反向影响力采样算法
  10. ios键盘done中文_iOS键盘事件实现、控制