zoukankan      html  css  js  c++  java
  • [转]基于OCR的图片字符识别可行性研究

    原文地址:http://blog.csdn.net/binbin_sun/article/details/52295170

    基于OCR的图片字符识别可行性研究

    1:概述

         纸张在许多地方已日益失宠,无纸化办公谈论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

    Python

    未知

     

    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:这是因为要接一个项目,是组长思密达让我做的相关调查,于是便尝试写一下,但是实际上看,由于大部分的方案都是开源的,部分识别率可以说的上是惨不忍睹,特别是对中文字符的识别。由于之后没有做这个项目,所以就暂时告一段落了。如果有人有好的方案,也可以推荐下,权当学习了!

     
  • 相关阅读:
    memcached命令
    模块管理常规功能自己定义系统的设计与实现(14--模块图表分析的设计)
    [易飞]凭证设计扩展字段之内容-文字显示格式
    将替代ListView的RecyclerView 的使用(一)
    POJ 2049— Finding Nemo(三维BFS)10/200
    最好用的jquery列表拖动排列(由项目提取)
    编程算法
    java几个easy出错的小程序
    GoldenGate配置(三)之DDL复制配置
    aused by: org.apache.xmlbeans.SchemaTypeLoaderException: XML-BEANS compiled schema: Incompatible min
  • 原文地址:https://www.cnblogs.com/Crysaty/p/6084996.html
Copyright © 2011-2022 走看看