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

【图像识别-指纹识别】指纹特征提取附matlab代码

1 内容介绍

一 指纹增强

采用Lin Hong等人提出的基于Gabor滤波的方法进行指纹增强,可分为以下步骤:

标准化:标准化是把图像的平均灰度和方差调整到预定的级别上,以减少脊线上的灰度差异,方便后续处理。

方向估计:将图像分成的不相交块,对每一块求块内脊线的主方向。如对tr2.BMP求方向图:

图1 左侧为原图 右侧围方向图

用MATLAB函数blkproc对图像分块时还将求出图像的掩模,后期求特征点时可用于除去边界的端点。

图2 图像掩模

频率估算:利用标准化的图像和方向图求每个分块脊线的频率。

分割:将图像分为可恢复区域和不可恢复区域。

滤波:利用由脊线主方向和脊线区域组成的关联信息,用Gabor滤波器来增强脊线结构。

滤波并二值化后的指纹图像见图3。

图3 增强后的指纹图像

二 细化

细化的基本原则是模版法,只有符合图4的模版时才将中心点去除。

图4 细化模版

为了达到更好的效果,采用了MATLAB函数bwmorph,细化后的指纹图像见图5

图5 细化后的指纹图像

三 抽取特征点

为了加快速度,在细化后的图像中,对每个像素点求八领域的像素和n,如果n=7,说明该像素点是端点,如果n=5,说明该像素点是分叉点。

为了除去指纹边缘的端点(伪特征点),需要用到图2的掩模,对该掩模做腐蚀处理,见图6

图6 腐蚀后的掩模

如果得到的端点位于黑色区域就认为是伪端点。

为了除去指纹内部的伪特征点,求两个特征点之间的距离,如果距离小于一个阈值(例如10),则将两个伪特征点都删除。最后抽取出的特征点见图7,其中红色叉号表示分叉点,蓝色空心圆表示端点。

图7 抽取出的特征点

2 部分代码

% RIDGESEGMENT - Normalises fingerprint image and segments ridge region

function [normim, mask, maskind] = ridgesegment(im, blksze, thresh)

    

    im = normalise(im,0,1);  % normalise to have zero mean, unit std dev

    

    fun = inline('std(x(:))*ones(size(x))');

    

    stddevim = blkproc(im, [blksze blksze], fun);

    

    mask = stddevim > thresh;

    maskind = find(mask);

    

    % Renormalise image so that the *ridge regions* have zero mean, unit

    % standard deviation.

    im = im - mean(im(maskind));

    normim = im/std(im(maskind));    

3 运行结果

4 参考文献

[1]李金铎. 基于图像处理的指纹识别算法研究[D]. 哈尔滨工程大学, 2016.​

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机、雷达通信、无线传感器等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

相关文章:

  • 3道Java基础题
  • Docker 安装 MySQL、Redis、Nginx
  • 疫情宅在家,研究一下fastjson中字段智能匹配的原理
  • 【MapGIS精品教程】001:MapGIS K9完整图文安装教程
  • 指针和数组笔试题解析
  • 人脸检测5种方法
  • SparkSQL 总结(未完待续)
  • 51单片机入门——数模\模数转换
  • 【毕业设计】 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32
  • 花边新闻获取易语言代码
  • HTML5入门(1)——HTML基础
  • 计算机网络体概念
  • redis底层都有哪些数据结构?带你了解redis是如何存储数据的
  • 通道分离与合并、彩色图转换为灰度图、二值化
  • C语言经典算法实例4:判断回文数
  • [LeetCode] Wiggle Sort
  • [译]前端离线指南(上)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • ES10 特性的完整指南
  • express如何解决request entity too large问题
  • extjs4学习之配置
  • extract-text-webpack-plugin用法
  • Java基本数据类型之Number
  • jQuery(一)
  • PAT A1017 优先队列
  • React的组件模式
  • uni-app项目数字滚动
  • Vim Clutch | 面向脚踏板编程……
  • Vue 2.3、2.4 知识点小结
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从PHP迁移至Golang - 基础篇
  • 面试遇到的一些题
  • 前端之React实战:创建跨平台的项目架构
  • 日剧·日综资源集合(建议收藏)
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 译自由幺半群
  • 赢得Docker挑战最佳实践
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 正则表达式-基础知识Review
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (04)odoo视图操作
  • (52)只出现一次的数字III
  • (70min)字节暑假实习二面(已挂)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (三)终结任务
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 设计模式初探
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net连接MySQL的方法
  • @Conditional注解详解
  • []C/C++读取串口接收到的数据程序