当前位置: 首页 > news >正文

基于MATLAB的指纹识别算法仿真实现

目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

       在指纹图像预处理部分,论文对预处理的各个步骤包括规格化、图像分割、中值滤波、二值化、细化等以及各个步骤的方法进行了深入的分析和研究,选择了一种图像预处理方案。在指纹特征提取部分,采用基于Matlab实现的指纹细节特征提取方法,并给出了去伪算法。指纹特征提取是从细化后的指纹图中得到细节特征点(即端点和分叉点),此特征点含有大量的伪特征,既耗时又影响匹配精度。采用了边缘去伪和距离去伪,使得特征点去伪前后减小了近1/3,然后提取可靠特征点信息,以便实现指纹匹配。

      指纹识别技术是指使用取像设备读取指纹图像,通过识别软件提取出指纹图像中的特征数据,然后根据匹配算法得到的结果鉴别指纹所有人身份的生物特征识别技术。

       指纹识别系统主要涉及三大步骤:指纹图像预处理、特征提取、特征匹配三个部分,其中预处理部分又可分为归一化、图像滤波增强、二值化和细化等几个步骤。系统流程框图如图1-1所示。下面对这三个个部分做一下简单的介绍。

        指纹图像处理中物体的形状信息是十分重要的,为了提取指纹图像特定区域的特征,对指纹图像通常需要采用细化算法处理,得到与原来指纹图像形状近似的由简单的弧或曲线组成的图形,这些细线处于物体的中轴附近,这就是所谓的指纹图像的细化。

      细化方法不同,细化结果就有差异。在指纹识别中要求在不改变原来指纹图像的拓朴连通性的同时,细化的结果应为严格的八邻域图像骨架;纹线中除去特征点以外,每个像素均只与相邻两个像素为八邻域,抹去任意一像素都将破坏纹线的连接性。概括起来说就是纹线细化处理要满足收敛性、连接性、拓朴性、保持性、细化性、中轴性、快速性的要求。目前为止,关于细化方法的研究工作已有很多成果,所采用的方法从使用的观点来看,比较多的是采用模板匹配的方法(如迭代法、OPTA单连通法等)。这种方法是根据某个像素的局部邻域(如3×3,5×5等)的图像特征对其进行处理,此外也有采用边缘搜索编码、外轮廓计算以及神经网络等细化方法。从处理的过程来看,主要可以分为串行和并行两类,前者对图像中当前像素处理依据其邻域内像素的即时化结果,且不同的细化阶段采用不同的处理方法;后者对当前的像素处理该像素及其邻域内各像素的前一轮 

迭代处理的结果,自始至终采用相同的细化准则。

       对于任意形状的区域,细化实质上是腐蚀操作的变体,细化过程中要根据每个像素点的八个相邻点的情况来判断该点是否可以剔除或保留。

        细节特征提取的方法分为两种:一种是从灰度图像中提取特征,另一种是从细化二值图像中提取特征。直接从灰度图像中提取特征的算法一般是对灰度指纹纹线进行跟踪,根据跟踪结果寻找特征的位置和判断特征的类型。这种方法省去了复杂的指纹图像预处理过程,但是特征提取的算法却十分复杂,而且由于噪声等因素影响,特征信息(位置、方向等)也不够准确。目前大多数系统采用第二种方法,从细化二值图像中提取特征,该方法比较简单,在得到可靠的细化二值图像后,只需要一个3×3的模板就可以将端点和分叉点提取出来。

        特征点提取的好坏将直接影响匹配的结果。现实中,指纹输入时,由于汗渍、干燥、按压力度不同等影响,得到的指纹图像大都含有断纹、褶皱、模糊、灰度不均匀等质量问题,虽然经过预处理,图像质量会有所改观,但预处理算法对各个指纹的适应性和有效性也会不同,并且会引入新的噪声,因此得到的细化二值图像往往含有大量的伪特征点。伪特征点不仅会影响匹配的速度,严重的会影响整个识别的正确率。所以提取特征点后要进行去伪处理,尽可能滤除伪特征点、保留真特征点。实践中发现,伪特征点的数量一般占总特征数量的一半以上,所以去伪是必不可少的过程。去伪过程可以在两个阶段进行:一是在特征提取之前对细化二值图像进行平滑、去除毛刺、连接断纹等操作,然后提取特征作为真特征;另一种是在特征提取之后,根据特征之间的相互关系,尽可能准确的识别伪特征点并滤除它们。前者直接对图像进行修补,操作比较复杂,容易引入新的伪特征;后者对特征提取后的数据进行判断,识别比较麻烦,但是速度较快本文采用第二种方法,即从已提取的特征点中滤除伪特征,保留真特征。

二、核心程序

clc;
clear all;
close all;
warning off;

%读取图片
%注意,为了和论文中的结果对应起来,我们使用论文中的图片进行代码的测试
I=imread('images.jpg');
if isrgb(I) == 1
   I = rgb2gray(I);
else
   I = I;
end
I_tmp = I;


figure;
subplot(121);
imshow(I);

%图像预处理,去噪滤波
I = medfilt2(I,[3,3]);%进行中值滤波;
subplot(122);
imshow(I);

%背景分割
%图像二值化处理
%首先进行归一化
I=norms(I,120,600);  

figure;
%为了显示处理效果,需要数据类型转换
subplot(121);
imshow(double(I));

Ker   = 8;
[m,n] = size(I);
m1    = m/Ker;
n1    = n/Ker;
for i=1:m1
   for j=1:n1
       %设定门限
      t=mean2(I((i-1)*Ker+1:(i-1)*Ker+Ker,(j-1)*Ker+1:(j-1)*Ker+Ker));
      for k=(i-1)*Ker+1:(i-1)*Ker+Ker
          for l=(j-1)*Ker+1:(j-1)*Ker+Ker
              if I(k,l) < t
                  I(k,l)=1;
              else 
                  I(k,l)=0;
              end
          end
      end
   end
end


%为了显示处理效果,需要数据类型转换
subplot(122);
imshow(double(I));
 




%异常点的处理
for i=1:m
    for j=1:n
        if I(i,j)>1
            I(i,j)=0;
        end
    end
end
for i=1:m
    for j=1:n
        if I(i,j)==1
            for k=1:j
                I(i,k)=1;
            end
            break;
        end
    end
end
for i=1:m
    for j=n:-1:1
        if I(i,j)==1
            for k=n:-1:j
               I(i,k)=1;
            end
            break;
   end
    end
end
for i=1:m
    for j=1:n
        if I(i,j)==1
            I(i,j)=0;
        else
            I(i,j)=1;
        end
    end
end
figure;
%为了显示处理效果,需要数据类型转换
imshow(double(I));

%对细化前的图像进行维纳滤波
figure;
subplot(121);
imshow(double(I));

I=wiener2(I,[3 3]);

subplot(122);
imshow(double(I));

%以下为细化处理
[r,c] = size(I);
for i1=1:r;
    for j1=1:c
        if (I(i1,j1)==1)
           I(i1,j1)= 255; 
           I2      = I;
        end
    end
end
 

y = thinning(I2);
figure;
imshow(y);


%以上的代码是你之前的第三章的代码的仿真图
%以下的代码是对应第四章的仿真图
%首先需要提取指纹图像的中心点——对应论文的“图4-1提取中心点后的细化图像”
[XC,YC] = find_central_point(y);

%找寻细化图像的特征点
%特征点的建立——对应论文的“图4-2特征点提取后的图像”
[dpx3,dpy3,dpcount3,fpx3,fpy3,fpcount3]=characterpoint(y);
figure;
imshow(y);
hold on;
plot(dpy3,dpx3,'o');
hold on;
plot(fpy3,fpx3,'+');
hold on;
plot(XC,YC,'*r'); 
hold off;





%以下代码是对最后的识别结果和数据库中的进行匹配
%计算每个特征点到中心点的距离,
Dpcount=size(dpx3,2);
Fpcount=size(fpx3,2);
for i=1:Dpcount
    DP_Feature(i)=sqrt((dpx3(i)-YC)^2+(dpy3(i)-XC)^2);
end
for j=1:Fpcount
    FP_Feature(j)=sqrt((fpx3(j)-YC)^2+(fpy3(j)-XC)^2);
end   

%计算指纹图像的方向角
theta = func_theta(I_tmp);

%建立待识别的特征库
for i=1:Dpcount
    PointOfModel(i,1)=1;
    PointOfModel(i,2)=DP_Feature(i);
    PointOfModel(i,3)=theta(dpx3(i),dpy3(i))-theta(YC,XC);
end
for i=Dpcount+1:Dpcount+Fpcount
    PointOfModel(i,1)=2;
    PointOfModel(i,2)=FP_Feature(i-Dpcount);
    PointOfModel(i,3)=theta(fpx3(i-Dpcount),fpy3(i-Dpcount))-theta(YC,XC);
end    


%调用database_feature计算得到PointOfMatch
I=imread('database/22.tif');

if isrgb(I) == 1
   I = rgb2gray(I);
else
   I = I;
end
PointOfMatch = database_feature(I);

%调用MATCH函数进行匹配
%图4-3 匹配后的图像
NUM = 90;%这个参数是新加的,设置相似度,即多少个匹配点对上才算成功
Count=match(y,PointOfModel,PointOfMatch,dpx3,dpy3,fpx3,fpy3,NUM);



三、测试结果

边缘保护

 进行适应性去噪过滤处理

 细化处理得到的结果

 二值化图像细化处理,并标注特征点和中心点。特征端点用'o'标注,特征分叉点用'+'标注,中心点用红色'*'标注

 指纹匹配

 

A10-11

相关文章:

  • Spring Boot中异步消息JMS的讲解与通信实例
  • JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
  • 代码随想录38——动态规划:动态规划理论基础、509斐波那契数列、70爬楼梯、746使用最小花费爬楼梯
  • 基于大数据平台的毕业设计01:基于Docker的HDP集群搭建
  • YOLOv5剪枝 | 模型剪枝理论篇 | 1/2
  • 结构体、枚举类型和联合体
  • 【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~
  • 参加微软学生开发者峰会,了解Azure和GitHub……
  • 【数据结构练习题——查找】
  • imx6ull-arm开发板和电脑网线直连通信
  • 【目标检测】YOLOv5遇上知识蒸馏
  • 【每日渗透笔记】覆盖漏洞+修改隐藏数据实战尝试
  • 软件工程结构化设计
  • 异地远程群晖NAS教程【cpolar内网穿透】
  • pytorch-实现猴痘识别
  • 网络传输文件的问题
  • Cookie 在前端中的实践
  • echarts的各种常用效果展示
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • ng6--错误信息小结(持续更新)
  • Puppeteer:浏览器控制器
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 计算机在识别图像时“看到”了什么?
  • 简析gRPC client 连接管理
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊聊sentinel的DegradeSlot
  • 入口文件开始,分析Vue源码实现
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 追踪解析 FutureTask 源码
  • UI设计初学者应该如何入门?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​插件化DPI在商用WIFI中的价值
  • # Panda3d 碰撞检测系统介绍
  • #define,static,const,三种常量的区别
  • (20050108)又读《平凡的世界》
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (分布式缓存)Redis分片集群
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十八)三元表达式和列表解析
  • (一)Docker基本介绍
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • .net core 6 集成和使用 mongodb
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET命令行(CLI)常用命令
  • [Excel VBA]如何使用VBA自动生成图表
  • [FlareOn6]Overlong