标题: matlab指纹细节提取代码 [打印本页]
作者: 南青秀宁 时间: 2019-5-7 17:03
标题: matlab指纹细节提取代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%指纹图像细节特征提取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |