指纹识别研究
figure,imshow(w) title('细化图')
得到的图像如图9:
图9细化后的图像
3.特征点提取
3.1 找出所有的端点和交叉点
因为特征点必然是从端点和交叉点里找出,所以在得到细化的图像后,我们首先要找出所有的端点和交叉点。
首先对通过定义函数P.m对图像中每个点的8邻域位置进行坐标定义,方便后续编程。 P.m程序如下:
%-----Sub functions------- function j = P (img, x, y, i) % get pixel value based on chart: % 4 | 3 | 2 % 5 | | 1 % 6 | 7 | 8 switch (i) case {1, 9}
j = img(x+1, y); case 2
j = img(x + 1, y-1); case 3
j = img(x, y - 1); case 4
11
指纹识别研究
j = img(x - 1, y - 1); case 5
j = img(x - 1, y); case 6
j = img(x - 1, y + 1); case 7
j = img(x, y + 1); case 8
j = img(x + 1, y + 1); end
然后定义函数point.m来找出细化后图像的所有端点。 将一个点的8个邻域依次两两相减并取绝对值,并将所有结果相加,从细化图像的特征来说,和为2时为端点,和为6时为交叉点。
程序如下:
function txy=point(thin) count = 1;
txy(count, :) = [0,0,0];
siz=min(size(thin,1),size(thin,2)); for x=40:siz - 40 for y=40:siz - 40 if (thin(y, x) ) CN = 0; for i = 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
for i=1:count - 1 x(i) =txy(i, 1); y(i)= txy(i, 2); end
imshow(double(thin)); hold on;
12
指纹识别研究
plot(x,y,'.');
运行完程序后,将所有的端点和交叉点全部找出。定义的数组txy第一项为横坐标,第二项为纵坐标,第三项为2或6(2为端点、6为交叉点)。
得到的标出端点和交叉点的图像如图10:
图10标出端点和交叉点的细化图像
3.2 纹线光滑处理 在指纹图像预处理中,已经对指纹图像进行过去除毛刺和空洞的处理。这里通过定义函数guanghua.m进一步对细化后的图像进行光滑处理。基本原理为:找到每个端点,使其沿着纹线的方向移动5个像素,如果在5个像素之内遇到交叉点,则认为此端点为毛刺,去除此点。
guanghua.m程序如下:
function w=guanghua(thin,txy) for j=1:5
txy=point(thin);
pxy=txy(find(txy(:,3)==2),:); n=size(pxy,1); for i=1:n error=0;
error=walk(thin,pxy(i,1),pxy(i,2),5); if error==1
thin(pxy(i,2),pxy(i,1))=0; end end end w=thin; imshow(w);
13
指纹识别研究
光滑后的图像如图11所示:
图11 光滑后的图像
光滑完后需再次执行point函数来画出新的端点,如下图所示:
图12 光滑后标出端点和特征点的图像
3.3 去除图像边缘的端点
可以看出,在指纹图像的边缘,由于采集仪器的关系,不可避免的多出很多端点,一方面增加了后续工作量,另一方面还可能产生错误,所以有必要将这些边缘的端点去除。本实验中设计了cut函数来进行处理。
函数如下:
function txy=cut(thin,txy) s(8,8)=0;
14
指纹识别研究
delta(8,8)=0; n=size(txy,1); for i=1:8 for j=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})); if delta(i,j)<=70 for k=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.1 single_point函数 经过光滑处理和去除边缘端点后进一步减少了端点和交叉点的个数。下面就要找出一些独特的端点来作为特征点。在一幅细化的指纹图上,如果一个端点的周围半径为r个像素的
15
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Matlab指纹识别(3)在线全文阅读。
相关推荐: