资源描述:
《matlab身份证号码识别代码.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、%身份证识别程序。识别身份证上面的身份证号码,并且单独提取出来,形成一副仅剩身份证号码的二值区域图像clc;clearall;closeall;A=imread('E:张强matlab程序调试2015matlab程序调试~网上例子id_indentification_pic.jpg');%读入图像I1=rgb2gray(A);%灰度处理,自动取值二值化level=graythresh(I1);I2=im2bw(I1,level);I3=~I2;figure;imshow(I3);I4=bwareao
2、pen(I3,25);%去除小面积区域(降噪)I=~I4;%figure;%imshow(I4);[yx]=size(I);%先确定身份证号码所在的大概区域(身份证号码都在身份证的右下角)A2=imcrop(I,[x/3y/22*x/3y/2]);%figure;%imshow(A2);se=strel('square',40);%进行开运算,使图像形成几个连通域bw=imopen(A2,se);%figure;%imshow(bw);%%%%%%寻找连通域的边缘,并且把每个连通域的边界画出来[B,L]=b
3、wboundaries(bw,4);%使用了函数bwboundariesfigure;imshow(label2rgb(L,@jet,[.5.5.5]));%label2rgb把标签矩阵转化为彩色图像holdon;fork=1:length(B)boundary=B{k};plot(boundary(:,2),boundary(:,1),'r','LineWidth',2);%将物体的边界画出来end%找到每个连通域的质心及面积stats=regionprops(L,'Area','Centroid');%
4、%%%%%循环历遍每个连通域的边界,得到匹配度特征范围内的物体(即截出身份证号码的位置图片)fork=1:length(B)boundary=B{k};%获取一条边界上的所有点delta_sq=diff(boundary).^2;%计算边界周长perimeter=sum(sqrt(sum(delta_sq,2)));%计算边界周长area=stats(k).Area;%获取边界所围面积metric=80*area/perimeter^2;%计算匹配度%要显示的匹配度字串metric_string=sprin
5、tf('%2.2f',metric);%在图上显示字符串(匹配度的值)%%%%%%标记出匹配度接近1的连通域(只有匹配度在0.8与1.1之间的连通域才画出来)ifmetric>=0.8&&metric<=1.1centroid=stats(k).Centroid;plot(centroid(1),centroid(2),'ko');%将对应的质心画出来%提取该连通域所对应在二值图像中的矩形区域goalboundary=boundary;s=min(goalboundary,[],1);%%%怎么有两个参数e
6、=max(goalboundary,[],1);%将目标区域分别向两侧延伸7个像素goal=imcrop(A2,[s(2)-7s(1)e(2)-s(2)+14e(1)-s(1)]);end%显示匹配度字串text(boundary(1,2)-35,boundary(1,1)+13,...metric_string,'Color','g',...'FontSize',14,'FontWeight','bold');endgoal=~goal;%将目标区域进行反处理figure,imshow(goal)%%%%
7、将18个字符单独一一截取出来,并且显示在同一个figure中%求出目标区域的长度,并且求出等分为18个字符之后的长度cs=size(goal,2);sz=cs/18;%定义变量t1、t2,分别为每个切割的起点和终点,以及它们的计算方法t1=(0:17)*sz+1;t2=(1:18)*sz;%%%%将字符单独切割出来,并且显示在同一个figure中figure;k=0;%将目标区域从左至右开始切割提取(对每一个单一的字符块做相应处理(对应字符块的矩阵做相应处理))fori=1:18%每个身份证上的身份证号码都
8、有18个字符%temp=goal(:,t1(i):t2(i),:);temp=goal(:,t1(i):t2(i));temp=bwareaopen(temp,20);%对切割后的图像做降噪处理(去除小面积区域)temp=id_identification_qiege(temp);%调用自己编写的子函数(对图像进一步处理,去除每个字符周围的全零行)temp=imresize(temp,[30,20]);%对tem