MATLAB身份证号码识别:GUI版本实现

一、课题介绍

本课题为基于连通域分割和模板匹配的二代居民身份证号码识别系统,带有一个GUI人机交互界面。可以识别数十张身份证图片。

首先从身份证图像上获取0~9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像进行去噪、灰度化、二值化、水平投影切割,垂直投影并切割,将待测身份证号码分割出来,然后进行待测号码图片与字符库样本对比计算、识别判断、最终确定待测身份证号号码。本设计关于身份证号码的识别是基于Matlab软件的基础上进行的。

 

二、算法流程

1、输入身份证图片;2、根据几何信息定位身份证号码位置并且切割;3、利用连通域算法切割字符;4、利用模板匹配算法进行识别

、打开图像
[FileName,PathName] = uigetfile('*.jpg','Select an image');
if PathName~=0
    str = [PathName,FileName];
    T=imread(str);
    axes(handles.axes1);
    imshow(T);
end
2、预处理
[m,n,r]=size(I);%图像的像素为width*height
%%%%%蓝色字体变黑
myI=double(I);

for i=1:m
    for j=1:n
            if((myI(i,j,1)>=15)&&(myI(i,j,1)<=130)&&((myI(i,j,2)<=165)&&(myI(i,j,2)>=90))&&((myI(i,j,3)<=220)&&(myI(i,j,3)>=135))) % 蓝色RGB的灰度范围
              I(i,j,1)=40; %红色分量
              I(i,j,2)=40; %绿色分量
              I(i,j,3)=40; %蓝色分量
           end
    end
end
%figure, imshow(I);title('变色后的图像');

width=round(0.9*n);height=round(0.87*m);
rx=round(0.05*n);cy=round(0.075*m);
I=subim(I,height,width,rx,cy);
%figure,imshow(I);


if sum(size(I)>0)==3 %倘若是彩色图--2*3,先转换成灰度图
I=rgb2gray(I);
end
%figure,imhist(I);
x=3;%行数分为x部分
y=1;%列数分为y部分
BW=erzhihua(I,x,y);

[n m l]=size(BW);%图像的像素为m*n
c = [0.65*m 0.65*m m m];
r = [0 0.85*n 0.85*n 0];
BW = roifill(BW,c,r);

BW=imadjust(BW);%使用imadjust函数对图像进行增强对比度
% Convert to BW
threshold = graythresh(BW);
BW =~im2bw(BW,0.6*threshold);

[image_h image_w]=size(BW);
% Remove all object containing fewer than (imagen/80) pixels
BW = bwareaopen(BW,floor(image_w/80));
% 滤波
imshow(BW);
3、识别
[image_h image_w]=size(imagen);
%figure;imshow(imagen);title('INPUT IMAGE')

% Convert to gray scale
if size(imagen,3)==3 %RGB image
    imagen=rgb2gray(imagen);
end

%Storage matrix word from image
word=[ ];
re=imagen;
% Compute the number of letters in template file
num_letras=size(templates,2);

plot_flag=1;
while 1
    %Fcn 'lines' separate lines in text
    [fl re]=lines(re);
    imgn=fl;
    [line_h line_w]=size(fl);%记录下切割出来的一行字符的长宽
    %Uncomment line below to see lines one by one
    % imshow(fl);pause(1)
    %-----------------------------------------------------------------
    % Label and count connected components
   [L Ne] = bwlabel(imgn);

      n=1;%记录循环次数
while(n<=Ne)
        char_flag=0;%0时,是第一次判断这个连通域
        flag=1;%初始化两个连通域属于同个字符
   while(flag==1)
      if char_flag==0
        [r,c] = find(L==n);
        Width0=max(r)-min(r);%连通域宽度
        Height0=max(c)-min(c);%连通域高度
        Radio0=Width0/Height0;%连通域宽高比
        Square0=Width0*Height0;%连通域面积
        maxr=max(r);
        maxc=max(c);
        minr=min(r);
        minc=min(c);
      end
       if n<Ne
          [r1,c1] = find(L==(n+1));%寻找下一个连通域
          Width1=max(r)-min(r);%连通域宽度
          Height1=max(c)-min(c);%连通域高度
          Radio1=Width1/Height1;%连通域宽高比
          Square1=Width1*Height1;%连通域面积
          Uheight=max(maxc,max(c1))-min(minc,min(c1));%合并后高度
          Uwidth=max(maxr,max(r1))-min(minr,min(r1));%合并后宽度
          Uradio=Uwidth/Uheight;%合并后的宽高比
          Oheigth=Height0+Height1-Uheight;%重叠高度
          Owidth=Width0+Width1-Uwidth;%重叠宽度
          Osquare=Oheigth*Owidth;%重叠面积
       else
           flag=0;%这是这一行最后一个连通域
       end
           ph=5;%边界因子
           pw=7;
       if(flag==1)&&((Owidth>=-(image_w/pw)&&Owidth<=0)||(Oheigth>=-(line_h*0.3)&&Oheigth<=0))%两个连通域较近,但不重叠
           if((Uradio>=0.8)&&(Uradio<=1.2))%认为两个连通域属于同一个字符
           elseif Uheight<line_h*0.4;%连通域的合并之后高度过小的,认为是一个字符的一部分,很可能是边旁部首
           else flag=0;%否则这两个连通域属于不同字符
           end
       elseif(flag==1)&&(Owidth<-(image_w/pw))%两个连通域里相距较远
           flag=0;%两个连通域属于不同字符
     % elseif(flag==1)&&((Owidth>0)||(Oheigth>0))%两连通域重叠
      elseif(flag==1)&&((Owidth>0))%两连通域重叠
               if(((Uradio>=0.78)&&(Uradio<=1.3)))%认为两个连通域属于同一个字符
               elseif(Osquare>=0.4*min(Square0,Square1)&&(Uwidth<image_w/45))
               else
               flag=0;%两个连通域属于不同字符
           end
       else flag=0;%两个连通域属于不同字符
       end
       if flag==1%经过上面判断,两个连通域属于同一个字符,进行连通域合并
           Width0=Uwidth;%连通域宽度
           Height0=Uheight;%连通域高度
           Radio0=Width0/Height0;%连通域宽高比
           Square0=Width0*Height0;%连通域面积
           maxr=max(maxr,max(r1));
           maxc=max(maxc,max(c1));
           minr=min(minr,min(r1));
           minc=min(minc,min(c1));
           n=n+1;%指向下一个连通域
           char_flag=1;
       end
   end  %while(flag==1)的end



        % Extract letter
        n1=imgn(minr:maxr,minc:maxc);
        % Resize letter (same size of template)
        img_r=imresize(n1,[36 23]);
               plot_flag=plot_flag+1;
        %Uncomment line below to see letters one by one
        % imshow(img_r);title(n);pause(0.5)
        %-------------------------------------------------------------------
        % Call fcn to convert image to text
        letter=read_letter(img_r,num_letras);
        % Letter concatenation
        word=[word letter];
        n=n+1;
        end % while(n<=Ne)的end
    %fprintf(fid,'%s\n',lower(word));%Write 'word' in text file (lower)
    set(handles.edit1,'string',word);

    word=[ ];

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空