用Matlab 实现身份证号码快速识别

摘 要: 探讨身份证号码的快速识别。 首先从身份证图像中获取 0~9 共 10 个号码数字的样本图像, 从中提取其空间分布特征和结构特征; 再从待识别的身份证图像中提取各号码数字的空间分布特征和结构特征; 最后用相似系数最大和结构特征一致准则对各号码进行识别, 并应用 Matlab 编程实现了身份证号码的快速识别。

关键词: 身份证号码; 识别; Matlab; 分布特征; 结构特征; 相似系数

  1. 引言

作为居民身份的象征, 身份证已成为生活中必不可少的证件。 出于保障公民合法权益和社会治安的考虑, 越来越多的行业都开始要求进行实名制和身份证登记管理, 如公安、 海关、银行、 通信、 网吧及酒店旅馆、 洗浴业等, 因此利用计算机进行自动识别录入尤为必要。 身份证自动识别代替手工录入可以大大提高工作效率, 因而具有广阔的应用前景。

本文以第二代居民身份证为研究对象,从身份证号码图像

中提取号码数字 0~9 的空间分布特征和结构特征, 采用相似系数最大和结构特征一致准则, 应用 Matlab 软件编程实现了身份证号码的快速识别。

基本原理

身份证号码识别技术的基本原理如图 1 所示。

图 1 身份证号码识别技术的基本原理图

第二代居民身份证的大小是固定的, 宽度为 8.6cm, 高度为 5.4cm, 因此扫描身份证得到的图像可以缩放到同一个大小, 本文采用的图像宽度为 366 个像素, 高度为 233 像素, 这样在从身份证图像中提取号码数字图像时可以快速定位。

由于第二代居民身份证的号码字体比较特殊, 所以需要从身份证图像中获取号码数字 0~9 的图像作为样本, 用于提取特征。 样本数字图像如图 2 所示。

该样本数字图像为真彩色图像, 需要对其进行预处理。 首

图 2 第二代居民身份证号码样本数字图像

先将真彩色数字图像转化为二值图像: 设 P 为真彩色数字图像的任意点, P 的颜色三分量值分别为 r、 g、 b, 若 0.299*r+

0.587*g+0.114*b<0.5, 则二值图像对应的点为白色, 否则为黑色。 然后对二值图像进行数字分割, 将图像中的 10 个数字完整、 单独地分割出来。 最后对分割后的每个数字图像进行规范化处理: 若单个数字图像的整行或整列全为 0, 则删除该行或该列。 预处理后的各样本数字图像如图 3 所示。

图 3 预处理后的样本数字图像

注: 为达到较好的视觉效果, 在每个样本数字图像周围増加了一个黑色矩形方框。

完成预处理后, 接下来就是提取每个数字的特征。 本文考虑每个数字的空间分布情况和形状结构特点, 作为分类识别的特征。

  1. 空间分布特征

首先将预处理后的样本数字图像看成是有质量的图形, 其中白色点的质量为 1, 黑色点的质量为 0。 该图形的质心坐标总体上能反映对应数字的空间分布情况, 用 x1 和 x2 分别表示质心横坐标和纵坐标, 则 x1 等于该样本数字图像中白色点的横坐标之和除以白色点的个数; x2 等于该样本数字图像中白色点的纵坐标之和除以白色点的个数。

再将样本数字图像等分成上、 下两个部分, 用 x3 和 x4 分别表示该样本数字图像上半部分的质心横坐标和纵坐标; 用 x5 和 x6 分别表示该样本数字图像下半部分的质心横坐标和纵坐标。

最后将样本数字图像等分成左、 右两个部分, 用 x7 和 x8

分别表示该样本数字图像左半部分的质心横坐标和纵坐标; 用

x9 和 x10 分别表示该样本数字图像右半部分的质心横坐标和纵

坐标。

各区域的质心横坐标为该区域内的白色点的横坐标之和除以该区域内的白色点的个数; 各区域的质心纵坐标为该区域内的白色点的纵坐标之和除以该区域内的白色点的个数。

这 10 个质心坐标组成的向量:

x= (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) T

就是该样本数字图像对应的数字的空间分布特征。 逐个计算各数字的空间分布特征向量, 并将它们存放于数组中。

  1. 结构特征

采用数字的空间分布特征可以将数字 “1”、 “2”、 “4”、

“5”、 “7” 正确识别出来, 但数字 “0”、 “3”、 “6”、 “8”、

“9” 有时却不能正确识别。 针对这几个会出现误判情形的数字进行分析, 不难发现它们的形状结构特征明显, 数字 “0” 和

“6” 及 “9” 含有一个洞; 数字 “3” 不包含洞; 数字 “8” 包含两个洞。 由于身份证号码字体的特殊性, 数字 “1”、 “2”、

“4”、 “5”、 “7” 均不含有洞。

Matlab 中的 bweuler 函数返回二值图像的欧拉数。 欧拉数是对图像的拓扑度量, 它是指图像中对象的总个数与这些对象中洞的个数的差, 可以使用 4 连通或 8 连通邻域。 各数字的欧拉数参见表 1。

表 1 各数字的欧拉数

本文采用 8 连通邻域, 将各样本数字图像的欧拉数作为它的结构特征, 并存放于数组中 E (10)。

  1. 分类识别准则

样本数字图像的空间分布特征和结构特征分别存于数组digital (10, 10) 和 E (10) 中。 对于待识别身份证号码 (共 18个) 的目标, 按照前面类似的处理过程, 提取各号码数字的空间分布特征和结构特征, 并存放于数组 obj (18, 10) 和 objE

(18) 中 。

令 x= (x , x ,, .., x ) T 为目标号码数字的空间分布特征,

clear

%读入样本数字图像并二值化RGB=im2double(imread('Digital.jpg')); [height,width,n]=size(RGB); BW=zeros(height,width);

for i=1:height for j=1:width r=RGB(i,j,1);

g=RGB(i,j,2);

b=RGB(i,j,3); if(0.299*r+0.587*g+0.114*b<0.5)

BW(i,j)=1;

else

BW(i,j)=0;

end end end

%预处理并统计各样本数字的分布特征

width=width/10; N=zeros(10,5); digital=zeros(10,10); E=zeros(1,10);

for k=0:9

A=BW(:,1+k*width:width+k*width);

对于待识别的目标数字号码, 计算该数字号码的空间分布特征与 10 个样本数字的空间分布特征的相似系数, 其分类识别准则是: 在结构特征一致的条件下, 相似系数最大的对应的样本数字就是该目标号码的识别结果。

程序实现

采用 Matlab6.5 (release R 13) 作为开发工具, 在 Windows

XP 平台下实现了身份证号码的快速识别。

图 4 是 程 序 使 用 的 身 份 证 图 像 , 程 序 输 出 结 果 为 :

350426198107282635。 对多个身份证图像进行测试, 均得到正确的结果。

图 4 待识别的身份证图像

身份证号码识别的程序代码如下:

1 2 10

y= (y1, y2, ..., y10) T 为样本号码数字的空间分布特征, 定义两者的相似系数为:

B=[];

for i=1:width a=A(:,i);

if sum(a)~=0 B=[B a];

end end

Sample=[]; for j=1:height b=B(j,:);

if sum(b)~=0 Sample=[Sample;b];

end

end

E(k+1)=bweuler(Sample,8);

%计算各样本的欧拉数[m,n]=size(Sample); for i=1:m

for j=1:n

if Sample(i,j)==1 N(k+1,1)=N(k+1,1)+1; %总白色点数

digital(k+1,1)=digital(k+1,1)+i; %横坐标和digital(k+1,2)=digital(k+1,2)+j; %纵坐标和if i<m/2

N(k+1,2)=N(k+1,2)+1;

%上半部分白色点数

digital(k+1,3)=digital(k+1,3)+i;

%上半部分横坐标和

digital(k+1,4)=digital(k+1,4)+j;

%上半部分纵坐标和

end

if i>m/2 N(k+1,3)=N(k+1,3)+1;

%下半部分白色点数

digital(k+1,5)=digital(k+1,5)+i;

%下半部分横坐标和

digital(k+1,6)=digital(k+1,6)+j;

%下半部分纵坐标和

end

if j<n/2 N(k+1,4)=N(k+1,4)+1;

%左半部分白色点数

digital(k+1,7)=digital(k+1,7)+i;

%左半部分横坐标和

digital(k+1,8)=digital(k+1,8)+j;

%左半部分纵坐标和

end

if j>n/2 N(k+1,5)=N(k+1,5)+1;

%右半部分白色点数

digital(k+1,9)=digital(k+1,9)+i;

%右半部分横坐标和

digital(k+1,10)=digital(k+1,10)+j;

%右半部分纵坐标和

end end end end

digital(k+1,1)=digital(k+1,1)/N(k+1,1);

%整体质心横坐标

digital(k+1,2)=digital(k+1,2)/N(k+1,1);

%整体质心纵坐标

digital(k+1,3)=digital(k+1,3)/N(k+1,2);

%上半部分质心横坐标

digital(k+1,4)=digital(k+1,4)/N(k+1,2);

%上半部分质心纵坐标

digital(k+1,5)=digital(k+1,5)/N(k+1,3);

%下半部分质心横坐标

digital(k+1,6)=digital(k+1,6)/N(k+1,3);

%下半部分质心纵坐标

digital(k+1,7)=digital(k+1,7)/N(k+1,4);

%左半部分质心横坐标

digital(k+1,8)=digital(k+1,8)/N(k+1,4);

%左半部分质心纵坐标

digital(k+1,9)=digital(k+1,9)/N(k+1,5);

%右半部分质心横坐标

digital(k+1,10)=digital(k+1,10)/N(k+1,5);

%右半部分质心纵坐标

end

%获取身份证号码并进行二值化I=im2double(imread('IDCard01.jpg')); figure,imshow(I); x1=127;x2=127+11; y1=190;y2=210; IDRGB=I(y1:y2,x1:x2,:,:,:);

for i=1:17

x1=127+11*i; x2=127+11*(i+1); C=I(y1:y2,x1:x2,:,:,:); IDRGB=[IDRGB C];

end [IDheight,IDwidth,k]=size(IDRGB); IDBW=zeros(IDheight,IDwidth); for i=1:IDheight

for j=1:IDwidth r=IDRGB(i,j,1);

g=IDRGB(i,j,2);

b=IDRGB(i,j,3); if(0.299*r+0.587*g+0.114*b<0.5)

IDBW(i,j)=1;

else

IDBW(i,j)=0;

end end

end

%预处理并统计目标数字对象的分布特征

IDwidth=IDwidth/18; obj=zeros(18,10); objN=zeros(18,5); objE=zeros(1,18);

for k=1:18

IDA=IDBW(:,1+(k-1)*IDwidth:k*IDwidth); IDB=[];

for i=1:IDwidth IDa=IDA(:,i);

if sum(IDa)~=0 IDB=[IDB IDa];

end end Object=[];

for j=1:IDheight IDb=IDB(j,:);

if sum(IDb)~=0 Object=[Object;IDb];

end end

objE(k)=bweuler(Object,8); %欧拉数

[m,n]=size(Object); for i=1:m

for j=1:n

if Object(i,j)==1 objN(k,1)=objN(k,1)+1;

obj(k,1)=obj(k,1)+i;

obj(k,2)=obj(k,2)+j; if i<m/2

objN(k,2)=objN(k,2)+1;

obj(k,3)=obj(k,3)+i;

obj(k,4)=obj(k,4)+j; end

if i>m/2 objN(k,3)=objN(k,3)+1;

obj(k,5)=obj(k,5)+i;

obj(k,6)=obj(k,6)+j; end

if j<n/2 objN(k,4)=objN(k,4)+1;

obj(k,7)=obj(k,7)+i;

obj(k,8)=obj(k,8)+j; end

if j>n/2 objN(k,5)=objN(k,5)+1;

obj(k,9)=obj(k,9)+i;

obj(k,10)=obj(k,10)+j; end

end

end

end

obj(k,1)=obj(k,1)/objN(k,1);

obj(k,2)=obj(k,2)/objN(k,1);

obj(k,3)=obj(k,3)/objN(k,2);

obj(k,4)=obj(k,4)/objN(k,2);

obj(k,5)=obj(k,5)/objN(k,3);

obj(k,6)=obj(k,6)/objN(k,3);

obj(k,7)=obj(k,7)/objN(k,4);

obj(k,8)=obj(k,8)/objN(k,4);

obj(k,9)=obj(k,9)/objN(k,5);

obj(k,10)=obj(k,10)/objN(k,5); end

%分类识别String='0123456789'; IDCardNO='';

for k=1:18 R=0.0; j=0;

x=obj(k,:); for i=0:9

y=digital(i+1,:); r=sum(x.*y)/sqrt(sum(x.*x)*sum(y.*y));

%相似系数

if r>R&objE(k)==E(i+1)%分类识别准则

R=r;

j=i; end end

IDCardNO=strcat(IDCardNO,String(j+1)); end

disp(IDCardNO); %显示识别结果

四、 结论

本文对第二代居民身份证的号码数字进行分析, 提出了基于空间分布特征的相似系数最大和结构特征一致的分类识别准则, 使得识别方法较简单, 对多个身份证图像进行测试 (将程序中的 IDCard01.jpg 替换为待测试的身份证图像文件名), 均能快速、 准确识别。

参考文献

  1. 邢如义, 夏冰, 袁红云. 印刷体数字快速识别方法. 河北建筑科技学院学报, 2014; 21 (3): 65-67.
  2. 苏金明, 王永利编著. MATLAB7.0 使用指南. 电子工业出版社, 2014.
  3. 梅长林, 周家良编著. 实用统计方法. 科学出版社, 2016.

Matlab实现身份证号码快速识别相关推荐

  1. 基于像素匹配的MATLAB平台身份证号码实时识别

    基于像素匹配的MATLAB平台身份证号码实时识别 引言 随着信息化技术的发展和智能手机的日益普及和平民化,以MATLAB应用为代表的移动应用越来越广泛,为人们的生活带来了诸多方便.一款移动应用能否赢得 ...

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

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

  3. 02、MATLAB实现身份证号码的鉴别

    使用matlab编写程序实现身份证号码的鉴别 str=input('please input a ID:','s'); idstr = str(1:3) ;%截取前三位省份信息 id = str2nu ...

  4. 缺一位身份证号码时识别计算

    有一次女朋友身份证找不到了,但是那时候急需要查看身份证号码,最绝的是20岁的巨婴连身份证号码都记不住,突然想到之前给他买过火车票,当我激动的打开12306才发现身份证后面只显示了三位,也就是说还差一位 ...

  5. MATLAB身份证号码定位检测识别GUI

    ​ 一.应用背景 随着信息时代的飞速发展,身份证作为人口信息行之有效的管理工具,已经深入到社会生活的方方面面.身份证是我国居民身份的象征,独一无二的身份证号码录入了公民的基本个人信息.出于保障公民的合 ...

  6. 基于可视化结构的身份证号码校验系统-树莓派实现

    基于可视化结构的身份证号码校验系统 摘要: 本作品是一个通用的身份证号码校验系统,目前已经尝试在Linux和Windows系统下运行,结果均可达到理想效果.系统通过运用基础GUI库tkinter创建系 ...

  7. 【身份证识别】基于形态学实现二代身份证号码识别系统matlab源码含GUI

    一.简介 首先从身份证图像上获取0-9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像进行去噪.灰度化.二值化.水平投影切割,垂直投影并切割,将待测身份证号码分割出来,然后 ...

  8. iOS身份证号码识别

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

  9. Opencv获取身份证号码区域

    记得应该是16年的时候,从一个公开课看到了关于OCR方面的内容,里面讲到了通过OpenCV对身份证号码区域的剪裁以及使用Tess-Two进行文字识别,实现了对身份证号码的识别功能. 断断续续看了点关于 ...

  10. 10年前写的,身份证号码验证VBA代码

    工作中经常与身份证号码打交道,现在各类信息系统都把身份证号码作为识别定义人员的关键字段,下面这段代码,在我的工作中发挥了极其重要的作用!分享出来,希望能帮助到更多的人! 10年前写的,if套if,格式 ...

最新文章

  1. 用信号量和读写锁解决读者写者问题
  2. LaneCat网猫软件
  3. 计算机应用基础专科,2016电子科技大学计算机应用基础(专科)在线作业2
  4. 遍历strs数组,并判断数组中每一个元素的长度, * 将长度为偶数的元素和长度为奇数的元素分别存放在两个集合中,
  5. win7充当无线路由器
  6. 基金买入两天可以卖出吗?
  7. POJ 3046 Ant Counting ( 多重集组合数 经典DP )
  8. Arcpy 实现NDVI最大值合成/平均值合成
  9. win10使用import pcap 建议放弃,还是使用linux系统吧
  10. php两个手机号正则表达式_php中手机号码正则表达式代码
  11. 前端下载文件方式之:创建a标签下载文件
  12. SE:14.Annotation
  13. android车载行业前景,车载 Android 系统快来了,但前景可能并不乐观
  14. mysql alert on delete cascade_mysql-我的“ ON DELETE CASCADE”不起作用
  15. B站JavaScript从入门到精通智能社Blue石川老师视频部分代码_幻灯片
  16. 深入理解Spring两大特性:IoC和AOP
  17. html摄氏度转换华氏度,摄氏温度与K氏和华氏是怎样换算的?
  18. Samba 服务使用的端口和协议
  19. JavaWeb开发 —— Maven
  20. 云计算的应用有哪些?

热门文章

  1. 常用的网络操作系统有哪些?它们各具有什么特点?
  2. 网络操作系统与分布式操作系统
  3. 视频播放插件 Video.js
  4. 金士顿u盘写保护修复教程
  5. python唯美壁纸_Python爬虫教程-爬取5K分辨率超清唯美壁纸源码
  6. 【转】书上的字快速弄到电脑上
  7. Adobe Flash CS 6新功能详解二——安装Toolkit-for-CreatJS插件
  8. 界面控件DevExpress WinForms v21.2 - 全新升级的图表控件
  9. 李宏毅机器学习——循环神经网络(一)
  10. 【对讲机的那点事】玩对讲机你知道中继台的工作原理吗?