指纹特征提取及描述(附Python代码)
共 2662字,需浏览 6分钟
·
2021-04-10 10:16
一、设计思路
项目的编程环境为python3.7.7,编译器使用pycharm2019.3.4 x64。首先为项目设计一个GUI界面,界面有四个按钮,分别是“选择图片”、“图像增强”、“细化”和“特征提取及描述”,使用是按顺序点击按钮即可,每完成一步,都会在按钮下方显示处理结果,最终的特征描述会在右下的文本框中显示。
二、图像增强
图像归一化
由于不同的指纹图像在灰度图分布上有很大的差异,会给之后的图像特征提取和匹配增加难度,因此指纹图像要进行归一化处理,将所有图像转换成具有给定均值和方差的标准图像。归一化并不能改变指纹的脊线和谷线的清晰程度,其结果是减少了不同指纹图像之间灰度值的差异,并为接下来的图像处理做好准备。归一化公式如下:
式中
和 分别为规格化前后的图像, 、 是预先设定的图像平均灰度和均方差, 和 为原图像的灰度均值和方差。方向场估算
方向场反映了指纹图像上纹线的方向,其准确性直接影响图像增强的效果。根据纹线方向在局部区域内基本一致的特点,先把指纹图像分块,然后计算每一个子块的纹线方向,最后用该方向代表对应子块内各个像素的方向。用这种方法来求指纹方向场效率较高且不易受少量的图像噪声影响,具体算法如下:
把归一化图像分成
的像素块,然后利用Sobel算子计算块中每个像素点水平方向上的梯度值 和垂直方向上的梯度值 。计算中心点为
的边长为w的子块的脊线方向角 ,公式如下:
指纹图像的方向场
频率场估算
在指纹图像的局部非奇异区域里,沿着垂直于脊线的方向看,指纹脊线和谷线像素点灰度值大致形成一个二维的正弦波,定义纹线频率为相邻的两个波峰或波谷之间的像素点数的倒数。求取这些互不重叠的局部区域的频率值,按各区域位置组成一个场结构,称为指纹的频率场。设
表示规格化后的图像, 是指纹方向场,算法如下:在所得方向场的基础上,沿其垂直方向投影每一块所有像素的灰度值,该投影形成一维正弦波,其极值点对应指纹的脊线和谷线。假定
作为上述一维正弦波两相邻峰值之间的平均像素数,则频率 。gabor滤波
一旦指纹图像的方向场和频率场确定,这些参数可以用来构造偶对称Gabor滤波器。Gabor滤波器是具有方向选择特性和频率选择特性的带通滤波器,并且能够达到时域和频域的最佳结合。偶对称的Gabor滤波器在空间域中具有下面的形式:
式中,
是滤波器的方向, 是脊线的频率, 表示坐标轴 逆时针旋转角度 , ,和 ,分别是沿着x和y轴的高斯包络常量。原图和图像增强后的效果图
三、骨架提取
图像骨架提取,实际上就是提取目标在图像上的中心像素轮廓,以目标中心为准,对目标进行细化。一般细化后的目标都是单层像素宽度。细化是从原来的图中去掉一些点,但仍要保持原来的形状。实际上是保持原图的骨架。判断一个点P是否能去掉是以8个相邻点的情况来作为判据的,具体判据为:
内部点不能删除
孤立点不能删除
端点不能删除
如果P是边界点,去掉P后,如果连通分量不增加,则P可删除
骨架提取
四、指纹特征提取和表示
本次项目选取的特征是指纹图像的端点和分叉点,特征描述为特征点所处的位置和脊线在特征点处的切线斜率,其中,位置为特征点在图像中的横坐标和纵坐标,端点的切线斜率有1个,分叉点的切线斜率有3个。
端点
若骨架提取后的二值图像的点
为黑色像素,且其八领域有且只有一个黑色像素,其余7个为白色像素,则点 为端点,端点特征的提取和表示算法如下:按上述定义遍历骨架提取后的二值图像的像素点,寻找所有符合定义的端点;
剔除指纹图像边缘的端点,因为采集的指纹存在边缘,边缘的端点不能视为指纹的端点,需要予以剔除。方法是看步骤1得到的端点所在的行和列的某一侧是否全为白色像素,是的话判断为边缘,予以剔除,否则判断为内部端点,予以保留;
沿着端点
所在的脊线,寻找距离端点间隔4个像素点的点 ,若5步之内脊线断裂或遇到分叉点,则将该端点 剔除,该步骤用于剔除孤立点,并为计算端点的切线斜率做准备;由步骤3得到的端点
和间隔4个像素点的点 ,计算脊线的切线斜率,公式如下:
分叉点
若骨架提取后的二值图像的点
为黑色像素,且其八领域有3个黑色像素,其余5个为白色像素,则点 为端点,端点特征的提取和表示算法如下:按上述定义遍历骨架提取后的二值图像的像素点,寻找所有符合定义的分叉点;
按照步骤1有些分叉点在像素级别上能得到2个相互贴近的点,需要剔除其中一个。如我们得到下图2个分叉点,在宏观上其实是同一个。项目中剔除原则是邻域黑像素相互贴近的分叉点,所以下图剔除掉第一个,保留第二个;
像素级别上相互贴近的两个分叉点
沿着端点
所在的3条脊线,分别寻找距离端点间隔4个像素点的3个点 ,若5步之内脊线断裂或遇到分叉点,则将该端点 剔除,为计算端点的切线斜率做准备;由步骤3得到的端点
和间隔4个像素点的3个点 ,计算分叉点的3条脊线的切线斜率,公式如下:
五、最终效果图
推荐阅读
(点击标题可跳转阅读)
通俗易懂之最小二乘法(附matlab和python例子实现)
老铁,三连支持一下,好吗?↓↓↓
点分享
点点赞
点在