【MATLAB图像处理实用案例详解(12)】——基于纹理特征的指纹识别方法

news2024/10/6 18:31:32

目录

    • 一、指纹图像预处理
      • 1.1 图像对比度增强
      • 1.2 图像二值化
      • 1.3 图像滤波
    • 二、指纹图像特征提取

指纹识别系统主要涉及4个步骤:指纹图像采集、图像预处理、特征提取、特征匹配。一开始,通过指纹读取设备取得图像,并对原始图像进行初步处理,使之更清晰。接下来,指纹识别软件提取指纹的数字表示——特征点数据。这些数据通常称为模板,保存为数据库中的一条记录并录入相应的人员信息。随后,对新录入指纹进行特征点数据的提取,并通过计算机模糊比较的方法把它与指纹数据库中的模板进行比较,计算出它们的相似程度,最终得到匹配结果并显示人员信息。

一、指纹图像预处理

1.1 图像对比度增强

采集到的指纹存在噪声干扰等问题,因此在指纹识别及指纹信息录入时必须进行必要的图像预处理。在图像去噪中,中值滤波器是一种常见的非线性平滑滤波器,中值滤波器的输出像素是由邻域像素的中间值决定的。中值滤波器产生的模数较少,适合于消除图像的孤立噪声点,直接调用MATLAB工具箱中的medfilt2()函数。在图像增强方面,进行直接灰度调整以增强指纹图像的对比度,调用MATLAB 工具箱中的imadjust()函数。程序如下:

A=imread('a.bmp');
A=rgb2gray(A);
j=medfilt2(A);
figure,imshow(j);
B=imadjust(A,[0.2 0.8]);
figure;
subplot(2,2,1);imshow(A);
subplot(2,2,2);imhist(A);
subplot(2,2,3);imshow(B);
subplot(2,2,4);imhist(B); 

运行结果如下:
在这里插入图片描述

1.2 图像二值化

图像二值化:采用迭代法求最佳阈值的分割算法,具体步骤如下:
①求出图像中的最大和最小灰度值 S 1 S_1 S1 S h S_h Sh,令初始阈值为:
T 0 = S 1 + S h 2 T_0=\frac{S_1+S_h}{2} T0=2S1+Sh
②根据阈值 T k T_k Tk将灰度图像分成目标和背景两部分(第一次分割时 T k = T 0 T_k=T_0 Tk=T0),然后求出目标和背景两部分的平均灰度值 S 1 S1 S1 S 2 S2 S2
S 1 = ∑ S ( i , j ) p T k S ( i , j ) × N ( i , j ) ∑ Z ( i , j ) p T k N ( i , j ) , S 2 = ∑ S ( i , j ) f T k S ( i , j ) × N ( i , j ) ∑ Z ( i , j ) f T k N ( i , j ) {S_1} = \frac{{\sum\limits_{S(i,j)p{T_k}} {S(i,j) \times N(i,j)} }}{{\sum\limits_{Z(i,j)p{T_k}} {N(i,j)} }},{S_2} = \frac{{\sum\limits_{S(i,j)f{T_k}} {S(i,j) \times N(i,j)} }}{{\sum\limits_{Z(i,j)f{T_k}} {N(i,j)} }} S1=Z(i,j)pTkN(i,j)S(i,j)pTkS(i,j)×N(i,j),S2=Z(i,j)fTkN(i,j)S(i,j)fTkS(i,j)×N(i,j)
式中, S ( i , j ) S(i,j) S(i,j)是图像上(i,j)点的灰度值, N ( i , j ) N(i,j) N(i,j)是(i,j)点的权重系数,一般 N ( i , j ) = 1 , 0 N(i,j)=1,0 N(i,j)=1,0
③求出新的阈值:
T k + 1 = S 1 + S 2 2 T_{k+1}=\frac{S_1+S_2}{2} Tk+1=2S1+S2
具体程序如下:

[x,y]=size(B);
m=double(B);
N=sqrt(100)*randn(x,y);
I=m+N;
for i=1:x
    for j=1:y
        if (I(i,j)>255)
            I(i,j)=255;
        end
        if (I(i,j)<0)
            I(i,j)=0;
        end
    end
end
z0=max(max(I));
z1=min(min(I));
T=(z0+z1)/2;
TT=0;
s0=0;n0=0;
s1=0;n1=0;
allow=0.5;
d=abs(T-TT);
count=0;
while(d>=allow)
    count=count+1;
    for i=1:x 
        for j=1:y
            if(I(i,j)>=T)
                s0=s0+I(i,j);
                n0=n0+1;
            end
            if(I(i,j)<T)
                s1=s1+I(i,j);
                n1=n1+1;
            end
        end
    end
    T0=s0/n0;
    T1=s1/n1;
    TT=(T0-T1)/2;
    d=abs(T-TT);
    T=TT;
end
seg=zeros(x,y);
for i=1:x
    for j=1:y
        if(I(i,j)>=T)
            seg(i,j)=1;
        end
    end
end
figure;
imshow(seg);

运行结果如下:
在这里插入图片描述

1.3 图像滤波

得到二值化图像后,需要对其进行进一步滤波增强,程序如下:

BW1=bwmorph(seg,'spur');
BW2=bwmorph(BW1,'fill');
BW3=bwmorph(BW2,'clean');
figure;
imshow(BW3);

滤波结果如图所示:
在这里插入图片描述

二、指纹图像特征提取

纹理特征提取指的是通过一定的图像处理技术抽取出图像的纹理特征,从而获得纹理的定性或定量描述的处理过程。因此,纹理特征提取包括两方面的内容:检测出纹理基元和获得有关纹理基元排列分布方式的信息。纹理分析方法大致分为统计方法和结构方法。统计方法适用于分析像木纹、森林、山脉、草地那样的纹理细而且不规则的物体,结构方法则适用于像布料的印刷图案或砖花样等一类纹理基元排列较规则的图像。针对指纹图像,这里选择灰度共生矩阵法提取指纹纹理特征。
从灰度共生矩阵提取出的纹理特征参数有角二阶矩、对比度、相关和熵,这四个统计参数为应用灰度共生矩阵进行纹理分析的主要参数,可以组合起来成为纹理分析的特征参数使用。利用graycomatrix和graycoprops函数实现。

glcms = graycomatrix(I,Name,Value)
从图像 I 创建灰度共生矩阵 (GLCM)。灰度共生矩阵又名灰度空间相关性矩阵。
根据可选名称-值对Name,Value组参数的值,返回一个或多个灰度共生矩阵。
graycomatrix 通过计算灰度级(灰度强度)值为 I 的像素与灰度级值为 j 的像素水平相邻的频率来创建 GLCM。(您可以使用 ‘Offsets’ 参数指定其他像素空间关系。)glcm 中的每个元素 (i,j) 指定值为 i 的像素与值为 j 的像素水平相邻的次数。

stats = graycoprops(glcm,properties)
根据灰度共生矩阵glcm计算properties中指定的统计信息。

运行结果:
在这里插入图片描述
同样,以此方法求出员工的指纹图像的纹理特征,与数据库内指纹的这一特征进行比较,并以最小距离分类器的原理进行比较判断即可得出准确的员工信息并标注显示。


未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 2 MapReduce and the New Software Stack Computing cluster means large collections of commodity hardware, including conventional processors (“compute nodes”) connected by Ethernet …

学习HCIP的day.03

目录 OSPF&#xff1a;开放式最短路径优先协议 OSPF的数据包 -- 5种 OSPF的状态机 OSPF的工作过程 OSPF的基础配置 关于OSPF协议从邻居建立成为邻接的条件 OSPF的接口网络类型 OSPF&#xff1a;开放式最短路径优先协议 无类别链路状态型IGP协议&#xff1b;由于其基于拓…

golang Gin实现websocket

golang使用 Gin实现 websocket&#xff0c;这里笔者重新搭建一个项目 1、创建项目安装依赖 项目名为 go-gin-websocket 在指定文件夹下&#xff0c;新建项目文件夹 go-gin-websocket 进入项目文件夹&#xff0c;打开cmd窗口&#xff0c;在项目&#xff08;go-gin-websocket&a…

【Git 入门教程】第九节、Git的最佳实践

Git是一个强大的版本控制系统&#xff0c;可以帮助开发者管理和协调代码库。然而&#xff0c;正确使用Git并不总是容易。本文将介绍一些Git的最佳实践&#xff0c;以帮助开发者更好地利用Git来管理和协调代码库。 一、编写有意义的提交信息 在使用Git时&#xff0c;编写有意义…

Python编程IDE的选择

Python环境安装之后&#xff0c;接下来就是选择编写Python程序的编辑器了&#xff0c;这里就给大家推荐几种Python编辑器&#xff0c;我们简称这些编辑器为IDE。好的编程IDE可以提高编写代码效率&#xff0c;那咱话不多说&#xff0c;直接开始推荐&#xff01; IDLE 首先&…

有人USR-M100边缘主动上报电流数据到TCP服务器

前两天跟强哥配置了有人的USR-M100模块&#xff0c;实现了采集的电流信号主动上报服务器的功能&#xff0c;昨天去第一污水厂配置了1台、第二污水厂配置了5台、第三污水厂配置了1台&#xff0c;能够将数据上报到甲方的云平台&#xff0c;这里记录一下配置过程&#xff0c;方便以…

推荐4款免费好用的chatGPT平台

1 ShellGPT 这是一款出色的客户端&#xff0c;无需APIkey和科学上网即可访问chatGPT3.5以及绘画AI。项目的github地址如下&#xff1a;https://github.com/akl7777777/free-chatgpt-client-pub/&#xff0c;可在主页下载windows、linux和macOS的安装包&#xff0c;安装后即可使…

力扣刷题2023-04-30-1——题目:剑指 Offer II 007. 数组中和为 0 的三个数

题目&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

React之动态路由创建以及解决刷新白屏问题

动态路由的创建和动态菜单的创建几乎类似&#xff0c;只不过的是&#xff0c;动态路由需要导入组件。这样才能完成跳转。 动态路由与动态菜单一样都需要封装一个转化函数&#xff0c;将后端传来的数据进行转换&#xff0c;转换成我们需要的格式。 需要导入的依赖 导入路由use…

kali: kali工具-Ettercap

kali工具-Ettercap ettercap工具&#xff1a; 用来进行arp欺骗&#xff0c;可以进行ARP poisoning&#xff08;arp投毒&#xff09;&#xff0c;除此之外还可以其他功能&#xff1a; ettercap工具的arp投毒可以截取web服务器、FTP服务器账号密码等信息&#xff0c;简略后打印出…

C++篇--类大小计算、this指针

文章目录 一、类大小计算二、this指针 一、类大小计算 类的大小是只计算它的成员变量或者自定义成员&#xff0c;不会计算它的成员函数大小。 #include<iostream> using namespace std;class A1 { public:void fun(){_a 1;_b 2;}int _a;int _b; };int main() {cout <…

干货 | 赵亚雄:大模型、AI经济和AI基础设施

大家好&#xff0c;我是算想未来的创始人CEO赵亚雄。今天非常高兴到母校来做简短的分享。我们最近会几乎是被ChatGPT、OpenAI等等话题各类的信息轮番轰炸。我希望借助这个机会&#xff0c;把自己这一段时间来思考的有关AI基础设施还有AGI再到大模型等内容&#xff0c;从相对抽象…

ElasticSearch创建文档以及索引文档的详细流程

当我们发起一个查询请求之后&#xff0c;ES是怎么处理这个请求然后返回数据的呢&#xff1f;今天就来详细说一下。 首先看一下整体结构&#xff1a; 在集群模式下一个索引有多个分片&#xff0c;在上图中有三个节点(一个主节点两个从节点)&#xff0c;一个索引被分为两个分片(…

基于协同过滤的旅游推荐系统设计与实现(论文+源码)_kaic

1 绪论 1.1 研究背景及意义 1.2 国内外研究现状 1.3 研究目标与意义 1.4 主要研究工作 2 相关理论介绍 2.1HTML与JavaScript 2.2 MySQL数据库 2.3 协同过滤算法简介 3 系统分析与设计 3.1 系统需求分析 3.1.1 功能性需求 3.1.2 安全性需求 3.2 系统总体架构 3.3 功能模块设计 3…

vue3的props和defineProps

文章目录 1. Props 声明1.1 props用字符串数组来声明Blog.vueBlogPost.vue 1.2 props使用对象来声明Blog.vueBlogPost.vue 2. 传递 prop 的细节2.1 Prop 名字格式2.1 静态Prop & 动态 Prop静态prop动态prop示例Blog.vueBlogPost.vue 2.3 传递不同的值类型NumberBooleanArra…

【Java笔试强训 11】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;最近公共…

算法记录 | Day46 动态规划

139.单词拆分 思路&#xff1a; 1.确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词。 2.确定递推公式 如果 s[0: j] 可以拆分为单词&#xff08;即 dp[j] True&#xff09;&#xff…

Linux RHCE解题方法

目录 安装和配置Ansible 创建和运行Ansible临时命令 安装软件包 使用RHEL系统角色 使用 Ansible Galaxy 安装角色 创建和使用角色 从 Ansible Galaxy 使用角色 创建和使用逻辑卷 生成主机文件 修改文件内容 创建 Web 内容目录 生成硬件报告 创建密码库 创建用户帐…

C++中stringstream类详解

本文主要介绍 C 编程语言中 stringstream 类的相关知识&#xff0c;同时通过示例代码介绍 stringstream 类的使用方法。 1 概述 <sstream> 定义了三个类&#xff1a;istringstream、ostringstream 和 stringstream&#xff0c;分别用来进行流的输入、输出和输入输出操作…

快速傅里叶变换FFT学习笔记

点值表示法 我们正常表示一个多项式的方式&#xff0c;形如 A ( x ) a 0 a 1 x a 2 x 2 . . . a n x n A(x)a_0a_1xa_2x^2...a_nx^n A(x)a0​a1​xa2​x2...an​xn&#xff0c;这是正常人容易看懂的&#xff0c;但是&#xff0c;我们还有一种表示法。 我们知道&#xf…