转载自 http://www.cnblogs.com/liu7537/p/3528968.html
作者:刘常军(2014-1-21)
 
  前两天看到一篇文章,说支付宝钱包的iOS版和Android版已经升至8.0,只要通过摄像头对准银行卡进行扫描,支付宝钱包就可以自动识别银行卡号码(http://www.chinaz.com/mobile/2014/0113/335323.shtml)。刚好前一阵子我在研究第二代身份证号码的图像识别技术,并且已经使用C#完美实现。因此,我猜测支付宝钱包的银行卡号码识别技术在具体实现细节或者模板匹配方面可能会更复杂一些,但在识别原理和识别步骤方面应该是大同小异,所以我在这里谈谈我已实现的 身份证号码识别技术,跟朋友们共同切磋。下一步时间充裕的话,我可能会做进一步的扩展,以实现对更多对象的图像识别。
 
 
 
   计算机图像识别技术,是指利用计算机的高速计算能力对 图像进行自动处理、分析和理解,以识别出图像中的关键信息并加以利用的技术。 计算机图像识别技术,有很多具体的门类和应用,例如身份证号码识别、银行卡号码识别、名片识别、车牌识别、网站验证码识别等等,这些都是计算图像识别技术在某一领域的具体应用。虽然应用场景不同,但识别的原理和技术是相通的。掌握了图像识别的技术原理,并针对某一具体应用场景进行专门的优化,就可以开发出相应的识别软件。
 
   下面我以身份证号码识别技术为例来说明计算机图像识别技术的原理和步骤。
 
   (一)图像采集
   首先我们要取得待识别的图像。这项工作可以通过数码相机、DV机、工业摄像机、电脑数字摄像头、手机摄像头等设备采集视频,并从视频流中取得我们要分析的图像信息。
 
   (二)版面分析
   取得图像信息后,要对图像整体版面进行分析。这一步工作如果使用通用算法进行分析,则效率很低。通常情况下都需要针对不同的识别对象进行专门的分析及设定,才能取得良好的分析效果。例如我们要对身份证进行分析,就需要根据身份证的大小、宽高比例进行预先设定,这样程序才能够明显区分出来当前图像里所拍的究竟是不是身份证。比如摄像头所拍摄的对象不是身份证,而是一张普通A4纸张,那么程序就可以很轻易的通过宽高比例将其排除。
   此外,计算机识别出图像中的身份证后,仅仅是版面识别的第一步。接下来,系统还要根据已知的身份证中的姓名、性别、地址、照片、身份证号等各项指标所在的位置(通常以左上角顶点的坐标为标识)和范围(通常以其宽、高为标识),将其作为一个个的矩形 标注在系统配置文件中。这样,如果用户想要识别身份证号,那么系统就可以根据预定义的版面数据直接去图像中,将包含身份证号的那个矩形区域的图像“抠出来”,看上去就是一个包含有18个字符的长条形图像,对它再进行下一步的分析处理。
 
   (三)图像灰度化
   从视频采集设备里取得的图像通常都是彩色图像,为了使所分析的图像数据简化,并且不丢失关键信息,需要对图像进行灰度化处理。
   通常,计算机图像是由一个一个的像素点构成(矢量图除外),每个像素点用RGB模型来标记其颜色。 在RGB模型中,如果R=G=B时,则该颜色就表示是一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。
   一般有以下四种方法对彩色图像进行灰度化: 
   1、分量法。 将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。
   计算公式为: f1(i,j)=R(i,j) f2(i,j)=G(i,j)f3(i,j)=B(i,j)   其中fk(i,j)(k=1,2,3)为转换后的灰度图像在(i,j)处的灰度值。
   2、最大值法。 将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。 
   计算公式为: f(i,j)=max(R(i,j),G(i,j),B(i,j))
   3、平均值法。 将彩色图像中的三分量亮度求平均得到一个灰度值。 
   计算公式为: f(i,j)=(R(i,j)+G(i,j)+B(i,j)) /3
   4、加权平均法: 根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像: f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))。
   在进行身份证号码识别时,通常采取第4种方法加权平均法对彩色图像进行灰度化。
 
   (四) 图像 二值化
   灰度化是压缩图像数据的第一步,接下来要对灰度图像进行二值化处理。具体做法就是,首先对256个亮度等级的灰度图像进行计算,取得一个适当的阈值;其次对灰度化图像进行处理,所有 灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值用255表示,否则这些像素点被排除在物体区域以外,灰度值为0,代表背景或者例外的物体区域。
   完成这一步骤之后,灰度化图像被进一步压缩为二值化图像,每一像素点非黑即白,没有其他任何颜色。只要阈值选取合适,二值化图像 仍然可以反映图像整体和局部特征, 有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。
   (五)图块切割
   经过了前面的灰度化及二值化后,彩色图像被压缩为黑白二色图像。这时就要进行一个关键操作,就是图块切割。在这里以身份证号码识别为例,图块切割的含义就是将一个包含有18位数字(最后一位有可能是字母X)的长条形图像,切割为18个小图块,每个小图块内只包含一个数字(或字母X)。
   我们从身份证上可以看到,构成身份证号码的18个字符之间有空隙不粘连,并且 高度相等、宽度近似 。根据这个特征,就可以对长条形图像横向扫描,计算每一列上黑色像素点的个数(即构建通常所说的直方图)。在从左向右横向扫描过程中,黑色像素不为0,并且连续的列,都可以看作是一个字符的一部分。一旦遇到某列的黑色像素点个数为0,则代表前面那个字符已经结束,跨过这些黑色像素点为0的列,从下一个黑色像素点个数不为0的列开始就可以视为下一个字符的开始。以此类推,就可以找出所有字符的左边界和右边界。然后再进行纵向扫描,在每个字符的左右边界中,计算黑色像素点的最小坐标和最大坐标,这样每个字符的上下边界也就计算出来了。
   至此,所有字符的上下左右四个边界全部得到,那么这四条边界线围起来的图像区域,就是我们要切割的小图块。
 
   (六)字符识别
   将每个小图块依次送入这一环节进行字符识别,就可以得到最终结果。
   这一环节的字符识别运算包含两个步骤。
   一是归一化。归一化的目的是将所有小图块转换为相同大小的图像。前面说了,身份证号码中的字符宽度只是近似相同,并不一定完全相同。可以比较明显的看出来,数字“1”比数字“0”或“8”要窄的多,所以为了能够使用模板进行统一匹配,需要将每个字符图块转换为相同大小。以身份证号码识别为例,我们可以将每个小图块固定设为宽8像素、高16像素。
   二是模板匹配。既然是用模板匹配技术来实现图像和字符的匹配,那么首先得有模板。每个字符就是一个模板。根据身份证号码的取值规则,我们可以预先将数字0-9及字母X总共11个字符的模板设好,每个字符模板是一个数组,包含8*16=128个元素。每个元素代表一个像素点,每个元素的取值为0和1两项,0代表白色像素点、1代表黑色像素点。这样,在进行模板匹配的时候,首先把每个小图块的8*16个像素点,按照其颜色(黑与白)转换为一个包含128个元素的数组,然后用这个数组依次与预设的11个模板数组进行按位对比,找出含有相同元素值最多的那一个模板数组,这就是当前图块的最终识别结果。
   全部18个小图块都识别出来以后,整个身份证号码也就识别出来了。 

谈谈计算机图像识别技术之身份证号码识别相关推荐

  1. 原创:谈谈计算机图像识别技术之身份证号码识别

    原创:谈谈计算机图像识别技术之身份证号码识别 作者:刘常军(2014-1-21)   前两天看到一篇文章,说支付宝钱包的iOS版和Android版已经升至8.0,只要通过摄像头对准银行卡进行扫描,支付 ...

  2. iOS身份证号码识别

    最近不少简友说git上下载下来的代码报各种问题,因为包含的库都比较大,所以大家在pod的时候耐心等待,另外我已经将代码适配到了iOS10. 一.前言   身份证识别,又称OCR技术.OCR技术是光学字 ...

  3. 【身份证识别】BP神经网络身份证号码识别【含Matlab源码 1344期】

    ⛄一.身份证号码识别简介(附课题作业报告) 1 引言 当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开 ...

  4. Java 身份证号码识别系统

    最近发现一个有趣的项目. 这个项目是通过学习https://gitee.com/nbsl/idCardCv 后整合 tess4j,不需要经过训练直接使用的,当然,你也可以进行训练后进行使用. 该项目修 ...

  5. 计算机特点及应用领域阐述,计算机图像识别技术的应用及细节问题阐述与分析...

    摘 要文章首先简要阐述了计算机图像识别技术的特点及其发展现状,在此基础上对计算机图像识别技术的应用及细节问题进行了论述.期望通过本文的研究能够对促进计算机图像识别技术的发展及其在各个领域中的应用有所帮 ...

  6. 【身份证识别】基于matlab GUI身份证号码识别【含Matlab源码 014期】

    ⛄一.身份证号码识别简介 1 引言 作为居民身份的象征,身份证是居民身份的唯一标识,它已成为生活中必不可少的证件.在火车站.酒吧等公共场所,流动人口大人员复杂,警察需要对公民的身份证进行核对,排除可疑 ...

  7. Java身份证号码识别系统

    项目介绍 遇到问题 身份证号码识别 Required Software 项目更新 项目地址 项目介绍 本项目是通过学习https://gitee.com/nbsl/idCardCv 后整合tess4j ...

  8. 【身份证识别】形态学二代身份证号码识别系统【含GUI Matlab源码 948期】

    ⛄一.身份证号码识别简介 1 引言 作为居民身份的象征,身份证是居民身份的唯一标识,它已成为生活中必不可少的证件.在火车站.酒吧等公共场所,流动人口大人员复杂,警察需要对公民的身份证进行核对,排除可疑 ...

  9. 牛逼了!github上一个 身份证号码识别系统

    前言 最近发现一个有趣的项目. 这个项目是通过学习https://gitee.com/nbsl/idCardCv 后整合 tess4j,不需要经过训练直接使用的,当然,你也可以进行训练后进行使用. 该 ...

最新文章

  1. 面试官,你考我那么多基础知识干什么?
  2. datatables 一行数据生成两行_一行代码搞定分组回归
  3. php打开就执行url,php执行URL解析
  4. 编程随想 关系图_IT什么岗位比较好找工作?一张金字塔图就能明白
  5. 将一个输入流(InputStream)写入到一个文件中
  6. 互联网创业项目失败的7大特征
  7. 你所能用到的数据结构之番外篇---逆袭的面向对象(一)
  8. 网站Banner图切换效果(flash)
  9. P5154 数列游戏(区间dp)
  10. 命名空间“System.Web”中不存在类型或命名空间名称“HttpUtility”。是否缺少程序集引用?...
  11. Open EtherCAT Society——SOEM、SOES
  12. jquery 鼠标按住移动的解决方案
  13. Java流(Stream)
  14. 【kafka】Error while fetching metadata xxx: {TEST=LEADER_NOT_AVAILABLE}
  15. wdm驱动的学习初步
  16. Python基础知识:def创建函数
  17. 【NOIP2017提高组】轰炸
  18. Jenkins使用6--jenkins git timeout
  19. 西北乱跑娃 --- dockerfile部署项目
  20. 《CMOS集成电路后端设计与实战》——导读

热门文章

  1. Android RecyclerView实现瀑布流,图片自适应高度,不闪烁,解决位置交换
  2. 百度地图API的使用方法
  3. OSG 绘制贝塞尔曲线
  4. CANopen学习笔记
  5. 为什么3dmax渲染出来颗粒感强还有噪点呢?
  6. 五大学科竞赛(五)2018年第二十四届全国青少年信息学奥林匹克联赛初赛
  7. 教授专栏38 | 刘浩典: 香港和粵港澳大湾区:一体化与独特性
  8. 2020年节假日和周六日统计
  9. 计算机毕业设计之java+ssm校园在线投票系统
  10. 关于 SAP FI 凭证记账码 的相关规律及知识讲解