標題: 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