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

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

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

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

  2. matlab水果定位与分割,利用Matlab软件和BP神经网络快速识别水果实现分拣

    我国是水果生产与消费大国,我国水果不但品种丰富,而且以水果为原料的食品如罐头.果冻等加工产业也颇具规模.然而,在水果果料的加工过程中可能会不经意地混入诸如毛发.纤维丝.纸屑.金属.油漆等异物,从而对产 ...

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

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

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

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

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

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

  6. iOS身份证号码识别

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

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

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

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

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

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

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

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

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

最新文章

  1. MimbleWimble 系列之Pedersen 承诺
  2. 第十六周程序阅读(1)
  3. [转].NET下读取PDF文本
  4. [转] HDU 题目分类
  5. 64位CentOS6.2安装erlang及rabbitmqServer
  6. python读取nii文件_python 读取.nii格式图像实例
  7. php空数组添加,php 删除空数组
  8. Squirrel Engine 曝漏洞,可导致攻击者入侵游戏和云服务
  9. 惨遭打脸:字节某部门竟然有这么多测试
  10. 22. javacript高级程序设计-高级技巧
  11. HCIE-Security Day21:GRE协议:实验(二)配置基于OSPF的GRE隧道
  12. jQuery视频和图片轮播js特效
  13. 你一定不知道的 AppStore 秘密
  14. 思考伯努利试验的两种组合思想
  15. 5分钟使用Python爬取豆瓣TOP250电影榜
  16. 网络是怎样连接的?从浏览器输入URL开始
  17. Arduino 读取 Pin2 的电平信号,并把结果打印到串口,也同时反映到 LED 灯
  18. hangfire安装
  19. 写论文用到的制作图表/流程图的好用软件和链接
  20. 第一个实训项目(2)

热门文章

  1. 推荐一款chrome浏览器插件:视频在线实时翻译
  2. 技术文化和惨淡命运 —— 怀念中国雅虎
  3. 无线通信设备安装工程概预算编制_深圳电气工程造价培训-电气设备安装工程造价入门级知识学习...
  4. docker mysql 镜像 下载_docker mysql 镜像下载
  5. wordpress建立php站点地图,WordPress站点地图(sitemap)制作方法(免插件)
  6. 手机平板连接电脑热点是用不了
  7. MFC:应用程序无法正常启动(0xc0150002)
  8. GhostScript 沙箱绕过命令执行漏洞
  9. 航班网站php项目,php的实时航班api调用代码实例
  10. 计算机快速换界面,老板来了?这些好用的Windows快捷键让你一秒切换操作界面!-页面设置快捷键...