Chuang Ye

身份证信息识别

2019-01-17 Project
Word count: 2.1k | Reading time: 7min

思路
近几年来,模式识别理论以及图像处理技术的发展为利用光学图像实现的证件识别行业奠定了理论基础,而电子技术的发展带来低成本、小体积的摄像头在移动终端的普遍应用为快速、便捷、低成本的证件识别提供了技术平台。基于光学摄像头图像处理处理以及模式识别理论的光学字符识别(OCR)在社会生活的各个行业得到了广泛的应用。光学字符识别在文字的录入方面具有速度快、效率高、错误少、成本低等优势。在光学字符识别的基础上发展起来的证件识别作为一种新兴的技术也在社会生活的各个方面得到了应用。随着国家信息化建设的发展,身份证作为我国公民的重要身份凭证,其识别与管理也成为了国内大量学者关注的热点问题。随着网络技术和数据库技术的发展,身份证识别的结果可以大大方便公安机关的业务管理工作,如身份证真伪的识别、犯罪份子追踪等。基于图像处理技术和模式识别的身份证识别系统可以广泛应用于海关、酒店登记、机场、公民身份核查、流动人口管理、追缉罪犯等业务中,具有广阔的应用前景和现实意义。

图像预处理

灰度化

身份证图像样本一般是通过扫描仪等设备获取到的彩色图像。由于彩色图像包含大量的颜色信息,在计算机处理时也会占用大量资源,降低了运行速度,而且实际采集的图像由于光照影响,使得整幅图偏暗或偏亮,没有灰度层次感。因此在对身份证图像进行识别时常将彩色图像转变为灰度图像,以加快处理速度,然后对其进行图像预处理。图片灰度化处理就是将指定图片每个像素点的RGB三个分量通过一定的方法计算出该像素点的灰度值,使图像只含亮度而不含色彩信息。通常灰度化采用的公式有两种:

1
2
Gray=(R+G+B)/3;
Gray=0.299R+0.587G+0.114B;

本项目使用的是第二种。

二值化

经过非均匀校正和图像灰度化的身份证图像减小了非均匀光照和图像色彩对文字识别的影响。身份证上的信息主要为文字,文字的主要特征为结构特征。结构特征是独立与图像灰度的一种特征量,因此身份证图像还需要经过二值化处理。用二值的数字信号表示的字符图像灰度信号被称作字符图形数字信号二值化。灰度图像的二值化要求有效从图像中区分字符像素。传统印刷字体图像的二值化要求一方面要求尽量保持原始字符的结构特征,另一方面要求二值化后的字符之间不能有空白。传统印刷字符的背景比较单一且平滑,背景与字符之间可以利用简单的全局阈值的方法区分。而我国身份证由于背景存在纹理,并且存在持证人的照片,简单的全局阈值无法将包含身份信息的字符有效区分出来。因此需要考虑全局和局部阈值相结合的办法。
二值化的身份证


获得身份上各个区域

字符区域

二值图像即只有黑白两种颜色组成的图像,一般的白色为内容,黑色为背景。腐蚀是删除对象边界某些像素,既是让白色的区域瘦一圈;而膨胀则是给图像中的对象边界添加像素,即让白色的区域胖上一圈。而这个“圈”的大小,则是由参数来指定的。在本项目中的腐蚀膨胀这一步主要是将得到的二值图中的黑色块进行放大。即连接图片中相邻黑色像素点的元素。通过腐蚀可以把身份证上的身份证号码连接在一起形成一个矩形区域。然后进行轮廓提取,把每个大的区域找出来,除去小的区域,这样就可以定位得到身份证上各个的区域各部分的子图像。
腐蚀化的身份证

图片区域

上面获得子图像中并没有获得身份证上的大头照,本文使用基于AdaBoost算法实现的人脸识别来获得大头照。首先使用Harr-like特征表示人脸,使用“积分图”实现特征数值的快速计算;也就是在一个 2020 的图片提取一些简单的特征(称为Harr特征)。
Harr特征
Harr特征的计算方法是将白色区域内的像素和减去黑色区域,因此在人脸与非人脸图片的相同位置上,值的大小是不一样的,这些特征可以用来区分人脸和分人脸。通过对矩形区域黑色和白色像素的计算可以识别出,前两个图为人脸,而最后一个图为非人脸。使用数千张切割好的人脸图片,和上万张背景图片作为训练样本。训练图片一般归一到 20
20 的大小。在这样大小的图片中,可供使用的 haar 特征数在 1 万个左右,使用AdaBoost算法挑选出一些最能代表人脸的矩形特征(弱分类器),按照加权投票的方式将弱分类器构造为一个强分类器。将训练得到的若干强分类器串联组成一个级联结构的层叠分类器,级联结构能有效地提高分类器的检测速度。


身份证号码区域的数字提取

身份证号码是由1-10(存在部分人群的身份证号码最后一位是X),从网上下载的到一个公开的数据,每个数字都有50张这样的图片,这些数据将用来训练。计算数字字符的特征向量,也即梯度分布特征+灰度分布部分训练数据得到一个172的特征向量,由calcGradientFeat函数实现。最后把训练矩阵和标签矩阵,保存到xml文件。在上面的步骤中已经获得身份证号码区域,分辨率缩放至30020大小之后获得身份证号码区域的矩阵对象,然后用光照直方图处理身份证区域的图像,最后获得纯粹的字符矩阵。利用opencv自带的CvANN_MLP &ann进行神经网模型的构建和训练。把训练矩阵和标签矩阵输入到构建的神经网络模型中,把经过神经网络模型后得到的字符特征向量分类得到由整数vector容易存储的矩阵,最后通过迭代器的方式输出容器对象的值。
分类后的身份证号码区域


身份证出生日期和性别区域的信息获取

从得到的身份证号码文本中进行编辑。根据下面的身份证号码特征进行划分和提取。

1
2
15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。  
18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。


调用百度OCR识别文字区域

在百度AI上获得API Key和Secret Key,通过API Key和Secret Key获取的access_token。对每个区域的照片进行base64编码,并去掉图片头,再通过urlencode变成一个字符串,最后发送请求。(每天可以免费500次)
转换编码处理后的请求数据


最终的是实验结果

实验结果

< PreviousPost
在Hexo博客中添加音乐
NextPost >
Echarts的demo实现