找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2206|回复: 0
打印 上一主题 下一主题
收起左侧

matlab指纹细节提取代码

[复制链接]
跳转到指定楼层
楼主
ID:529774 发表于 2019-5-7 17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%指纹图像细节特征提取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表