Matlab指纹识别.docx

上传人:b****6 文档编号:3730176 上传时间:2022-11-25 格式:DOCX 页数:29 大小:402.19KB
下载 相关 举报
Matlab指纹识别.docx_第1页
第1页 / 共29页
Matlab指纹识别.docx_第2页
第2页 / 共29页
Matlab指纹识别.docx_第3页
第3页 / 共29页
Matlab指纹识别.docx_第4页
第4页 / 共29页
Matlab指纹识别.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

Matlab指纹识别.docx

《Matlab指纹识别.docx》由会员分享,可在线阅读,更多相关《Matlab指纹识别.docx(29页珍藏版)》请在冰豆网上搜索。

Matlab指纹识别.docx

Matlab指纹识别

指纹识别技术研究

个人的指纹是独一无二的,两人之间不存在着相同的手指指纹。

每个人的指纹是相当固定的,不会随着人的年龄的增长或身体健康程度的变化而变化,但是人的声音等却存在较大变化的可能。

3)指纹样本便于获取,易于开发识别系统,实用性强。

目前已有标准的指纹样本库,方便了识别系统的软件开发;另外,识别系统中完成指纹采样功能的硬件部分也较易实现。

而对视网膜则难于采样,也无标准的视网膜样本库供系统软件开发使用,这就导致视网膜识别系统难以开发,可行性较低。

一个人的十指指纹皆不相同,这样可以方便地利用多个指纹构成多重口令,提高系统的安全性。

指纹识别中使用的模板并非最初的指纹图,而是由指纹图中提取的关键特征,这样使系统对模板库的存储量较小。

另外,对输入的指纹图提取关键特征后,可以大大减少网络传输的负担,便于实现异地确认,支持计算机的网络功能。

近些年来,电子信息技术的飞速发展,特别是传感技术、电子信号处理技术、计算机数据管理技术、计算机网络技术的飞速发展,为指纹识别技术的成型提供了强大的硬件支持。

与此同时,图形图像处理学、人工智能学、软件工程学等新兴学科的蓬勃发展也为指纹识别技术的进步提供了强有力的软件支持。

指纹识别的发展中,也存在自身的不足,如指纹识别系统性能的测试和评估标准的确立、相关软件的标准化问题都是有待进一步解决的。

指纹识别技术作为一项迅猛发展的新技术,有了软硬件等方面的强大保障,同时又有指纹识别自身的诸多优点,相信指纹识别技术一定会有更加美好的发展前景。

 

摘要:

随着生物识别技术的不断发展,人们发现每个人的指纹具有唯一性和不变性。

因此指纹识别技术逐步发展为一种新的身份识别方式,并且凭借其良好的安全可靠性,大有取代传统身份识别方式的趋势。

本文简要介绍了指纹识别的基本步骤,分别是指纹图像预处理、指纹特征提取、指纹匹配。

在图像预处理中,依次介绍了规格化处理、图像增强、二值化处理和细化处理的方法。

预处理后将得到一幅宽度为一个像素的细化二值图像,然后通过特定的端点和交叉点的特征进行指纹匹配。

实验表明,该方法效果良好。

论文中采用Matlab编程实现全部算法。

关键词:

指纹识别,图像处理,特征提取,特征匹配

1.引言

传统的身份识别技术包括基于密码的身份识别技术和基于令牌的身份识别技术。

但是这两种方式都存在着一定的安全风险:

令牌容易丢失,密码容易忘记,且它们都容易被窃取或冒充。

近年来,依赖人体特征的新型身份识别技术正在兴起,凭借其唯一且不变的特点,生物识别技术逐步成为人们研究的热点。

而在生物识别技术中,指纹识别技术已经被广泛的研究和应用。

它的基本原理框图如图一所示。

图1指纹识别的基本原理框图

2.指纹图像预处理

2.1图像规格化

受采集设备参数和环境的影响,采集到的指纹图像可能总体对比度较差。

图像归一化的作用就是使所有指纹图像具有相同的灰度均值和方差,从而将每一幅图像的灰度调整到统一的范围,方便后续处理。

归一化的算法是:

(1)先计算图像的平均值和方差。

这部分工作主要通过统计图像中各点像素值得到该图像的直方图,然后利用直方图来计算指纹图像的相关指标。

(2)指定期望经过处理后的图像均值和方差,计算归一化后的图像G。

图像规格化的Matlab程序如下(其中方差取Var0=2000,M0=150):

%归一化

M=0;var=0;

forx=1:

m

fory=1:

n

M=M+I(x,y);

end

end

M1=M/(m*n);

forx=1:

m

fory=1:

n

var=var+(I(x,y)-M1).^2;

end

end

var1=var/(m*n);

forx=1:

m

fory=1:

n

ifI(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

end

end

figure,imshow(uint8(I));

带入指纹图像’zhiwen1.bmp’后得到的原始图像和归一化图像见图2和图3:

图2原始指纹图像图3规格化后的指纹图像

 

2.2图像分割

指纹图像通常包括纹线区域和周边的无用区域。

如果保留这些无用区域,会致使计算冗余度增加。

为此要先将其从待处理区域中去除。

通常用的分离方法有像素领域特征的方法和基于像素分布概率的方法等。

本文采取对各像素邻域特征进行分析,然后分割图像算法。

吧图像分成T*T的非重叠块,计算每一块的灰度均值M和方差Var,通过下列条件区分前景与背景:

(1)如果M>M1且Var

(2)如果M<=M1且Var>=Var1,则认为前景,否则待定;

(3)对所有分块划分完毕后,在对待定块进行判决。

如果在8邻域中,背景景小于等于4则认为是前景,否则是背景

在编程过程中通过几次调试后对图像进行3*3分块处理

Matlab程序如下:

%分割

M=3;%3*3

H=m/M;L=n/M;

aveg1=zeros(H,L);

var1=zeros(H,L);

%计算每一块的平均值

forx=1:

H;

fory=1:

L;

aveg=0;var=0;

fori=1:

M;

forj=1:

M;

aveg=I(i+(x-1)*M,j+(y-1)*M)+aveg;

end

end

aveg1(x,y)=aveg/(M*M);

%计算每一块的方差值

fori=1:

M;

forj=1:

M;

var=(I(i+(x-1)*M,j+(y-1)*M)-aveg1(x,y)).^2+var;

end

end

var1(x,y)=var/(M*M);

end

end

Gmean=0;Vmean=0;

forx=1:

H

fory=1:

L

Gmean=Gmean+aveg1(x,y);

Vmean=Vmean+var1(x,y);

end

end

Gmean1=Gmean/(H*L);%所有块的平均值

Vmean1=Vmean/(H*L);%所有块的方差

gtemp=0;gtotle=0;vtotle=0;vtemp=0;

forx=1:

H

fory=1:

L

ifGmean1>aveg1(x,y)

gtemp=gtemp+1;

gtotle=gtotle+aveg1(x,y);

end

ifVmean1

vtemp=vtemp+1;

vtotle=vtotle+var1(x,y);

end

end

end

G1=gtotle/gtemp;V1=vtotle/vtemp;

gtemp1=0;gtotle1=0;vtotle1=0;vtemp1=0;

forx=1:

H

fory=1:

L

ifG1

gtemp1=gtemp1-1;

gtotle1=gtotle1+aveg1(x,y);

end

if0

vtemp1=vtemp1+1;

vtotle1=vtotle1+var1(x,y);

end

end

end

G2=gtotle1/gtemp1;V2=vtotle1/vtemp1;

e=zeros(H,L);

forx=1:

H

fory=1:

L

ifaveg1(x,y)>G2&&var1(x,y)

e(x,y)=1;

end

ifaveg1(x,y)

e(x,y)=1;

end

end

end

forx=2:

H-1

fory=2:

L-1

ife(x,y)==1

ife(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

end

end

Icc=ones(m,n);

forx=1:

H

fory=1:

L

ife(x,y)==1

fori=1:

M

forj=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

end

end

figure,imshow(uint8(I));title('分割');

得到的图像如图4:

图4经过分割处理后的图像

2.3图像二值化

一般的指纹图像都有比较清晰的方向场,方向场估计得准确性直接决定了图像增强算法的效果。

为估计方向场,我们把指纹脊线的走向分为如下8个方向,如下图:

图5在一个像素处的8个指纹脊线方向

我们先对分割后的图像进行了平均滤波,然后对图像的每一个像素,为确定在该像素出的脊线方向,在以该像素为中心的9*9窗口内,分别计算8个方向上的经过处理后的灰度值,即将图5中标了i(i=0,1,…7分别代表8个方向)的位置的像素灰度值去他们中最大summax和最小值summin,若满足(summax+summin+4*I(x,y))>(3*summ/8),则该像素点的脊线方向为summin,否则为summax.

确定完方向后就根据该向场对图像进行二值化。

Matlab程序如下:

%二值化¯

temp=(1/9)*[111;111;111];%模板系数均值滤波

Im=double(I);

In=zeros(m,n);

fora=2:

m-1;

forb=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);

end

end

I=In;

Im=zeros(m,n);

forx=5:

m-5;

fory=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+4*I(x,y))>(3*summ/8)

sumf=summin;

else

sumf=summax;

end

ifsumf>b

Im(x,y)=128;

else

Im(x,y)=255;

end

end

end

fori=1:

m

forj=1:

n

Icc(i,j)=Icc(i,j)*Im(i,j);

end

end

fori=1:

m

forj=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二值化后的图像

 

2.4图像增强

在当前的指纹采集条件下,不可避免的会受到环境,皮肤上的油脂、水分、污渍的影响,使采集到的指纹图像出现纹线粘连、纹线断裂等缺陷,对后续的指纹特征提取带来很大困难。

所以我们必须对指纹图像进行图像增强处理,例如分离粘连的纹线,连接断裂的纹线,平滑纹线的边缘等,以保证指纹特征提取的可靠性。

实验中进行了初步去除空洞和毛刺的处理,程序如下:

u=Icc;

[m,n]=size(u)%去除空洞和毛刺

forx=2:

m-1

fory=2:

n-1

ifu(x,y)==0

ifu(x,y-1)+u(x-1,y)+u(x,y+1)+u(x+1,y)>=3

u(x,y)=1;

end

elseu(x,y)=u(x,y);

end

end

end

figure,imshow(u)

%title('去除毛刺')

fora=2:

m-1

forb=2:

n-1

ifu(a,b)==1

ifabs(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;

end

end

end

end

end

figure,imshow(u)

%title('去除空洞')

得到的去除毛刺后的图像和再去除空洞后的图像分别如图7和图8:

图7去除毛刺后的图像图8去除空洞后的图像

 

2.5图像细化

二值化后的纹线仍然具有一定的宽度,因为指纹识别只与纹线的走向有关,所以需要对二值图像进行细化,以减少冗余信息,突出纹线的有效特征,便于后续的特征提取。

程序如下:

v=~u;

se=strel('square',3);

fo=imopen(v,se);

v=imclose(fo,se);%对图像进行开操作和闭操作

w=bwmorph(v,'thin',Inf);%对图像进行细化

figure,imshow(w)

title('细化图')

得到的图像如图9:

图9细化后的图像

 

3.特征点提取

3.1找出所有的端点和交叉点

因为特征点必然是从端点和交叉点里找出,所以在得到细化的图像后,我们首先要找出所有的端点和交叉点。

首先对通过定义函数P.m对图像中每个点的8邻域位置进行坐标定义,方便后续编程。

P.m程序如下:

%-----Subfunctions-------

functionj=P(img,x,y,i)

%getpixelvaluebasedonchart:

%4|3|2

%5||1

%6|7|8

switch(i)

case{1,9}

j=img(x+1,y);

case2

j=img(x+1,y-1);

case3

j=img(x,y-1);

case4

j=img(x-1,y-1);

case5

j=img(x-1,y);

case6

j=img(x-1,y+1);

case7

j=img(x,y+1);

case8

j=img(x+1,y+1);

end

然后定义函数point.m来找出细化后图像的所有端点。

将一个点的8个邻域依次两两相减并取绝对值,并将所有结果相加,从细化图像的特征来说,和为2时为端点,和为6时为交叉点。

程序如下:

functiontxy=point(thin)

count=1;

txy(count,:

)=[0,0,0];

siz=min(size(thin,1),size(thin,2));

forx=40:

siz-40

fory=40:

siz-40

if(thin(y,x))

CN=0;

fori=1:

8

CN=CN+abs(P(thin,y,x,i)-P(thin,y,x,i+1));

end

if(CN==2)

txy(count,:

)=[x,y,2];

count=count+1;

end

if(CN==6)

txy(count,:

)=[x,y,6];

count=count+1;

end

end

end

end

fori=1:

count-1

x(i)=txy(i,1);

y(i)=txy(i,2);

end

imshow(double(thin));

holdon;

plot(x,y,'.');

运行完程序后,将所有的端点和交叉点全部找出。

定义的数组txy第一项为横坐标,第二项为纵坐标,第三项为2或6(2为端点、6为交叉点)。

得到的标出端点和交叉点的图像如图10:

图10标出端点和交叉点的细化图像

 

3.2纹线光滑处理

在指纹图像预处理中,已经对指纹图像进行过去除毛刺和空洞的处理。

这里通过定义函数guanghua.m进一步对细化后的图像进行光滑处理。

基本原理为:

找到每个端点,使其沿着纹线的方向移动5个像素,如果在5个像素之内遇到交叉点,则认为此端点为毛刺,去除此点。

guanghua.m程序如下:

functionw=guanghua(thin,txy)

forj=1:

5

txy=point(thin);

pxy=txy(find(txy(:

3)==2),:

);

n=size(pxy,1);

fori=1:

n

error=0;

error=walk(thin,pxy(i,1),pxy(i,2),5);

iferror==1

thin(pxy(i,2),pxy(i,1))=0;

end

end

end

w=thin;

imshow(w);

光滑后的图像如图11所示:

图11光滑后的图像

光滑完后需再次执行point函数来画出新的端点,如下图所示:

图12光滑后标出端点和特征点的图像

3.3去除图像边缘的端点

可以看出,在指纹图像的边缘,由于采集仪器的关系,不可避免的多出很多端点,一方面增加了后续工作量,另一方面还可能产生错误,所以有必要将这些边缘的端点去除。

本实验中设计了cut函数来进行处理。

函数如下:

functiontxy=cut(thin,txy)

s(8,8)=0;

delta(8,8)=0;

n=size(txy,1);

fori=1:

8

forj=1:

8

mp{i,j}=thin(1+31*(i-1):

31+31*(i-1),1+31*(j-1):

31+31*(j-1));

s(i,j)=sum(sum(mp{i,j}))/(31*31);

mp{i,j}=(mp{i,j}-s(i,j)).^2;

delta(i,j)=sum(sum(mp{i,j}));

ifdelta(i,j)<=70

fork=1:

n

if(txy(k,1)>=1+31*(i-1)&&txy(k,1)<=31+31*(i-1)&&txy(k,2)>=1+31*(j-1)&&txy(k,2)<=31+31*(j-1)&&txy(k,3)==2)

txy(k,:

)=[0,0,0];

end

end

end

end

end

txy=txy(find(txy(:

1)),:

);

plot(txy(:

1),txy(:

2),'ro');

得到的图像如下:

图13去除图像边缘端点后的图像

3.4找出特征点

3.4.1single_point函数

经过光滑处理和去除边缘端点后进一步减少了端点和交叉点的个数。

下面就要找出一些独特的端点来作为特征点。

在一幅细化的指纹图上,如果一个端点的周围半径为r个像素的圆内没有任何端点或交叉点,那么随着r的逐渐变大,这样的点会越来越少,也就越来越独特。

于是我们设计了一个函数single_point来找出这样的点。

程序如下:

function[pxy2,error]=single_point(txy,r)

error=0;

x=txy(:

1);

y=txy(:

2);

n=length(x);

d(1:

n,1:

n)=0;

forj=1:

n

fori=1:

n

if(i~=j)

d(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);

else

d(i,j)=2*r;

end

end

end

[a,b]=min(d);

c=find(a>r);

pxy2=txy(c,:

);

pxy2=pxy2(find(pxy2(:

3)==2),:

);

t=size(pxy2,1);

ift==0

error=1

else

plot(x,y,'b.');

holdon

plot(pxy2(:

1),pxy2(:

2),'r.');

end

比如在执行[pxy2,error]=single_point(txy,20)后,会显示出下图:

图14执行single-point函数后Matlab的显示情况

由运行结果可知,有3个端点满足周围半径为20个像素的圆内没有任何端点和交叉点的条件。

这三个点在下图中用红点标出。

图15满足条件的特征点

3.4.2walk函数

在此,我们还定义了一个walk函数,用于进一步找出特征点,它的作用是判断离某一端点num距离是否有另一端点。

函数如下:

function[error,a,b]=walk(thin,x0,y0,num)

error=0;

thin(y0,x0)=0;

t1=0;

forn=1:

num

iferror==1

break;

else

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1