%%%%%%%%%%%%%%%%%%%%%%%%%%%% %指纹图像细节特征提取 %%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; origin=imread('D:\Program Files\MATLAB\指纹库\3.jpg'); imagesc(origin); %对origin进行染色,将矩阵中的元素数值按大小转化为不同颜色并在坐标轴对应位置处以这种颜色染色 colormap(gray); %输出一个灰色系的曲面图 %xlabel('(a)原始图像') I=im2bw(origin); % 二值化 %细化指纹图像,用匹配模板法 [M,N]=size(I); %表示矩阵的大小(行*列) for i=2:M-1 % 行采样 for j=2:N-1 % 列采样 if I(i,j)==0 % 黑色背景 if(I(i-1,j)==0&I(i,j+1)==0)|(I(i-1,j)==0&I(i,j-1)==0)|(I(i+1,j)==0&I(i,j-1)==0)|(I(i+1,j)==0&I(i,j+1)==0) I(i,j)=1; % 1为白色二值化块 else I(i,j)=0; % 背景点 end end end end %特征点提取(端点或交叉点) t=0; for i=2:M-1 for j=2:N-1 if I(i,j)==0 n=I(i-1,j-1)+I(i-1,j)+I(i-1,j+1)+I(i,j-1)+I(i,j+1)+I(i+1,j-1)+I(i+1,j)+I(i+1,j+1);%八个邻域的值叠加和 if (n==7|n==5) %记录有5个或7个点的邻域,中心点 t=t+1; %旗标加一 x(t)=j; %下标保存 y(t)=i; %下标保存 end end end end subplot(121); imagesc(I); xlabel('(c)细化后的指纹图像') holdon; plot(x,y,'b.'); holdoff; for i=1:t-1 for j=i+1:t %指纹特征去伪 d=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2); if d<6 %去除距离较近的特征点 x(i)=-1;y(i)=-1;x(j)=-1;y(j)=-1; end end end c=0; d=0; for i=1:t if(x(i)>=10&x(i)<165)&(y(i)>=10&y(i)<140) %去除边缘的特征点 c=c+1;l(c)=x(i);d=d+1;h(d)=y(i); end end x=find(x); y=find(y); subplot(122); imagesc(I); xlabel('(d)细去伪后的指纹图像特征点') holdon; plot(l,h,'b*'); holdoff; %指纹特征点(细节点)提取 clc clearall closeall %%读取图像 yuantu_image=imread('D:\Program Files\MATLAB\指纹库\3.jpg'); figure; imshow(yuantu_image); title('原图像'); binary_image=im2bw(imread('D:\Program Files\MATLAB\指纹库\3.jpg')); %读取图像,并二值化 figure; imshow(binary_image); title('二值化图像'); %%截取感兴趣区 binary_image= binary_image(10:512,70:370); %截取其中一部分 figure; imshow(binary_image); title('感兴趣区域'); %%细化处理 xihua_image=~bwmorph(binary_image,'thin',Inf); %对二值图像进行细化 figure; imshow(xihua_image); title('细化后图像'); %%提取细节点 s=size(xihua_image); %取细化后图像的尺寸 N=3; %windowsize 3*3的矩阵 n=(N-1)/2; r=s(1)+2*n; c=s(2)+2*n; temp=zeros(r,c);bifurcation=zeros(r,c);ridge=zeros(r,c); % ‘0’ 表示全黑色 temp((n+1):(end-n),(n+1):(end-n))=xihua_image; outImg=zeros(r,c,3); %三个r*c的零矩阵 For Display outImg(:,:,1)= temp .* 255; % ‘255’ 表示全白色 outImg(:,:,2)= temp .* 255; outImg(:,:,3)= temp .* 255; for x=(n+1+10):(s(1)+n-10) for y=(n+1+10):(s(2)+n-10) e=1; for k=x-n:x+n f=1; for l=y-n:y+n mat(e,f)=temp(k,l); f=f+1; end e=e+1; end; if(mat(2,2)==0) ridge(x,y)=sum(sum(~mat)); bifurcation(x,y)=sum(sum(~mat)); end end; end; holdon %%纹数 [ridge_x,ridge_y]=find(ridge==2); plot(ridge_y,ridge_x,'r*') %%分叉点 [bifurcation_x,bifurcation_y]=find(bifurcation==4); plot(bifurcation_y,bifurcation_x,'b.','markersize',8) saveridge.mat ridge_x ridge_y savebifurcation.mat bifurcation_x bifurcation_y
|