图像识别中最贴近我们生活的可能就是 OCR 技术了。 OCR 的定义:OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。

今天就来简单分析下 OCR 技术的原理。

从整体上来说,OCR一般分为两个大步骤:图像处理以及文字识别。

图像处理

识别文字前,我们要对原始图片进行预处理,以便后续的特征提取和学习。这个过程通常包含:灰度化、二值化、降噪、倾斜矫正、文字切分等子步骤。每一个步骤都涉及了不同的算法。我们以下面这张原始图片为例,进行每个步骤的讲解。

1.灰度化

灰度化(gray processing),在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。说通俗一点,就是将一张彩色图片变为黑白图片。

灰度化一般有分量法、最大值法、平均值法、加权平均法四种方法对彩色图像进行灰度化。

2.二值化

一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(binaryzation)。

二值化的黑白图片不包含灰色,只有纯白和纯黑两种颜色。

二值化里最重要的就是阈值的选取,一般分为固定阈值和自适应阈值。 比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等。

3.图像降噪

现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像降噪(Image Denoising)。

图像中噪声的来源有许多种,这些噪声来源于图像采集、传输、压缩等各个方面。噪声的种类也各不相同,比如椒盐噪声,高斯噪声等,针对不同的噪声有不同的处理算法。

在上一步得到的图像中可以看到很多零星的小黑点,这就是图像中的噪声,会极大干扰到我们程序对于图片的切割和识别,因此我们需要降噪处理。降噪在这个阶段非常重要,降噪算法的好坏对特征提取的影响很大。

图像降噪的方法一般有均值滤波器、自适应维纳滤波器、中值滤波器、形态学噪声滤除器、小波去噪等。

4.倾斜矫正

对于用户而言,拍照的时候不可能绝对的水平,所以,我们需要通过程序将图像做旋转处理,来找一个认为最可能水平的位置,这样切出来的图,才有可能是最好的一个效果。

倾斜矫正最常用的方法是霍夫变换,其原理是将图片进行膨胀处理,将断续的文字连成一条直线,便于直线检测。计算出直线的角度后就可以利用旋转算法,将倾斜图片矫正到水平位置。

5.文字切分

对于一段多行文本来讲,文字切分包含了行切分与字符切分两个步骤,倾斜矫正是文字切分的前提。我们将倾斜矫正后的文字投影到 Y轴,并将所有值累加,这样就能得到一个在y轴上的直方图。

直方图的谷底就是背景,峰值则是前景(文字)所在的区域。于是我们就将每行文字的位置给识别出来了。

字符切分和行切分类似,只是这次我们要将每行文字投影到 X轴。

但要注意的是,同一行的两个字符往往挨的比较紧,有些时候会出现垂直方向上的重叠,投影的时候将他们认为是一个字符,从而造成切割的时候出错(多出现在英文字符);也有些时候同一个字符的左右结构在X轴的投影存在一个小间隙,切割的时候误把一个字符切分为两个字符(多出现在中文字符)。所以相较于行切分,字符切分更难。

对于这种情况,我们可以预先设定一个字符宽度的期望值,切出的字符如果投影超出期望值太大,则认为是两个字符;如果远远小于这个期望值,则忽略这个间隙,把间隙左右的“字符”合成一个字符来识别。

文字识别

预处理完毕后,就到了文字识别的阶段。这个阶段会涉及一些人工智能方面的知识,比较抽象,没法用图片表达,我尽量讲得简单易懂一些。

1.特征提取和降维

特征是用来识别文字的关键信息,每个不同的文字都能通过特征来和其他文字进行区分。对于数字和英文字母来说,这个特征提取是比较容易的,总共就 10 + 26 x 2 = 62 个字符,而且都是小字符集。对于汉字来说,特征提取的难度就比较大了,因为首先汉字是大字符集;其次国标中光是最常用的第一级汉字就有3755个;最后汉字结构复杂,形近字多,特征维度就比较大。

在确定了使用何种特征后,还有可能要进行特征降维,这种情况下,如果特征的维数太高,分类器的效率会受到很大的影响,为了提高识别速率,往往就要进行降维,这个过程也很重要,既要降低特征维数,又得使得减少维数后的特征向量还保留了足够的信息量(以区分不同的文字)。

2.分类器设计、训练

对一个文字图像,提取出特征,丢给分类器,分类器就对其进行分类,告诉你这个特征该识别成哪个文字。分类器的设计就是我们的任务。分类器的设计方法一般有:模板匹配法、判别函数法、神经网络分类法、基于规则推理法等,这里不展开叙述。在进行实际识别前,往往还要对分类器进行训练,这是一个监督学习的过程。成熟的分类器也有很多,有 SVM,CNN 等。

后处理

其实就是对于分类器的分类结果进行优化,这一般就要涉及自然语言理解的范畴了。

首先是形近字的处理:举个栗子,“分”和“兮”形近,但是如果遇到“分数”这个词语,就不应该识别为“兮数”,因为“分数”才是一个正常词语。这需要通过语言模型来进行纠正。

其次是对于文字排版的处理:比如一些书籍是分左右两栏的,同一行的左右两栏不属于同一句话,不存在任何语法上的联系。如果按照行切割,就会把左行的末尾和右行的开头连在一起,这是我们不希望看到的,这样的情况需要进行特殊处理。

已有开源类库:tesseract-ocr

OCR技术浅析-无代码篇(1)的更多相关文章

  1. OCR技术浅析-自写篇(2)

    本例仅以本人浅薄理解,妄想自制文字识别程序,实际在识别部分未有完善. <?php class readChar{ private $imgSize; //图片尺寸 private $imgGd2 ...

  2. OCR技术浅析-tesserOCR(3)

    tesserOCR使用 tesserOCR是文字识别软件(惠普公司开源) Optical Character Recognition (OCR)即光学字符辨识是把打印文本转换成一个数字表示的过程.它有 ...

  3. 深入浅出SharePoint2007——定制搜索之无代码篇

    需求: 输入值,如果多行文本列包含此搜索关键字,显示对应的查询结果. 解决方案: 使用Form Web Part和Data form web part. 1 创建list,并创建3列 选中默认的lis ...

  4. 深入浅出SharePoint2010——请假系统无代码篇之权限设计

    首选我们需要区分3个跟权限相关的概念. 权限项目(Permission):最小的权限粒度.比如创建列表项.审批等. 权限级别(Permission Level):权限项目不能直接赋予用户或者用户组,只 ...

  5. 深入浅出SharePoint2010——请假系统无代码篇之数据框架设计

    文档库SOP:上传用户操作手册等系统相关文档. 员工信息列表EmployeeInfo:用来存储员工基本信息.直属领导和假卡信息. 请假申请列表LeaveRequest:申请人Requester填写请假 ...

  6. 深入浅出SharePoint2010——请假系统无代码篇之工作流设计

    使用SharePoint Designer 2010进行设计. 主要使用的Actions如下图所示. 关于权限,考虑到严谨的权限设计,所以所有参与人员均为Read权限. 关于请假天数的计算,请假天数的 ...

  7. Python爬虫入门教程 56-100 python爬虫高级技术之验证码篇2-开放平台OCR技术

    今日的验证码之旅 今天你要学习的验证码采用通过第三方AI平台开放的OCR接口实现,OCR文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的. 注册百度AI平台 官方网址:http:/ ...

  8. AI时代的OCR识别技术浅析

    人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...

  9. 文本识别OCR浅析:特征篇

    OCR技术浅探:特征提取(1) 研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究 ...

随机推荐

  1. spring-boot-2.0.3源码篇 - pageHelper分页,绝对有值得你看的地方

    前言 开心一刻 说实话,作为一个宅男,每次被淘宝上的雄性店主追着喊亲,亲,亲,这感觉真是恶心透顶,好像被强吻一样.........更烦的是我每次为了省钱,还得用个女号,跟那些店主说:“哥哥包邮嘛么叽. ...

  2. ruby中to_s和to_str、to_i和to_int、to_a和to_ary、to_h和to_hash的解释说明

    包括to_s和to_str.to_i和to_int.to_a和to_ary.to_h和to_hash.统称为to_x和to_xxx. 那么,to_x和to_xxx的区别是什么,什么时候使用to_x,什 ...

  3. DSAPI多功能组件编程应用-网络相关(上)

    [DSAPI.DLL下载地址]  DSAPI多功能组件编程应用-网络相关,网络相关编程有很多很多,这里讲解一下封装在DSAPI中的网络相关的功能,这些都是本人简化到极点的功能了,可以在软件开发过程中节 ...

  4. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

  5. 在虚拟机中搭建qduoj(二)——安装OJ

    在上一章中,我们已经做好了准备工作,现在,正式开始搭建OJ. 可以先看看官方文档: https://github.com/QingdaoU/OnlineJudgeDeploy/tree/2.0 运行p ...

  6. 后端开发者的Vue学习之路(二)

    目录 上篇内容回顾: 数据绑定 表单输入框绑定 单行文本输入框 多行文本输入框 复选框checkbox 单选框radio 选择框select 数据绑定的修饰符 .lazy .number .trim ...

  7. SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!

    SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空! 如下预留, 批次号字段为空. 实际上该物料是有激活batch management的, For MB21, it is just ...

  8. ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC控制器简介 ASP.NET Core MVC控制器操作简介 ASP.NET Core MVC控制器操作简介返回类型简介 ASP.NET C ...

  9. WordCount

    一.Gitee地址:https://gitee.com/zjgss99/WordCount 二.项目分析: 对程序设计语言源文件统计字符数.单词数.行数,统计结果以指定格式输出到默认文件中,以及其他扩 ...

  10. VS2015 IIS Express Web服务器无法启动解决办法

    1.运行和调试vs2015项目 提示无法运行项目,打开vs2013项目发现可以正常运行,所以推测试vs2015项目配置有问题. 2.找到项目启动项中 .csproj文件,定位到<WebProje ...