一、课题介绍随着生物识别技术的不断发展,人们发现每个人的指纹具有唯一性和不变性。因此指纹识别技术逐步发展为一种新的身份识别方式,并且凭借其良好的安全可靠性,大有取代传统身份识别方式的趋势。本文简要介绍了指纹识别的基本步骤,分别是指纹图像预处理、指纹特征提取、指纹匹配。在图像预处理中,依次介绍了规格化处理、图像增强、二值化处理和细化处理的方法。预处理后将得到一幅宽度为一个像素的细化二值图像,然后通过特定的端点和交叉点的特征进行指纹匹配。实验表明,该方法效果良好。二、算法流程传统的身份识别技术包括基于密码的身份识别技术和基于令牌的身份识别技术。但是这两种方式都存在着一定的安全风险:令牌容易丢失,密码容易忘记,且它们都容易被窃取或冒充。近年来,依赖人体特征的新型身份识别技术正在兴起,凭借其唯一且不变的特点,生物识别技术逐步成为人们研究的热点。而在生物识别技术中,指纹识别技术已经被广泛的研究和应用。它的基本原理框图如图一所示。 指纹采集指纹图像预处理特征点提取特征点匹配输出显示图1指纹识别的基本原理框图三、指纹图像具体实现及源码3.1图像规格化受采集设备参数和环境的影响,采集到的指纹图像可能总体对比度较差。图像归一化的作用就是使所有指纹图像具有相同的灰度均值和方差,从而将每一幅图像的灰度调整到统一的范围,方便后续处理。归一化的算法是:先计算图像的平均值和方差。这部分工作主要通过统计图像中各点像素值得到该图像的直方图,然后利用直方图来计算指纹图像的相关指标。指定期望经过处理后的图像均值和方差,计算归一化后的图像G。图像规格化的Matlab程序如下(其中方差取Var0=2000,M0=150):% 归一化M=0;var=0;for x=1:m for y=1:n M=M+I(x,y); endendM1=M/(mn);for x=1:m for y=1:n var=var+(I(x,y)-M1).^2; endendvar1=var/(mn);for x=1:m for y=1:n if I(x,y)>=M1 I(x,y)=150+sqrt(2000*(I(x,y)-M1)/var1); else I(x,y)=150-sqrt(2000*(M1-I(x,y))/var1); end endendfigure, imshow(uint8(I)) ;带入指纹图像’zhiwen1.bmp’后得到的原始图像和归一化图像见图2和图3: 图2原始指纹图像 图3规格化后的指纹图像3.2图像分割指纹图像通常包括纹线区域和周边的无用区域。如果保留这些无用区域,会致使计算冗余度增加。为此要先将其从待处理区域中去除。通常用的分离方法有像素领域特征的方法和基于像素分布概率的方法等。本文采取对各像素邻域特征进行分析,然后分割图像算法。吧图像分成TT的非重叠块,计算每一块的灰度均值M和方差Var,通过下列条件区分前景与背景:如果M>M1且Var<Var1,则认为背景如果M<=M1且Var>=Var1,则认为前景,否则待定;对所有分块划分完毕后,在对待定块进行判决。如果在8邻域中,背景景小于等于4则认为是前景,否则是背景在编程过程中通过几次调试后对图像进行33分块处理Matlab程序如下:% 分割M =3; %33H = m/M; L= n/M;aveg1=zeros(H,L);var1=zeros(H,L);% 计算每一块的平均值for x=1:H; for y=1:L; aveg=0;var=0; for i=1:M; for j=1:M; aveg=I(i+(x-1)M,j+(y-1)M)+aveg; end end aveg1(x,y)=aveg/(MM);% 计算每一块的方差值 for i=1:M; for j=1:M; var=(I(i+(x-1)M,j+(y-1)M)-aveg1(x,y)).^2+var; end end var1(x,y)=var/(MM); endendGmean=0;Vmean=0;for x=1:H for y=1:L Gmean=Gmean+aveg1(x,y); Vmean=Vmean+var1(x,y); endendGmean1=Gmean/(HL);%所有块的平均值Vmean1=Vmean/(HL);%所有块的方差 gtemp=0;gtotle=0;vtotle=0;vtemp=0;for x=1:H for y=1:L if Gmean1>aveg1(x,y) gtemp=gtemp+1; gtotle=gtotle+aveg1(x,y); end if Vmean1<var1(x,y) vtemp=vtemp+1; vtotle=vtotle+var1(x,y); end endendG1=gtotle/gtemp;V1=vtotle/vtemp; gtemp1=0;gtotle1=0;vtotle1=0;vtemp1=0;for x=1:H for y=1:L if G1<aveg1(x,y) gtemp1=gtemp1-1; gtotle1=gtotle1+aveg1(x,y); end if 0<var1(x,y)<V1 vtemp1=vtemp1+1; vtotle1=vtotle1+var1(x,y); end endendG2=gtotle1/gtemp1;V2=vtotle1/vtemp1; e=zeros(H,L);for x=1:H for y=1:L if aveg1(x,y)>G2 && var1(x,y)<V2 e(x,y)=1; end if aveg1(x,y)< G1-100 && var1(x,y)< V2 e(x,y)=1; end endend for x=2:H-1 for y=2:L-1 if e(x,y)==1 if e(x-1,y) + e(x-1,y+1) +e(x,y+1) + e(x+1,y+1) + e(x+1,y) + e(x+1,y-1) + e(x,y-1) + e(x-1,y-1) <=4 e(x,y)=0; end end endend Icc = ones(m,n);for x=1:H for y=1:L if e(x,y)==1 for i=1:M for j=1:M I(i+(x-1)M,j+(y-1)M)=G1; Icc(i+(x-1)M,j+(y-1)M)=0; end end end endendfigure, imshow(uint8(I));title(‘分割’);得到的图像如图4:图4经过分割处理后的图像3.3图像二值化一般的指纹图像都有比较清晰的方向场,方向场估计得准确性直接决定了图像增强算法的效果。为估计方向场,我们把指纹脊线的走向分为如下8个方向,如下图:图5 在一个像素处的8个指纹脊线方向我们先对分割后的图像进行了平均滤波,然后对图像的每一个像素,为确定在该像素出的脊线方向,在以该像素为中心的99窗口内,分别计算8个方向上的经过处理后的灰度值,即将图5中标了i(i=0,1,…7分别代表8个方向)的位置的像素灰度值去他们中最大summax和最小值summin,若满足(summax+summin+ 4I(x,y))> (3summ/8),则该像素点的脊线方向为summin,否则为summax.确定完方向后就根据该向场对图像进行二值化。Matlab程序如下:%二值化¯temp=(1/9)[1 1 1;1 1 1;1 1 1];%模板系数 均值滤波 Im=double(I); In=zeros(m,n);for a=2:m-1; for b=2:n-1; In(a,b)=Im(a-1,b-1)temp(1,1)+Im(a-1,b)temp(1,2)+Im(a-1,b+1)temp(1,3)+Im(a,b-1)temp(2,1)+Im(a,b)temp(2,2)+Im(a,b+1)temp(2,3)+Im(a+1,b-1)temp(3,1)+Im(a+1,b)temp(3,2)+Im(a+1,b+1)temp(3,3); endend I=In;Im=zeros(m,n);for x=5:m-5; for y=5:n-5; sum1=I(x,y-4)+I(x,y-2)+I(x,y+2)+I(x,y+4); sum2=I(x-2,y+4)+I(x-1,y+2)+I(x+1,y-2)+I(x+2,y-4); sum3=I(x-2,y+2)+I(x-4,y+4)+I(x+2,y-2)+I(x+4,y-4); sum4=I(x-2,y+1)+I(x-4,y+2)+I(x+2,y-1)+I(x+4,y-2); sum5=I(x-2,y)+I(x-4,y)+I(x+2,y)+I(x+4,y); sum6=I(x-4,y-2)+I(x-2,y-1)+I(x+2,y+1)+I(x+4,y+2); sum7=I(x-4,y-4)+I(x-2,y-2)+I(x+2,y+2)+I(x+4,y+4); sum8=I(x-2,y-4)+I(x-1,y-2)+I(x+1,y+2)+I(x+2,y+4); sumi=[sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8]; summax=max(sumi); summin=min(sumi); summ=sum(sumi); b=summ/8; if (summax+summin+ 4I(x,y))> (3summ/8) sumf = summin; else sumf = summax; end if sumf > b Im(x,y)=128; else Im(x,y)=255; end endend for i=1:m for j =1:n Icc(i,j)=Icc(i,j)Im(i,j); endend for i=1:m for j =1:n if (Icc(i,j)==128) Icc(i,j)=0; else Icc(i,j)=1; end; end end figure,imshow(double(Icc));title(‘二值化’);得到的二值化图像如图6:图6二值化后的图像3.4图像增强在当前的指纹采集条件下,不可避免的会受到环境,皮肤上的油脂、水分、污渍的影响,使采集到的指纹图像出现纹线粘连、纹线断裂等缺陷,对后续的指纹特征提取带来很大困难。所以我们必须对指纹图像进行图像增强处理,例如分离粘连的纹线,连接断裂的纹线,平滑纹线的边缘等,以保证指纹特征提取的可靠性。实验中进行了初步去除空洞和毛刺的处理,程序如下:u=Icc;[m,n]=size(u) %去除空洞和毛刺for x=2:m-1for y=2:n-1if u(x,y)==0if u(x,y-1)+u(x-1,y)+u(x,y+1)+u(x+1,y)>=3u(x,y)=1;endelse u(x,y)=u(x,y);endendendfigure,imshow(u)%title(‘去除毛刺’)for a=2:m-1for b=2:n-1if u(a,b)==1if abs(u(a,b+1)-u(a-1,b+1))+abs(u(a-1,b+1)-u(a-1,b))+abs(u(a-1,b)-u(a-1,b-1))+abs(u(a-1,b-1)-u(a,b-1))+abs(u(a,b-1)-u(a+1,b-1))+abs(u(a+1,b-1)-u(a+1,b))+abs(u(a+1,b)-u(a+1,b+1))+abs(u(a+1,b+1)-u(a,b+1))~=1%寻找端点if (u(a,b+1)+u(a-1,b+1)+u(a-1,b))(u(a,b-1)+u(a+1,b-1)+u(a+1,b))+(u(a-1,b)+u(a-1,b-1)+u(a,b-1))(u(a+1,b)+u(a+1,b+1)+u(a,b+1))==0 %去除空洞和毛刺u(a,b)=0;endendendendendfigure,imshow(u)%t
MATLAB指纹识别系统[GUI,预警]
最新推荐文章于 2025-08-10 00:03:02 发布