飞道的博客

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

273人阅读  评论(0)

⛄一、身份证号码识别简介(附课题作业报告)

1 引言
当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开始建立自己的安全保障体系,其中最为关键的就是身份证号码登记管理。身份证号码的录入全部采用手动输入的方式,这是项非常繁琐的工作,手动录入方式一方面耗费了大量的人力,浪费了时间,另一方面又容易出错,录入正确率偏低。因此,如何快速录入身份证号码已成
为迫切需要解决的问题
随着人工神经网络技术的快速发展,神经网络在处理数据方面具备快速性和高效性,图像识别技术的研究和应用也取得了突破性进展,应用神经网络识别身份证号码,可以提高识别的准确性和鲁棒性。因此, 笔者利用MATLAB GUI和神经网络设计开发了一个可快速识别身份证号码的仿真平台。

2 BP神经网络
人工神经网络是对人脑或者生物神经网络若干基本特性的抽象和模拟,使机器拥有和人脑一样的感知、学习和推理能力。神经网络系统是一个复杂而庞大的非线性系统,它的信息主要由若干个结构简单的处理单元按照某种连接方式对数据进行映射来传递。
BP神经网络是一种多层前馈神经网络,已成为应用最广、发展最成熟的一种人工神经网络,由输入层、隐含层和输出层组成,三层BP神经网络的拓扑结构如图1所示,层与层之间采用全互连方式,同一层之间不存在相互连接,隐含层可以有一层或多层。由于BP神经网络具有完善的理论体系、清晰的算法流程、清晰的数据识别和模式功能。绝大部分解决非线性系统问题的神经网络模型都采用BP神经网络或其变化形式。它也是前向网络的核
心部分,体现了人工神经网络的精华。

图1三层BP神经网络的拓扑结构
MATLAB的神经网络工具箱(Neural NetworkToolbox)功能完善, 提供了神经网络的建立、训练和模拟等函数,以及各种改进训练算法函数,用户可以很容易地设计和模拟神经网络,也可以在MATLAB源代码的基础上进行适当修改, 形成自己的工具包以满足实际需要。本文采用的训练函数是具有较快收敛速度且能避免局部最小问题出现的train gdm函数, BP网络的输入与输出节点数根据实际情况来决定,与网络性能无关,网络结构最关键是确定隐含层节点数,经反复验证,本系统当隐含层节点数为35时,计算误差MSE最小。

⛄二、部分源代码

%根据身份证号码区图像和数字标号,显示该数字对应的图像信息
function I_ID_1 = get_number(I_ID,i)
img_reg_1 = regionprops(I_ID, ‘area’, ‘boundingbox’);%统计被标记的区域的面积分布
rects_1 = cat(1,img_reg_1.BoundingBox);%联结连通域
num_1 = find(rects_1(:,4) > 20);%根据身份证高度信息,筛选身份证数字信息
if length(num_1) ~= 18
disp(‘身份证号码识别错误’);
end
clear;close all;clc;

[filename,filepath]=uigetfile({‘.jpg’;'.bmp’},‘输入一个需要识别的图像’);
file=strcat(filepath,filename);
ID_origin=imread(file);

ID_origin=imresize(ID_origin,[2560 2100]);
ID_normalization = im2double(ID_origin);
ID_binaryzation0 = im2bw(ID_normalization,0.4);
ID_binaryzation1 = im2bw(ID_normalization,0.3);
ID_strel = strel(‘disk’,2);
ID_binaryzation=imdilate(ID_binaryzation1,ID_strel);

figure(‘name’,‘身份证原始图’);
subplot(2,2,1);
imshow(ID_origin);
title(‘身份证原图’);
subplot(2,2,2);
imshow(ID_binaryzation0);
title(‘二值化系数0.4’);
subplot(2,2,3);
imshow(ID_binaryzation1);
title(‘二值化系数0.3’);
subplot(2,2,4);
imshow(ID_binaryzation);
title(‘二值化+膨胀处理’);

ID_contrary = ~ID_binaryzation;
ID_strel = strel(‘line’, 20 , 0);
ID_bulk_1=imdilate(ID_contrary,ID_strel);
ID_bulk_2=imdilate(ID_bulk_1,ID_strel);
ID_bulk_3=imdilate(ID_bulk_2,ID_strel);

figure(‘name’,‘身份证膨胀图像’);
subplot(221),imshow(ID_contrary);
title(‘身份证原始图像’);
subplot(222),imshow(ID_bulk_1);
title(‘身份证1次膨胀后的图像’);
subplot(223),imshow(ID_bulk_2);
title(‘身份证2次膨胀后的图像’);
subplot(224),imshow(ID_bulk_3);
title(‘身份证3次膨胀后的图像’);
suptitle(‘身份证膨胀图像’);%显示主标题

% 获取连通域

rects = cat(1,img_reg.BoundingBox);

figure(‘name’,‘身份证划分区域’),
imshow(ID_bulk_3);
for i = 1:size(rects, 1)
rectangle(‘position’, rects(i, 😃, ‘EdgeColor’, ‘r’);
end

num1 = find(abs(rects(:,3)-1200)<80);
num2 = find(abs(rects(:,4)-62)<10);
num = intersect(num1,num2);%获取相同序列值
rectangle(‘position’, rects(num,:), ‘EdgeColor’,‘g’);
title(‘身份证划分区域’);

%提取身份证号码区域
[I_x,I_y] = size(ID_bulk_3);
ID_x = floor(rects(num,2)):ceil(rects(num,2)+rects(num,4));
ID_y = floor(rects(num,1)):ceil(rects(num,1)+rects(num,3));
I_ID = ID_contrary(ID_x,ID_y);
figure(‘name’,‘身份证号码区’);
imshow(I_ID);
title(‘身份证号码区’);

img_reg_1 = regionprops(I_ID, ‘area’, ‘boundingbox’);
rects_1 = cat(1, img_reg_1.BoundingBox);

figure(‘name’,‘身份证号码数字区’),
imshow(I_ID);
for i = 1:size(rects_1, 1)
rectangle(‘position’, rects_1(i, 😃, ‘EdgeColor’, ‘r’);
end
title(‘身份证号码数字区’);

figure(‘name’,‘身份证数字分割显示’);
suptitle(‘身份证数字分割显示’);
for i = 1:18

I_ID_1 = ~I_ID_1;
JPG = ones(100,100);
[JPG_x,JPG_y] = size(I_ID_1);

subplot(3,6,i);
imshow(JPG); 
name=strcat(int2str(i),'.bmp');
imwrite(JPG,name);

end

clc;
load NET_new net;
for i = 1:18
% name=strcat(‘10 (’,int2str(i),‘).bmp’);
name=strcat(int2str(i),‘.bmp’);
JPG_origin = ~imread(name);

[a,Pf,Af]=sim(net,BMP);           
result(i) = round(a);

end
%% 检验身份证信息
ID_test = result(1:17);
ID_check = [7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ];
ID_sum = sum(ID_test.*ID_check);
TD_mod = mod(ID_sum,11) + 1;
ID_last = [1 0 10 9 8 7 6 5 4 3 2];
ID_18 = ID_last(TD_mod);
%验证身份证信息是否正确,保存文档至txt
if ID_18 == result(18)
disp(‘身份证信息识别成功!’);
fid = fopen(‘身份证号码.txt’,‘wt’);
fprintf(fid,‘%g’,abs(result(1:17)));
if result(18) == 10
fprintf(fid,‘X’);
else
fprintf(fid,‘%g’,abs(result(18)));
fopen(fid);
end
else
disp(‘身份证信息识别错误!’);
end

result

⛄三、运行结果





⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]李开,陈礼安,曹计昌.基于灰度多值化的身份证号码识别[J].计算机工程与应用. 2015,51(13)
[2]成利敏,孙亮,王宁.基于BP神经网络和GUI的身份证号码识别系统[J].廊坊师范学院学报(自然科学版). 2019,19(04)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除


转载:https://blog.csdn.net/weixin_63266434/article/details/128347461
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场