原文地址:http://blog.csdn.net/binbin_sun/article/details/52295170前端
基于OCR的图片字符识别可行性研究python
1:概述linux
纸张在许多地方已日益失宠,无纸化办公谈论40多年,办公环境正限制纸山的生成。而过去几年,无纸化办公的概念发生了显着的转变。在计算机软件的帮助下,包含大量重要管理数据和资讯的文档能够更方便的以电子形式储存。扫描文档的好处不纯粹是存档理由。为了访问基于纸张的信息和将信息整合进数字工做流,光学字符识别(OCR:Optical CharacterRecognition),相当重要。选择正确的OCR工具要基于特定需求而定,例如在线OCR服务对某些人有用,但可能存在隐私问题和文件大小限制。 OCR软件非大众产品,所以开源替代相对于商业级重量级产品相对较少,再加上OCR软件须要先进的算法将扫描的图像正确翻译成实际的文字,而图像不只仅含有文字,它还包含布局、图形和表格,可能会跨越多页。于是选择合适的OCR软件技术显得十分重要,不只能极大的提升效率,同时可以开源节流,长远看来是一项十分必须的工做。OCR,是一个可以将不一样类型的文档,如图像文件,扫描文档,图片转换为可编辑文档,从而使数据可搜索。读取其中有用的文字信息,进而方便下一步处理。本文主要介绍OCR技术的相关步骤和一些OCR可行性方案。算法
2:OCR字符识别原理编程
OCR的基本原理就是经过扫描仪将一份文稿的图像输入给计算机,而后由计算机取出每一个文字的图像,并将其转换成汉字的编码。其具体工做过程是,扫描仪将汉字文稿经过电荷耦合器件CCD将文稿的光信号转换为电信号,通过模拟/数字转换器转化为数字信号传输给计算机。计算机接受的是文稿的数字图像,其图像上的汉字多是印刷汉字,也多是手写汉字,而后对这些图像中的汉字进行识别。对于印刷体字符,首先采用光学的方式将文档资料转换成原始黑白点阵的图像文件,再经过识别软件将图像中的文字转换成文本格式,以便文字处理软件的进一步加工。其中文字识别是OCR的重要技术网络
一般的字符处理步骤主要由如下几个部分组成:数据结构
图一:OCR字符识别步骤机器学习
(1)图文输入:文档图像的扫描质量是OCR软件正确识别的前提条件。恰当地选择扫描分辨率及相关参数,是保证文字清楚、特征不丢失的关键。高质量的图像文件能大大提升图片字符识别率。文档应尽量地放置端正,以保证预处理检测的倾斜角小,在进行倾斜校订后,文字图像的变形就小。这些简单的操做,会使系统的识别正确率有所提升。反之,因为扫描设置不当,文字的断笔过多可能会分检出半个文字的图像。文字断笔和笔画粘连会形成有些特征丢失,在将其特征与特征库比较时,会使其特征距离加大,识别错误率上升编程语言
(2)预处理:预处理是指在进行文字识别以前的一些准备工做,包括图像净化处理,去掉原始图像中的显见噪声(干扰)。主要任务是测量文档放置的倾斜角,对文档进行版面分析,对选出的文字域进行排版确认,对横、竖排版的文字行进行切分,每一行的文字图像的分离,标点符号的判别等。这一阶段的工做很是重要,处理的效果直接影响到文字识别的准确率。对包含文字的图像进行处理以便后续进行特征提取、学习。这个过程的主要目的是减小图像中的无用信息,以便方便后面的处理。在这个步骤一般有:灰度化(若是是彩色图像)、降噪、二值化、字符切分以及归一化这些子步骤。字符识别通过二值化后,图像只剩下两种颜色,即黑和白,其中一个是图像背景,另外一个颜色就是要识别的文字了。降噪在这个阶段很是重要,降噪算法的好坏对特征提取的影响很大。字符切分则是将图像中的文字分割成单个文字——识别的时候是一个字一个字识别的。若是文字行有倾斜的话每每还要进行倾斜校订。归一化则是将单个的文字图像规整到一样的尺寸,在同一个规格下,才能应用统一的算法。工具
(3)单字识别:单字识别是体现OCR文字识别的核心技术。从扫描文本中分检出的文字图像,由计算机将其图形、图像转变成文字的标准代码,是让计算机“认字”的关键,也就是所谓的识别技术。要想让计算机来识别文字,也须要先将文字的特征等信息储存到计算机里,但要储存什么样的信息及怎样来获取这些信息是一个很复杂的过程。在识别过程当中,提取特征是重要的一步,这是决定识别文字正确与否的关键,每一个不一样的文字都能经过特征来和其余文字进行区分。对于数字和英文字母来讲,这个特征提取是比较容易的,由于数字只有10个,英文字母只有52个,都是小字符集。对于汉字来讲,特征提取比较困难,由于首先汉字是大字符集,国标中光是最经常使用的第一级汉字就有3755个;第二个汉字结构复杂,形近字多。在肯定了使用何种特征后,视状况而定,还有可能要进行特征降维,这种状况就是若是特征的维数过高(特征通常用一个向量表示,维数即该向量的份量数),分类器的效率会受到很大的影响,为了提升识别速率,每每就要进行降维,既要下降维数,同时使得减小维数后的特征向量还保留了足够的信息量(以区分不一样的文字)。经常使用的特征提取方法包括HOG,PCA等等。分类器主要用于识别,对一个文字图像,提取出特征后,送到分类器,分类器就对其进行分类,告诉你这个特征该识别成哪一个文字。在进行实际识别前,每每还要对分类器进行训练,这是一个监督学习的案例。一般状况下,因为具体状况的不一样,选择的分类器也不同,常常会用到的分类器包括,SVM,KNN等等。
(4)后处理:后处理是指对识别出的文字或多个识别结果采用词组方式进行上下匹配,即将单字识别的结果进行分词,与词库中的词组进行比较,以提升系统的识别率,减小误识率。汉字字符识别是文字识别领域最为困难的问题,它涉及模式识别、图像处理、数字信号处理、天然语言理解、人工智能、模糊数学、信息论、计算机、中文信息处理等学科,是一门综合性技术。
3:几种经常使用的OCR字符识别解决方案
下面介绍几种经常使用的OCR解决方案:
(1)Tesseract:Tesseract的OCR引擎最早由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也今后尘封。多年以后,HP将其贡献与开源软件业。Tesseract目前已做为开源项目发布在Google Project。Tesseract做为一个开源项目听从Apache2.0协议。开发者可以直接使用其API接口,用于从图像中提取打印,手写信息。同时,它支持绝大多数语言。
(2)OCRopus:Ocropus(TM)是一个先进的文件分析和OCR系统,采用可插入的布局分析,可插入的字符识别,天然语言统计建模和多语言支持功能。,若是须要使用,须要对图片作一些预处理。OCRopus是为Linux开发的,可是其在Mac os x 仍然得到不错的应用。OCRopus主要应用于大批量文件转换,还为桌面及办公使用。使用tesseract做为其惟一的字符识别插件,自身的引擎在0.4版本。
(3)freeORC:freeOCR是一个一样使用tesseract引擎的软件。很是简单,适用于多页TIFF文件,传真文件,和绝大多数图像类型。其原有引擎tesseract没法识别的一些压缩的tiff文件,它能够得到不错效果。
(4)GOCR:GOCR一个OCR项目,其开发基于GNU公用协议。GOCR可被用在不一样的前端,这使得其很是容易接入不一样的操做系统。同时它能打开许多不一样的图像格式。其对含噪音图片,角度变换,手写体没法得到较优结果。其最新一次更新在2013年.
(5) Cuneiform :Cuneiform 是一个 OCR 文字识别系统的商标,最开始是由Cognitive 技术所开发的运行在 Windows 下的软件。而这个项目是该软件在 Linux 系统下的移植版本。其受权协议为:BSD,开发语言为:C/C++。
上述的方案主要是基于现有系统,对不一样的OCR任务进行优化。除此以外,如今基于深度学习的,CNN(卷积神经网络)一样能够用来尝试解决OCR问题。有项目使用CNN识别车牌上的中文,识别率一样能够得到不错的效果。
以下表一是几种解决方案的对比:
方案 |
协议 |
支持系统 |
编程语言 |
支持语言 |
备注 |
Tesseract |
Apache |
Widows,Mac,Linux |
C/C++ |
100+(含中文) |
使用者较多 |
OCRopus |
Apache |
Linux |
未知 |
|
|
freeORC |
GPL |
Windows |
C# |
23 |
|
GOCR |
GPL |
Widows,Mac,Linux |
C |
未知 |
|
Cuneiform |
BSD |
Widows,Mac,Linux |
C/C++ |
28 |
商业级系统,可识别复杂表格 |
表一:几种解决方案的对比
4:结论及总结
针对字符识别,不一样的状况适用于不一样方案。有时须要根据具体问题,将不一样的算法结合以得到最优的识别结果。就识别发票而言,流程大致以下,首先且最重要的是得到清晰度足够的高的图片。同时图片中发票的位置应尽可能一致。在进行识别过程当中,应有些是重要信息,即那些目标区域是或是目标信息须要识别的,依此,图片将会进行分割。在目标区域,将会使用上述的一些方案进行字符识别。以后将识别结果进行输出。其实无论字符识别应用于何种场景,最终的目的都是为了准确的得到其目标信息。而在识别过程当中,目标信息不被不相干信息干扰则显得尤其重要。这也是OCR技术须要解决的重点和难点。就综合分析来看,Tesseract方案的可行性较高,能够尝试。
参考:
1:http://www.zhihu.com/question/20191727 知乎中相关介绍(侵删)
2:wiki
ps:这是由于要接一个项目,是组长思密达让我作的相关调查,因而便尝试写一下,可是实际上看,因为大部分的方案都是开源的,部分识别率能够说的上是惨不忍睹,特别是对中文字符的识别。因为以后没有作这个项目,因此就暂时告一段落了。若是有人有好的方案,也能够推荐下,权当学习了!