%%%%%%%%%%%%%%%%%%%%%%%%%%%% %指紋圖像細節(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 %特征點提�。ǘ它c或交叉點) 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
|