標題: matlab指紋細節(jié)提取代碼 [打印本頁]
作者: 南青秀寧 時間: 2019-5-7 17:03
標題: matlab指紋細節(jié)提取代碼
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%指紋圖像細節(jié)特征提取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
origin=imread('D:\Program Files\MATLAB\指紋庫\3.jpg');
imagesc(origin); %對origin進行染色,將矩陣中的元素數(shù)值按大小轉(zhuǎn)化為不同顏色并在坐標軸對應位置處以這種顏色染色
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;
%指紋特征點(細節(jié)點)提取
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('二值化圖像');
%%截取感興趣區(qū)
binary_image= binary_image(10:512,70:370); %截取其中一部分
figure;
imshow(binary_image);
title('感興趣區(qū)域');
%%細化處理
xihua_image=~bwmorph(binary_image,'thin',Inf); %對二值圖像進行細化
figure;
imshow(xihua_image);
title('細化后圖像');
%%提取細節(jié)點
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
%%紋數(shù)
[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.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |