发票编号识别、验证码识别 ,图像分割


向AI转型的程序员都关注了这个号👇👇👇html

机器学习AI算法工程  公众号: datayxpython


这个demo的初衷不是去识别验证码,是把验证的图像处理方式用到其余方面,车票,票据等。程序员


本文完整源码 获取方式:web

关注微信公众号 datayx  而后回复 图像识别 便可获取。面试


这里最后作了一个发票编号识别的的案例:算法

地址:http://v.youku.com/v_show/id_XMTI1MzUxNDY3Ng==.html数据库


demo中包含一个验证码识别处理过程的演示程序,一个自动识别工具类库,还有一个发票识别的演示程序flask









用了7个网站的图形验证码作为案例,固然仍是有针对性的,避开了粘连,扭曲太厉害的:数组



最终的识别率:微信




  •  在验证码图像的处理过程当中,涉及验证码生成,灰度处理,背景色去除,噪点处理,二值化过程,图片字符分割,图片归一化,图片特征码生成等步骤;

     

灰度处理方式主要有三种:

  1. 最大值法: 该过程就是找到每一个像素点RGB三个值中最大的值,而后将该值做为该点的

  2. 平均值法:该方法选灰度值等于每一个点RGB值相加去平均

  3. 加权平均值法:人眼对RGB颜色的感知并不相同,因此转换的时候须要给予三种颜色不一样的权重





背景去除

该过程就是将背景变成纯白色,也就是尽量的将目标字符以外的颜色变成白色。该阶段最难的就是肯定图片的背景和前景的分割点,就是那个临界值。由于要将这张图片中每一个像素点R值(灰度处理后的图片RGB的值是相同的)大于临界值的点RGB值都改为255(白色)。而这个临界点在整个处理过程当中是不变的。


能区分前景和背景,说明在该分割点下,前景和背景的分别最明显,就像一层玻璃,将河水分红上下两部分,下面沉淀,相对浑浊,上面清澈,这样,两部分区别至关明显。这个片玻璃的所在位置就是关键。



经常使用临界点阈值肯定算法

  1. 双峰法,这种算法很简单,假设该图片只分为前景和背景两部分,因此在灰度分布直方图上,这两部分会都会造成高峰,而两个高峰间的低谷就是图片的前景背景阈值所在。这个算法有局限性,若是该图片的有三种或多种主要颜色,就会造成多个山峰,很差肯定目标山谷的所在,尤为是验证码,多种颜色,灰度后也会呈现不一样层次的灰度图像。故本程序没有采用这种算法。

  2. 迭代法,该算法是先算出图片的最大灰度和最小灰度,取其平均值做为开始的阈值,而后用该阈值将图片分为前景和背景两部分,在计算这两部分的平均灰度,取平均值做为第二次的阈值,迭代进行,直到本次求出的阈值和上一次的阈值相等,即获得了目标阈值。

  3. 最大类间方差法,简称OTSU,是一种自适应的阈值肯定的方法,它是按图像的灰度特性,将图像分红背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差异越大,当部分目标错分为背景或部分背景错分为目标都会致使2部分差异变小。所以,使类间方差最大的分割意味着错分几率最小。而该方法的目标就是找到最符合条件的分割背景和目标的阈值。本程序也是采用的该算法进行背景分离的。

  4. 灰度拉伸算法,这是OTSU的一种改进,由于在前景背景差异不大的时候,OTSU的分离效果就会降低,此时须要增长前景背景的差异,这是只要在原来的灰度级上同时乘以一个系数,从而扩大灰度的级数。



噪点判断及去除

首先是去除边框,有的验证码在图片边界画了一个黑色边框,根据去背景的原理这个边框是没有被去掉的。去除这个边框很简单,对加载到二维数组中每一个像素点进行判断,若是该点的横坐标等于0或者图片宽度减一,或者总坐标等于0或者纵坐标等于图片高度减一,它的位置就是边框位置。直接RGB置0去除边框。


对于非边框点,判断该目标像素点是否是噪点不是直接最目标点进行判断的,是观察它周围的点。以这个点为中心的九宫格,即目标点周围有8个像素点,计算这8个点中不是背景点(即白色)点的个数,若是大于给定的界定值(该值和没中验证码图片噪点数目,噪点粘连都有关,不能动态获取,只能根据处理结果对比找到效果好的值),则说明目标点是字符内某个像素点的概率大些,古改点不能做为噪点,不然做为噪点处理掉。假设这次的界定值是2,则:






二值化

二值化区别于灰度化,灰度化处理过的图片,每一个像素点的RGB值是同样的,在0-255之间,可是二值化要求每一个像素点的RGB值不是0就是255.将图片完全的黑白化。


二值化过程就是对去噪后的验证码图片的每一个像素点进行处理,若是该点的R值不是255,那么就将该点的RGB值都改为0(纯黑色),这样整个过程下来,这正图片就变成真正意义上的黑白图片了。






图片分割

图片分割的主要算法


图片分割技术在图形图像的处理中占有很是重要的地位,图片是一个复杂的信息传递媒介,相应的,不是每一个图片上的全部信息都是预期想要的,因次,在图片上”筛选“出目标区域图像就显得很重要,这就用到了图片分割技术。

图片字符的分割是验证码识别过程当中最难的一步,也是决定识别结果的一步。无论多么复杂的验证码只要能准确的切割出来,就都能被识别出来。分割的方式有多种多样,对分割后的精细处理也复杂多样。

下面介绍几种成熟的分割算法:

  1. 基于阈值的分割,这种分割方式在背景处理中已经用到,经过某种方式找到目标图片区域和非目标图片区域间的分界值,进而达到将两个区域分离的目的,这种方式达不到区分每一个字符的效果,因此在分割阶段没有采用。

  2. 投影分割,也叫作基于区域的分割,这种分割算法也很简单,就是将二值化后的图片在X轴方向作一次像素点分布的投影,在峰谷的变化中就能定位到每一个目标区域了,而后对单个区域进行Y轴投影,进而肯定区域位置。该方式对轻微粘连有必定的处理效果,可是,对与噪点会也会产生过度的分割,还有对‘7’,‘T’,‘L’等会产生分割偏差,因此,程序中没有采用这种算法。



  1. 边缘检测分割,也叫作点扫描法,这种分割方式能必定程度知足程序的要求,所以,本程序也是采用了这种分割算法,后面会详细介绍。


  2. 聚类,聚类法进行图像分割是将图像空间中的像素用对应的特征空间点表示,根据它们在特征空间的汇集对特征空间进行分割,而后将它们映射回原图像空间,获得分割结果。这种方式处理复杂,可是对粘连,变形等复杂图像处理有良好的效果。因为时间有限,本次课题并无对该方式进行深刻分析实现。


3.6.2边缘检测分割算法

程序采用的是边缘检测的方式肯定每一个字符边界的。该算法的步骤以下:


图片分割示意图



从图中能够看到,当程序判断”6“这个字符的边界时:

  1. 从扫描指针从图片最左边像素点X轴坐标为0开始,向下扫描,扫描宽度为1px,若是碰到了像素点R值是0的,记下此时X坐标A ,若是扫描到底部都没有遇到,则从指针向右移动一位,继续纵向扫描直到获得A。

  2. 扫描指针从A+1开始,纵向扫描每一个像素点,遇到R值是255的,变量K(初始值0)自增一,扫描到底部判断K的值,若是K值等于图片高度,则中止后续扫描,记下此时X轴坐标B,不然指针向右移动一位,继续扫描直到获得B。

  3. 在X区间(A,B-1)中,指针从Y坐标是0点横向扫描,判断每一个点的R值,若是R值等于0,则中止扫描,记下此时Y轴坐标C。不然,指着下移一个单位,继续横向扫描

  4. 在X区间(A,B-1),指针从C+1处开始横向扫描,判断每一个像素点的R值,若是R值等于255,使N(初始值0)自增一,这行扫描结束后判断N的值,若是该值等于B-A,则中止扫描记下此时的Y轴坐标D,不然指针向下移动觉得,继续横向扫描,知道获得D。

“4“这个字符边界的获取也是同样的,只是步骤一中扫描开始的位置X坐标0变成了B+1.


每次判断一下B-A,若是他的值小于你验证码字符中宽度最小的那个,(假设这里定的是4),则中止找边界把坐标加到集合中就能够了。

如学校的验证码字符中,宽度最窄的是1,但它的宽度是大于4的因此该设定没有问题,根据状况来定,通常宽度小于4的,验证码就很小了,不利于人看。


上述过程走完以后,就获得了左右,上下四个边界点的横坐标,纵坐标,即(A,B-1,C ,D-1);把这四个点肯定的区域对应的原验证码所在的区域画到一张小图片上。而后把这张小图片按照设定的高宽进行归一化处理,把处理好的图片放入集合中返回。等待下一步处理。




这也不是咱们理想的状况,也是一样的道理,把两部分中中间剁开,获得4个小图片。

还有这种状况,第一次切割彻底是一张的:



咱们只需把它均分4分就能够了。

固然上述处理会形成相应的偏差,可是只要后面字模数量足够大,这样切割处理效果仍是能够的。


这次只对4个字符的状况作了特殊的处理,其余个数的没有作,具体作法会在总结中介绍。



字模制做

这个过程是将切割好的图片转化成特征矩阵,把图片切割过程当中返回的小图片集合进行特征值获取。在图片切割过程,程序已经将切割好的小图片进行了归一化处理,即长宽都相同,遍历每个像素,若是该点R值是255,则就记录一个0,若是该点的R值是255,则记录一个1,这样按着顺序,记录好的0,1拼成字符串,这个字符串就是该图片的特征码。而后前面拼上该图片对应的字符,用‘--’链接。这样,一个图片就有一个特征值字符串对应了,把这个特征值字符串写入文本或数据库中,基本的字模库就创建好了。因为图片归一化的时候小图规格是20*30,因此,每一个字模数据就是20*30+3+2(回车换行)=605个字符。


字模库的量越大,后面的识别正确率也就越高,可是,并非越大越好,字模数据越多,比对消耗的时间就越多,相比来讲效率就会降低。下面是一张字模库的部分图样:





验证码识别

要想识别验证码,必需要有制做好的字模数据库,而后一次进行下面过程:

  1. 验证码图片的获取,该步骤验证码的来源能够是从网络流中获取验证码,  也能够从磁盘中加载图片。

  2. 图片处理,包括灰度,去噪,去背景,二值化,字符分割,图片归一化,图片特征码获取。

3.计算类似度,读取字模数据库中的字模数据,用归一化后的小图的特征码和字模数据进行对比,并计算类似度,记录类似度最高的字模数据项所对应的字符C。

4.识别结果,依次将所获得的字符C拼接起来,获得的字符串就是该验证码的识别结果。

下面是验证码识别的具体流程:



字模库维护

验证码的识别过程已经详细的分析,识别关键点一个在切割,一个在字模库的质量。字模库涉及两个问题,一个就是重复的问题,一个就是字模数据。这个阶段主要实现:

  1. 重复字模数据的过滤剔除。

  2. 对于插入错误的字模能够进行修改。

  3. 能够删除不须要的字模数据




图片处理类的设计

图像处理类是遵循面向对象的思想设计的,将图像处理过程当中用到的方法进行封装,对经常使用参数值进行参数默认值和可变参数设置,方法重载。该类是静态类,方便开发人员调用,其中Boundry是存储小图片边界信息的类,里面有四个边界值属性。


开发人员能够直接调用GetYZMCode()方法进行验证码的识别处理,这是一个重载方法,其他的方法会在下面具体实现中介绍具体方法的设计,下面是这个类图表示了ImageProcess类中主要的处理方法和之间的关系:



发票编号识别

这个是基于aforge.net实现的,参考国外一位扑克牌识别的代码。

过程是先肯定发票的位置,而后定位到发票编号,切出发票编号,调用自动识别类库识别数字,而后再将识别数据写到屏幕上。固然也要实现训练字模;



https://www.cnblogs.com/cnduan/p/5154419.html




阅读过本文的人还看了如下:


《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码


《深度学习之pytorch》pdf+附书源码


将机器学习模型部署为REST API


FashionAI服装属性标签图像识别Top1-5方案分享


重要开源!CNN-RNN-CTC 实现手写汉字识别


yolo3 检测出图像中的不规则汉字


一样是机器学习算法工程师,你的面试为何过不了?


前海征信大数据算法:风险几率预测


【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类


VGG16迁移学习,实现医学图像识别分类工程项目


特征工程(一)


特征工程(二) :文本数据的展开、过滤和分块


特征工程(三):特征缩放,从词袋到 TF-IDF


特征工程(四): 类别特征


特征工程(五): PCA 降维


特征工程(六): 非线性特征提取和模型堆叠


特征工程(七):图像特征提取和深度学习


如何利用全新的决策树集成级联结构gcForest作特征工程并打分?


Machine Learning Yearning 中文翻译稿


蚂蚁金服2018秋招-算法工程师(共四面)经过


全球AI挑战-场景分类的比赛源码(多模型融合)


斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)


python+flask搭建CNN在线识别手写中文网站


中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程


不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  

长按图片,识别二维码,点关注










本文分享自微信公众号 - 机器学习AI算法工程(datayx)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索