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

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

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


  1. 引言

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

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

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

基本原理

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


v2-66325202856e6eb5984e44a8c7de5b19_b.jpg



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


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

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

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



v2-1348d82aad45b061e3ea10af8f9765cd_b.jpg


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

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

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



v2-744ccb75de1e3311c261da4d0bc218ca_b.jpg



图 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 各数字的欧拉数



v2-10db4a6024966ad1bfc18349d03f7b72_b.jpg


本文采用 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。 对多个身份证图像进行测试, 均得到正确的结果。



v2-9d677a0e99ec7d76fc260fdf74c092ad_b.jpg


图 4 待识别的身份证图像

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


1 2 10


v2-c6f2934369039f6a311d70e9a8b2d1d2_b.jpg

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.

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐