基于opencv的银行卡号识别学士学位论文Word文档下载推荐.docx
- 文档编号:4782460
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:16
- 大小:902.36KB
基于opencv的银行卡号识别学士学位论文Word文档下载推荐.docx
《基于opencv的银行卡号识别学士学位论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于opencv的银行卡号识别学士学位论文Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
1.1引言…………………………………………………………………………6
1.2银行卡号识别的研究现状…………………………………………………6
1.3识别的目的和意义…………………………………………………………6
1.4opencv开源图像库………………………………………………………7
1.5程序的模块…………………………………………………………………7
第2章图像预处理模块……………………………………………………………8
2.1引言…………………………………………………………………………8
2.2灰度化处理…………………………………………………………………8
2.3二值化处理…………………………………………………………………10
第3章字符定位模块………………………………………………………………11
3.1引言…………………………………………………………………………11
3.2膨胀和腐蚀…………………………………………………………………11
3.3轮廓提取……………………………………………………………………13
3.4垂直投影……………………………………………………………………14
第4章字符分割模块………………………………………………………………16
4.1引言…………………………………………………………………………16
4.2字符分割……………………………………………………………………16
4.3图像归一化…………………………………………………………………17
第5章字符识别模块………………………………………………………………18
第6章结论…………………………………………………………………………19
致谢语………………………………………………………………………………20
参考文献……………………………………………………………………………20
摘要银行卡号是由19位数字编号组成的一串号码。
由于每一张银行卡的卡号都具有唯一性,所以通过确定银行卡卡号就可以识别银行卡,得到银行卡的相关信息。
银行卡卡号的自动识别对实现银行卡的有效管理和进行银行卡的相关服务具有重要的理论意义和实际应用价值。
本论文设计了一个银行卡卡号自动识别程序,这个程序基本上可以完成银行卡卡号的自动识别。
该程序是在对图像进行图像预处理的基础上,对图像处理得到的二值图进行膨胀和腐蚀变换,利用X/Y方向投影定位卡号字符位置;
采用投影法分割卡号字符并进行归一化处理;
最后采用模板匹配法识别字符得到银行卡卡号。
实验结果表明,程序具有较高的识别速率和准确率,并且具有一定的稳定性。
关键词 银行卡卡号字符识别模板匹配图像处理
ReasearchOnBankCardNumberIdentificationProgramBasedOnTemplateMatching
Abstract
Theserialnumberofbankcardisanumberconsistsof19numbers.Astheserialnumberofeachbankcardisunique,sobythebankcardserialnumberwecanbesureofthebankcardandgettheinformationofthebankcard.Theautomaticrecognitionofbankcardserialnumberhasimportanttheoreticalsignificanceandpracticalvaluetorealizeeffectivemanagementofthebankcardandbankcardservices.Thispaperdesignedabankcardserialnumberautomaticrecognitionprogram,thisprogramcanbasicallycompletetheautomaticrecognitionofbankcardserialnumber.
Theprogramisbasedonimageprocessingoftheimage,theimageprocessingofthetwovalueimagedilationanderosionusingX/Ytransform,thedirectionofprojectionsequencenumbercharacterposition;
thesequencenumberandcharactersegmentationarenormalizedbyprojectionmethod;
finally,usingtemplatematchingmethodtorecognizecharacterofbankcardserialnumber.Theexperimentalresultsshowthat,theprogramhasahighrecognitionrateandaccuracy,andhascertainstability.
KeyWordsbankcardserialnumber;
Characterrecognition;
Templatematching;
Imageprocessing
引言随着国民经济的高速发展,银行卡的使用越来越频繁。
每一张银行卡都有着它的一个唯一的19位编号,只要通过银行卡的卡号号码就可以确定相应的银行卡。
所以,对银行卡卡号进行识别在进行银行卡服务时有着重要意义。
传统银行卡服务时的人工识别银行卡号码太过费时费力。
所以银行卡号的自动识别变得越来越重要。
本文依据银行卡号字符的特点,研究并实现了一种基于模板匹配的银行卡号识别系统,可以快速而准确地识别银行卡号。
该系统对研制或改进银行卡自动服务系统具有一定的指导作用和参考价值。
第1章绪论
1.1引言
银行卡号的识别涉及多个领域,包括模式识别、图像处理、计算机等多门学科,是一门综合性的应用技术。
随着国民经济的高速发展,银行卡的使用越来越频繁。
本系统可以根据银行卡图片自动识别银行卡号码,可以广泛的应用在各个领域。
1.2银行卡号识别的研究现状
在图像字符识别方面,现在大多采用的是神经网络[1]、差别不等式[2]、模板匹配[3]等技术。
神经网络具有推广能力、并行处理和自组织性等特性,因此它适合用于图像识别[4]。
特别在图像进行特征提取和识别时,神经网络明显优于传统的识别方法[5]。
目前使用最为广泛的神经网络是BP网,它对样本的识别率虽然很高。
但网络训练比较麻烦,需要选择大量的样本才能保证最终的识别结果。
同时,在实现过程中,由于受参数初始化的影响,它时常会无法收敛,或陷入局部极值。
差别不等式需要每一张纸币的特征差别点和选取合适的阈值,这些需要专家根据经验来选择,因此具有较大的主观性。
1.3识别的目的和意义
本文根据银行卡号的特点,设计了一个基于模版匹配的银行卡号识别程序,经过实验发现,这个程序可以比较快速而准确地识别银行卡号,并且基本上可以保证银行卡号识别功能要求。
本文通过对图像处理与模式识别中已有算法的分析研究,设计并实现了基于模板识别的银行卡号识别系统。
不仅可以识银行卡号,其相关技术也可应用到车牌号码、护照号、身份证号或其他印刷体字符的识别。
1.4OpenCV开源图像库
本程序采用了在C++6.0上采用了OpenCV工具(OpenCV版本1.0)实现了银行卡号的识别。
OpenCV的全称是:
OpenSourceComputerVisionLibrary。
OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。
它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
Opencv避免了VC代码对图像进行处理的繁琐细节,而且由于opencv包含大量的开源图像处理函数,可以方便的对其进行修改和应用,在保证精度的同时大大减少识别的时间。
1.5程序的模块
银行卡号的自动识别主要包含图1的几个模块。
图1银行卡号识别流程图
图像预处理模块是用来进行银行卡卡号识别的前期准备工作的模块。
图像处理模块的要求就是把原始图像处理为适合后续模块处理要求的图像。
一般用来去除图像中不需要的信息。
字符分割模块是对预处理后的图像进行卡号字符的准确定位与分割,它是卡号识别系统中一个较为关键的模块,卡号定位与分割的准确与否将直接影响系统的识别率。
字符分割的准确性依赖于卡号定位和图像的清晰度。
如果图像中有着较为明显的干扰和噪声,二值化图像中可能出现字符粘连,需要特殊处理。
字符定位是在分割出的图像中找到卡号各个字符所在位置并将其从中分离出来,为后面卡号字符识别作准备。
特征提取的主要目的是从那些已分割出来的单个卡号字符图像中提取出用于区分不同字符的本质特征,用来识别。
字符识别是在数字模板库中找到和待识字符匹配的字符。
模板库是在银行卡号识别系统实现后创建的数字模板库。
第2章图像预处理模块
2.1引言
整个识别系统主要由图像预处理模块、字符分割模块、字符定位模块、字符识别模块几个模块组成。
下面详细介绍这几个模块是如何用opencv的函数实现的。
以一张编号为9559981090571602515的银行卡为例来介绍系统的整个识别过程。
图像预处理模块是用来进行银行卡号识别的前期准备工作的模块。
本系统的原始图像采用RGB图像,系统的图像处理模块主要对原始图像进行灰度化、二值化等处理。
银行卡原始图像如图2所示。
图2原始图像
2.2灰度化处理
图像灰度化处理就是将指定图像每个像素点的RGB三个分量通过一定的算法计算出该像素点的灰度值,使图像只含亮度而不含色彩信息。
本程序中一开始得到的采集的银行卡图像是彩色图像,其中包含了大量颜色信息,但识别卡号并不需要关心这些颜色信息,这些颜色信息反而会对银行卡卡号的识别造成干扰并且颜色信息浪费了大量数据空间储存。
所以可以通过对原始图像进行灰度化处理来去掉银行卡的颜色信息,这样有利于后续模块的处理并且可以节约大量的系统的存储空间。
一般有以下四种方法对彩色图像进行灰度化。
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))
本系统采取的方法是调用了opencv里灰度化函数cvCvtColor。
该函数采用加权平均法,将银行卡彩色图像转为灰度图像。
对原始图像处理得到的结果如图3所示。
2.3二值化处理
在将原始图像进行灰度化处理后,对得到的灰度图像进行二值化处理。
二值化处理就是将灰度图像转换为只包含黑色和白色两种颜色的图像,它们之间没有其他灰度的变化。
在二值图中用255表示白色,0表示黑色。
相对于灰度图,二值图可以大大压缩数据量,并且可以大幅度简化后续工作。
图像二值化采用阈值分割来实现,即以一个合适的阈值将图像分为大于和小于阈值的两部分像素群,对应表示图像中的目标和背景,从而将目标从背景中分离出来。
选取阈值的方法有多种。
迭代法所得的阈值能有效的分割图像,区别目标和背景的主要区域所在,但是在图像的细微处的区分不是很好。
经典Ostu[6]算法必须对所有的灰度值遍历计算类间方差,再通过比较得到最大方差,因此其运算大。
Bernsen算法[7]实现速度慢,还会出现笔划间断和伪影等现象。
由于本文中目标图像和背景在灰度上有明显差异,采用双峰法来确定最佳分割阈值。
首先根据输入的数字图像作出反映这幅图像中的灰度级与出现这种灰度的概率之间关系的灰度直方图。
直方图中出现了两个峰值,一个处于目标灰度区,另一个处于背景灰度区。
这两个峰分别对应目标与背景数目较多的像素点,两峰之间的波谷对应边缘附近数目较少的点。
在大量实验基础上,本系统选取阈值为37。
然后,采用固定阈值法对图像进行二值化处理。
将图3中的灰度图进行二值化处理得到的二值图如图4所示。
图4二值图
第3章字符定位模块
3.1引言
字符分割模块是对预处理后的图像进行卡号字符的准确准确定位与分割,它是卡号识别系统中一个较为关键的模块,银行卡号定位与分割的准确与否将直接影响系统的识别率。
本模块主要包括对银行卡号的定位、卡号字符定位、卡号字符分割、卡号字符图像归一化处理。
银行卡号的定位是在整张图像中定位出卡号的位置,将其从背景图像中分离出来,便于后面从图像中分离出卡号字符。
银行卡号字符定位是在已定位的银行卡号中找到银行卡号各字符所在位置,为后面字符分割作准备。
字符分割是将银行卡号分割成19个单个的银行卡号字符图像。
图像归一化是将分割成的单个的银行卡号字符图像规范成统一的大小且将银行卡号字符放置在图像的中心。
3.2膨胀和腐蚀
调用膨胀函数和腐蚀函数使银行卡卡号在X方向连成一整个黑色区域并消除一些二值图中干扰黑色区域。
从图像处理角度看,二值图像的腐蚀和膨胀就是将一个小型二值图(结构元素,一般为3*3大小,本系统采用3*1大小)在一个大的二值图上逐点移动并进行比较,根据比较的结果作出相应处理。
膨胀算法:
用3*1的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为0,结构图像的该像素为0,否则为1.结果:
使二值图像扩大一圈。
腐蚀算法:
用3*1的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为1,结构图像的该像素为1,否则为0.结果:
使二值图像减小一圈。
膨胀与腐蚀的处理效果就如其名字一样,我们通过膨胀连接相近的图像区域,通过腐蚀去除孤立细小的色块。
通过这一步,我们将所有的银行卡卡号字符连通起来,这样为我们接下来通过轮廓识别来得到卡号区域做准备。
由于字符都是横向排列的,因此要连通这些字符我们只需进行横向的膨胀即可。
然后可以通过检测图片的轮廓得到卡号所处的区域并提取出来。
将图4的二值图进行膨胀得到的图像如图5所示。
图5膨胀图
经过上一步操作,理论上来说银行卡上的字符连通成一个矩形区域,我们可以发现出了卡号区域还有一些黑色区域,我们可以使用腐蚀变换来消除一些。
对图5的图像进行腐蚀变换消除部分较小的黑色区域。
图6腐蚀图
3.3轮廓提取
通过轮廓提取我们可以定位卡号区域。
OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像,输出的是每一个连通区域的轮廓点的集合:
vector<
Point>
>
。
外层vector的size代表了图像中轮廓的个数,里面vector的size代表了轮廓上点的个数。
更为准确的说,经过上面的操作,我们将原始图片中在X方向排列紧密的纵向边缘区域连通成了一个矩形区域,除了卡号符合这个特点外,其他一些部分如银行名,银行卡标志等可能同样符合。
因此我们可能会找到很多这样的区域,这就需要我们进一步根据一些关于银行卡特点的先验知识对这些矩形进行进一步筛选。
最终,定位银行卡卡号所在的矩形区。
矩形的筛选算法筛选效果的好坏直接决定了整个一套识别算法是否能得到一个好的结果。
我设计的筛选算法主要涉及这几个部分:
1.高度(图片高度的5%以上)2.宽度(图片宽度的25%以上)3.位置(图片高度的20%~80%之间)4.大小形状(宽高比>
5:
1)
这个时候遇到了一个问题,opencv轮廓查找函数有时无法将一个轮廓完整的提取出来。
如图7所示,这一张银行卡提取的结果没有全部包含卡号区域。
图7检测结果失败图
3.4垂直投影
为了解决上述问题,我们将得到的轮廓在Y方向投影,确定卡号位置。
本系统采用的是逐像素点查找的方法对轮廓区域进行投影。
对每一列,系统进行逐点查找,统计出每一列黑色像素点数目x。
在将一幅空白图中对应列的最下面x个点变成黑色的就可以得到垂直投影图。
将得到的轮廓垂直投影结果如图8所示。
图8垂直投影图
通过垂直投影图可以得到银行卡号左右边界,再由轮廓的上下边界就可以得到卡号的区域。
使用cvSetReal2D函数将查找得到的区域绘制出来,如图9所示。
图9银行卡卡号定位图
将提取出的卡号二值化。
得到的提取图如图10所示。
图10提取二值图
第4章字符分割模块
4.1引言
由于文字信息在现今社会的广泛应用,计算机视觉研究的重要方向之一:
字符图像的分割与识别技术得到了越来越多的重视,可用于生活中的许多方面,例如手写体和印刷体文字的识别,门牌号的识别,支票上签名的识别,工程图纸的数字化,机器人视觉导航,以及各种表单、车辆牌照的识别。
这些广泛的应用领域都说明字符图像分割与识别技术有着重要的意义。
4.2字符分割
常用的分割方法有:
阈值法、区域生长法、分裂合并法、边缘检测法、人工神经网络法、基于模糊集理论法、分类器和聚类法等。
本系统字符定位分割方法是将将提取出卡号二值图进行Y方向膨胀腐蚀使每个字符变成一个黑块。
由于银行卡卡号字符之间有一定距离,系统采用对银行卡卡号字符垂直投影,在垂直方向上的投影值不为零的区域有字符,然后以银行卡卡号的下边界和左边界的交点为起点,沿X轴进行搜索,找到每个卡号。
然后将图像进行X和Y方向的投影得到图像中字符位置。
接着通过投影位置可以把字符分割出来。
将得到的二值图在Y方向投影,得到垂直投影图图11。
图11字符垂直投影图
根据垂直投影图进行处理,可以从银行卡卡号中分割出单个的卡号字符图像。
卡号的分割如图12所示。
注意图12中每个字符周围的线框就是分割的位置。
图12字符分割图
4.3图像归一化
上面得到的字符图像大小不一,位置不同,无法直接与模版字符匹配。
为了使字符图像可以与模版匹配,必须对图像进行归一化处理。
图像归一化一般分为大小位置和笔划粗细等归一化。
由于系统识别的字符是阿拉伯数字的印刷体,所以只需要进行大小和位置归一化处理。
本文的字符图像归一化通过调用opencv中cvResize函数将得到的字符大小变成与模版字符大小一致。
方便字符识别。
第5章字符识别模块
字符识别模块主要实现卡号字符识别功能即将处理好的卡号字符与模版相对比,在数字模板库中找到和待识卡号字符匹配的字符,从而完成字符的识别。
银行卡的卡号字符都是规范的印刷单位且样本的空间比较小,基于这些特点,本文采用模板匹配法来进行卡号识别。
将提取出的字符图像与模版对比,即可识别出银行卡的卡号。
本系统采取的对比方法是逐像素点比对。
通过对字符图像和各个模版进行逐点对比,计算出比对的相同像素点数目,然后比较各个模版相似度,得到字符图像的数字。
测试结果如图13所示。
图13银行卡卡号识别图
样本的测试结果表明,系统能正确识别绝大多数的样本,未能达到100%的正确识别率。
经过分析发现识别错误或匹配失败主要有以下三种原因:
(1)银行卡图像样本背景太过复杂;
(2)有些银行卡卡号二值化阈值选取不正确,未能消除背景干扰;
(3)模板库数字模版样本较少,覆盖面不够广。
结论本文通过对图像处理中已有算法的分析研究,借鉴了已有的一些程序,实现了银行卡卡号的识别。
这个程序不仅可以识别银行卡卡号,其相关技术也可应用到车牌号码、护照号、身份证号等其他图像识别。
在以后的研究工作中,我认为可以从以下几个方面对该系统进行改进。
首先,可以加入图像倾斜校正模块,使得样本图像倾斜时可以校正。
其次,应该适当扩大数字模板库,使得程序可以识别更多的银行卡类别。
最后,通过适当方式增加函数处理图像,使得程序可以识别背景比较复杂的银行卡。
在设计这个程序过程中,也遇到了一些问题。
在一开始,我使用opencv的轮廓查找函数来对银行卡卡号进行定位。
这时遇到了一个问题,在opencv里用cvFindContours查找轮廓时,有时候无法对一个轮廓完整的进行查找,查找轮廓得到的边界往往不包含整个轮廓。
所以我加入了Y方向投影来保证查找的轮廓是完整的。
在对不同银行卡进行识别时,由于不同银行卡的数字模版不同,我需要使用不同模版对得到的字符图像进行对比。
我在如何对相应银行卡使用相应模版方面遇到了困扰。
直到老师提醒了我,我将得到的字符与各种银行卡模版同时使用,最相似的模版对应的数字就是结果,解决了这个问题。
致谢语本文是在彭洪老师的悉心指导下完成的。
彭洪老师为论文研究思路的设计和文献资料的选择提供了有益的指导,使得论文在成文阶段少走了很多弯路。
同时,彭洪老师严谨细致的治学态度也令我受益匪浅。
在论文完成之际,谨向彭洪老师致以衷心的感谢。
参考文献:
[1]LUXiaobo,LINGXiaojing,LIUBi.Licenseplatecharacterrecognitionbasedonthecombinedfeatures(J).ChineseJournalofScientificInstrument,2006,27(7):
698-701.
[2]TRIEOD,JAINAK,TORFINNTAXT.FeatureextractionmethodsforcharacterSurvey(J).PatternRecognitionaRecognition,1996,29(4):
641-662.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 opencv 银行卡 识别 学士学位 论文