OCR技术浅析-无代码篇(1)
图像识别中最贴近我们生活的可能就是 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)的更多相关文章
- OCR技术浅析-自写篇(2)
本例仅以本人浅薄理解,妄想自制文字识别程序,实际在识别部分未有完善. <?php class readChar{ private $imgSize; //图片尺寸 private $imgGd2 ...
- OCR技术浅析-tesserOCR(3)
tesserOCR使用 tesserOCR是文字识别软件(惠普公司开源) Optical Character Recognition (OCR)即光学字符辨识是把打印文本转换成一个数字表示的过程.它有 ...
- 深入浅出SharePoint2007——定制搜索之无代码篇
需求: 输入值,如果多行文本列包含此搜索关键字,显示对应的查询结果. 解决方案: 使用Form Web Part和Data form web part. 1 创建list,并创建3列 选中默认的lis ...
- 深入浅出SharePoint2010——请假系统无代码篇之权限设计
首选我们需要区分3个跟权限相关的概念. 权限项目(Permission):最小的权限粒度.比如创建列表项.审批等. 权限级别(Permission Level):权限项目不能直接赋予用户或者用户组,只 ...
- 深入浅出SharePoint2010——请假系统无代码篇之数据框架设计
文档库SOP:上传用户操作手册等系统相关文档. 员工信息列表EmployeeInfo:用来存储员工基本信息.直属领导和假卡信息. 请假申请列表LeaveRequest:申请人Requester填写请假 ...
- 深入浅出SharePoint2010——请假系统无代码篇之工作流设计
使用SharePoint Designer 2010进行设计. 主要使用的Actions如下图所示. 关于权限,考虑到严谨的权限设计,所以所有参与人员均为Read权限. 关于请假天数的计算,请假天数的 ...
- Python爬虫入门教程 56-100 python爬虫高级技术之验证码篇2-开放平台OCR技术
今日的验证码之旅 今天你要学习的验证码采用通过第三方AI平台开放的OCR接口实现,OCR文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的. 注册百度AI平台 官方网址:http:/ ...
- AI时代的OCR识别技术浅析
人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...
- 文本识别OCR浅析:特征篇
OCR技术浅探:特征提取(1) 研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究 ...
随机推荐
- 【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务
[.NET Core项目实战-统一认证平台]开篇及目录索引 一.什么是RPC RPC是"远程调用(Remote Procedure Call)"的一个名称的缩写,并不是任何规范化的 ...
- 第16章 使用ASP.NET Core Identity - Identity Server 4 中文文档(v1.0.0)
注意 对于任何先决条件(例如模板),首先要查看概述. IdentityServer旨在提供灵活性,其中一部分允许您为用户及其数据(包括账户密码)使用所需的任何数据库.如果您从新的用户数据库开始,那么A ...
- 使用表类型(Table Type-SqlServer)实现百万级别的数据一次性毫秒级别插入
使用表类型(Table Type)实现百万级别的数据一次性插入 思路 1 创建表类型(TaBleType) 2 创建添加存储过程 3 使用C#语言构建一个DataTab ...
- C#调用Oracle的存储过程时,连接字符串需要配置PLSQLRSet=1
C#调用Oracle的存储过程时, 如果有个SYS_REFCURSOR的Output参数存储时, web.config文件中的连接字符串需要配置PLSQLRSet=1, 否则可能会报这个错:参数个数或 ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
- JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 19 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- java-文件读取
1.利用递归读取文件 (1)NotifyFolder.java package com.etc; import java.io.File; import java.io.IOException; im ...
- HTML5跳转页面并传值以及localStorage的用法
1.首先,你得在那个页面把数据存入localStorage中吧.这个是必须的! localStorage.setItem("user",JSON.stringify(data.al ...
- iOS----------YYModel
weaterInfoModel *weather = [weaterInfoModel yy_modelWithDictionary:returnData[@"weatherinfo&quo ...
- python 第二百零八天 ----算法相关
查找方法 : 顺序查找法 二分查找法 import time,random #时间计算 def cal_time(func): def wrapper(*args,**kwargs) ...