Matlab指纹识别Word文档下载推荐.docx
《Matlab指纹识别Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Matlab指纹识别Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
图像规格化的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);
var=var+(I(x,y)-M1).^2;
var1=var/(m*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);
figure,imshow(uint8(I));
带入指纹图像’zhiwen1.bmp’后得到的原始图像和归一化图像见图2和图3:
图2原始指纹图像图3规格化后的指纹图像
2.2图像分割
指纹图像通常包括纹线区域和周边的无用区域。
如果保留这些无用区域,会致使计算冗余度增加。
为此要先将其从待处理区域中去除。
通常用的分离方法有像素领域特征的方法和基于像素分布概率的方法等。
本文采取对各像素邻域特征进行分析,然后分割图像算法。
吧图像分成T*T的非重叠块,计算每一块的灰度均值M和方差Var,通过下列条件区分前景与背景:
(1)如果M>
M1且Var<
Var1,则认为背景
(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);
%计算每一块的平均值
H;
L;
aveg=0;
fori=1:
M;
forj=1:
aveg=I(i+(x-1)*M,j+(y-1)*M)+aveg;
aveg1(x,y)=aveg/(M*M);
%计算每一块的方差值
var=(I(i+(x-1)*M,j+(y-1)*M)-aveg1(x,y)).^2+var;
var1(x,y)=var/(M*M);
Gmean=0;
Vmean=0;
H
L
Gmean=Gmean+aveg1(x,y);
Vmean=Vmean+var1(x,y);
Gmean1=Gmean/(H*L);
%所有块的平均值
Vmean1=Vmean/(H*L);
%所有块的方差
gtemp=0;
gtotle=0;
vtotle=0;
vtemp=0;
ifGmean1>
aveg1(x,y)
gtemp=gtemp+1;
gtotle=gtotle+aveg1(x,y);
ifVmean1<
var1(x,y)
vtemp=vtemp+1;
vtotle=vtotle+var1(x,y);
end
G1=gtotle/gtemp;
V1=vtotle/vtemp;
gtemp1=0;
gtotle1=0;
vtotle1=0;
vtemp1=0;
ifG1<
gtemp1=gtemp1-1;
gtotle1=gtotle1+aveg1(x,y);
if0<
var1(x,y)<
V1
vtemp1=vtemp1+1;
vtotle1=vtotle1+var1(x,y);
G2=gtotle1/gtemp1;
V2=vtotle1/vtemp1;
e=zeros(H,L);
ifaveg1(x,y)>
G2&
&
var1(x,y)<
V2
e(x,y)=1;
ifaveg1(x,y)<
G1-100&
V2
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
Icc=ones(m,n);
M
I(i+(x-1)*M,j+(y-1)*M)=G1;
Icc(i+(x-1)*M,j+(y-1)*M)=0;
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.
确定完方向后就根据该向场对图像进行二值化。
%二值化¯
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);
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;
sumf=summax;
ifsumf>
b
Im(x,y)=128;
Im(x,y)=255;
fori=1:
forj=1:
Icc(i,j)=Icc(i,j)*Im(i,j);
if(Icc(i,j)==128)
Icc(i,j)=0;
Icc(i,j)=1;
end;
figure,imshow(double(Icc));
二值化'
得到的二值化图像如图6:
图6二值化后的图像
2.4图像增强
在当前的指纹采集条件下,不可避免的会受到环境,皮肤上的油脂、水分、污渍的影响,使采集到的指纹图像出现纹线粘连、纹线断裂等缺陷,对后续的指纹特征提取带来很大困难。
所以我们必须对指纹图像进行图像增强处理,例如分离粘连的纹线,连接断裂的纹线,平滑纹线的边缘等,以保证指纹特征提取的可靠性。
实验中进行了初步去除空洞和毛刺的处理,程序如下:
u=Icc;
[m,n]=size(u)%去除空洞和毛刺
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;
elseu(x,y)=u(x,y);
figure,imshow(u)
%title('
去除毛刺'
)
forb=2:
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;
去除空洞'
得到的去除毛刺后的图像和再去除空洞后的图像分别如图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)
细化图'
得到的图像如图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);
然后定义函数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:
if(thin(y,x))
CN=0;
fori=1:
8
CN=CN+abs(P(thin,y,x,i)-P(thin,y,x,i+1));
if(CN==2)
txy(count,:
)=[x,y,2];
count=count+1;
if(CN==6)
)=[x,y,6];
count-1
x(i)=txy(i,1);
y(i)=txy(i,2);
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);
error=0;
error=walk(thin,pxy(i,1),pxy(i,2),5);
iferror==1
thin(pxy(i,2),pxy(i,1))=0;
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);
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:
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];
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;
if(i~=j)
d(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);
d(i,j)=2*r;
[a,b]=min(d);
c=find(a>
r);
pxy2=txy(c,:
pxy2=pxy2(find(pxy2(:
t=size(pxy2,1);
ift==0
error=1
else
plot(x,y,'
b.'
holdon
plot(pxy2(:
1),pxy2(:
r.'
比如在执行[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)
thin(y0,x0)=0;
t1=0;
forn=1:
num
break;