【身份证识别】基于模板匹配算法实现二代身份证号码识别系统含Matlab源码

本文介绍了一种基于MATLAB的身份证号码识别算法,首先建立字符库,然后对身份证图像进行预处理、分割,利用连通域算法和模板匹配进行字符识别。在处理过程中,应用了数学形态学的腐蚀和膨胀操作来优化图像。代码实现中包含了阈值调整和迭代优化,以确保号码的准确识别。最后,展示了仿真结果。
摘要由CSDN通过智能技术生成

1 简介

首先从身份证图像上获取0~9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像进行去噪、灰度化、二值化、水平投影切割,垂直投影并切割,将待测身份证号码分割出来,然后进行待测号码图片与字符库样本对比计算、识别判断、最终确定待测身份证号号码。本设计关于身份证号码的识别是基于Matlab软件的基础上进行的。 算法流程 1、输入身份证图片; 2、根据几何信息定位身份证号码位置并且切割; 3、利用连通域算法切割字符; 4、利用模板匹配算法进行识别

数学形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来。数学形态学有2个基本的运算,即腐蚀和膨胀,而腐蚀和膨胀通过结合又形成了开运算和闭运算。 开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀。

1 二值形态学 粗略的说,腐蚀可以使目标区域范围“变小”,其实质造成图像的边界收缩,可以用来消除小且无意义的目标物。式子表达为:

该式子表示用结构B腐蚀A,需要注意的是B中需要定义一个原点,【而B的移动的过程与卷积核移动的过程一致,同卷积核与图像有重叠之后再计算一样】当B的原点平移到图像A的像元(x,y)时,如果B在(x,y)处,完全被包含在图像A重叠的区域,(也就是B中为1的元素位置上对应的A图像值全部也为1)则将输出图像对应的像元(x,y)赋值为1,否则赋值为0。 我们看一个演示图。 B依顺序在A上移动(和卷积核在图像上移动一样,然后在B的覆盖域上进行形态学运算),当其覆盖A的区域为[1,1;1,1]或者[1,0;1,1]时,(也就是B中‘1’是覆盖区域的子集)对应输出图像的位置才会为1。

2 膨胀 粗略地说,膨胀会使目标区域范围“变大”,将于目标区域接触的背景点合并到该目标物中,使目标边界向外部扩张。作用就是可以用来填补目标区域中某些空洞以及消除包含在目标区域中的小颗粒噪声。

该式子表示用结构B膨胀A,将结构元素B的原点平移到图像像元(x,y)位置。如果B在图像像元(x,y)处与A的交集不为空(也就是B中为1的元素位置上对应A的图像值至少有一个为1),则输出图像对应的像元(x,y)赋值为1,否则赋值为0。 演示图为: 3 小结 也就是说无论腐蚀还是膨胀,都是把结构元素B像卷积操作那样,在图像上平移,结构元素B中的原点就相当于卷积核的核中心,结果也是存储在核中心对应位置的元素上。只不过腐蚀是B被完全包含在其所覆盖的区域,膨胀时B与其所覆盖的区域有交集即可。

4 灰度形态学 在讲述灰度值形态学之前,我们进行一个约定,即将结构元素B覆盖住的图像A的区域记为P(取Part之意)。

5 灰度形态学的腐蚀 那么灰度形态学中的腐蚀就是类似卷积的一种操作,用P减去结构元素B形成的小矩形,取其中最小值赋到对应原点的位置即可。 我们来看一个实例,进行加深对灰度形态学的理解。 假设我们有如下的图像A和结构元素B:

进行灰度形态学腐蚀的过程如下: 我们对输出图像的第一个元素的输出结果进行具体的展示,也就是原点对应的4的位置。输出图像其他的元素的值也都是这样得到的。我们会看到,B首先覆盖的区域就是被减数矩阵,然后在其差矩阵中求min(最小值)来作为原点对应位置的值。 灰度形态学的膨胀 根据上面对腐蚀的描述,我们对膨胀做出同样的描述,灰度形态学中的膨胀就是类似卷积的一种操作,用P加上B,然后取这个区域中的最大值赋值给结构元素B的原点所对应的位置。 这里也对输出图像第一个元素值的来历做个说明。 对上面矩阵的和求最大值就是6,所以把6赋值给结构元素原点所对应的位置。

6 小结 上面介绍了灰度形态学的概念,这里来说一说各自的用处。相比较于原图像,因为腐蚀的结果要使得各像元比之前变得更小,所以适用于去除高峰噪声。而灰度值膨胀的结果会使得各像元比之前的变得更大,所以适用于去除低谷噪声。

​2 部分代码

function [ id_codes,id_bw,code_stats,thresh,iteration ] = id_rec_process( img_gray,model,thresh,training_data_size,iteration )narginchk(1,5)if nargin==1    model=[];elseif  nargin<=2 || thresh==0    thresh=.68*graythresh(img_gray);elseif nargin<=3    training_data_size=[47 31];elseif nargin<=4 || isempty(training_data_size)    iteration=1;end% fprintf('Iteration %d, threshold value: %f\n',iteration,thresh)bw=~im2bw(img_gray,thresh);bw=imclearborder(bwareaopen(bw,10));bwc=imdilate(bw,strel('disk',6));code_stats=regionprops(bwc,'Area');step_ratio=1.1;if isempty(code_stats) && thresh*step_ratio<1    [id_codes,id_bw,code_stats,thresh,iteration]=id_rec_process(img_gray,model,thresh*step_ratio,training_data_size,iteration+1);    returnendid_codes=blanks(18);if isempty(code_stats)    id_bw=bw;    returnend[~,midx]=max([code_stats.Area]);mask=bwlabel(bwc)==midx;id_bw=imreconstruct(mask,bw);code_stats=regionprops(id_bw,'Image','Extent');if length(code_stats)~=18 && thresh*step_ratio<1    [id_codes,id_bw,code_stats,thresh,iteration]=id_rec_process(img_gray,model,thresh*step_ratio,training_data_size,iteration+1);    returnendif length(code_stats)==18    inputs=zeros(training_data_size(1)*training_data_size(2),18);    for i=1:size(inputs,2)        img=imresize(code_stats(i).Image,training_data_size);        inputs(:,i)=img(:);    end        % predict    if ~isempty(model)        try            output=model(inputs);            [~,midx]=max(output);            count=size(output,2);            for i=1:count                switch midx(i)                    case 1                        id_codes(i)='X';                    otherwise                        id_codes(i)=num2str(11-midx(i));                end            end        catch e            disp(e)            for i=1:length(e.stack)                disp(e.stack(i))            end        end    endendend

3 仿真结果

4 参考文献

[1]邱道尹, 刘清霞. 基于MATLAB的身份证号码的识别算法[J]. 华北水利水电学院学报, 2012, 33(002):91-94.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值