美文网首页
OCR文字识别原理

OCR文字识别原理

作者: paopaowuxie | 来源:发表于2019-08-15 16:54 被阅读0次

    首先介绍一个名词OCR(Optical Character Recognition,光学字符识别)。是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。

    OCR的应用领域:

    文字识别OCR通常应用在证件识别(身份证,驾驶证,护照,名片)、文档检索、截图识别(猿题库,作业帮)

    OCR对图片都做了什么:

    实际上我们预期的结果是把只有包含单个文字的图片交给计算机去翻译。
    机器是怎么看到纸质或者电子文档或是图片上的文字的呢?接下来看一下他的工作流程:
    首先要去掉杂质,这样程序就可以集中注意到文字上面。

    预处理

    预处理主要包括灰度化,二值化,噪声去除,倾斜矫正等。

    1. 灰度化:
      灰度图是只含亮度信息,不含色彩信息的图片。
      在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值。
      一般满足下面这个公式:
      Gray=0.299R+0.587G+0.114B 这种参数考虑到了人眼的生理特点
    原图.jpg 灰度图.jpg
    1. 二值化:非黑即白
      对摄像头拍摄的图片,大多数是彩色图像,彩色图像所含信息量巨大,对于图片的内容,我们可以简单的分为前景与背景,为了让计算机更快的,更好的识别文字,我们需要先对彩色图进行处理,使图片只前景信息与背景信息,可以简单的定义前景信息为黑色,背景信息为白色,这就是二值化图了。
      经过灰度处理的彩色图像还需经过二值化处理将文字与背景进一步分离开。
      二值化的过程中涉及到“阈值”的概念,简单来说就是想找到一个合适的值来作为一个界限,大于或小于这个界限的值变为白色或黑色即0或255。“阈值”是怎么选出来的?
      有很多方法,这里只介绍下面两种👇
      方法1:
      取阀值为127(相当于0~255的中数,(0+255)/2=127),让灰度值小于等于127的变为0(黑色),灰度值大于127的变为255(白色),这样做的好处是计算量小速度快,但是缺点也是很明显的,因为这个阀值在不同的图片中均为127,但是不同的图片,他们的颜色 分布差别很大,所以用127做阀值,这种一刀切,效果肯定是不好的。


      二值化效果图.GIF

      方法2:
      使用直方图方法(也叫双峰法)来寻找二值化阀值,直方图是图像的重要特质。直方图方法认为图像由前景和背景组成,在灰度直方图上,前景和背景都形成高峰,在双峰之间的最低谷处就是阀值所在。
      下图就可以将小于T的视为全部为黑色,大于T的为白色。


      图片来自网络.png
    2. 图像降噪:
      现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像降噪(Image Denoising)。
      在演示的过程中可以看到当二值化之后的图片会显示很多小黑点 ,这些都是不需要的信息,会对后面进行图片的轮廓切割识别造成极大的影响,降噪是一个非常重要的阶段,降噪处理的好坏直接影响了图片识别的准确率。
      最简单的叫做数据结构中学到的DFS或者BFS(深度和广度搜索)。我们对w*h的位图先搜索所有联通的区域(值为1的,我们看起来是黑色的,连接起来的区域)。所有联通区域算一个平均的像素值,如果某些联通区域的像素值远远低于这个平均值,我们就认为是噪点。然后用0代替他。


      点点.jpg
    1. 倾斜矫正:
      拍照或者选取的图片不可能完全是水平的,倾斜会影响后面切出来的图片,所以要对图片进行旋转
      倾斜矫正最常用的方法是霍夫变换,其原理是将图片进行膨胀处理,将断续的文字连成一条直线,便于直线检测。计算出直线的角度后就可以利用旋转算法,将倾斜图片矫正到水平位置。
    图片分割:

    对于一段多行文本来讲,文字切分包含了行切分与字符切分两个步骤,倾斜矫正是文字切分的前提。我们将倾斜矫正后的文字投影到 Y轴,并将所有值累加,这样就能得到一个在y轴上的直方图。
    下图是经过横向纵向切割后得到的效果。
    截取这篇文章的内容理解一下这个直方图https://blog.csdn.net/Print_lin/article/details/80143002

    图片来自网络.jpg 图片来自网络.jpg 像素图.png 切割.jpg
    最后文字识别:

    以上所有的步骤都是为了获取这一小块的图片 ,把每一部分的图片扫描的文字提取的特征向量与特征模板库进行模板粗分类和模板细匹配,识别出字符。

    识别.jpg

    本文图片预处理部分使用的是开源框架OpenCV,识别部分使用的是谷歌开源的第三方框架Tesseract.Tesseract不能识别手写,而且只能识别一共大约64种字体的文本。目前对中文的识别速度还是有点低。毕竟是国外的,对于中文还是差点,毕竟是免费的~~~。

    以上的总结参考并部分摘抄了以下文章,非常感谢以下作者的分享!:
    1、https://mp.weixin.qq.com/s?__biz=MzA3MDExNzcyNA==&mid=2650391990&idx=1&sn=a6f4607867441c60b00730afe53325a7
    2、https://mp.weixin.qq.com/s?__biz=MzA3MDExNzcyNA==&mid=402907292&idx=1&sn=889c4abcf576e24525ea6a705069c4de
    3、https://my.oschina.net/tigerBin/blog/1486966
    4、https://www.cnblogs.com/qcloud1001/p/8081438.html
    5、https://blog.csdn.net/antkillerfarm/article/details/52274740
    6、https://blog.csdn.net/Print_lin/article/details/80143002
    7、https://zhuanlan.zhihu.com/p/66301560

    相关文章

      网友评论

          本文标题:OCR文字识别原理

          本文链接:https://www.haomeiwen.com/subject/zufxjctx.html