听百家之言,集百家智慧,站在巨人肩上攀登

本文旨在帮助大家理解指纹识别的机制和一些算法原理,有一个好的理解之后,读者朋友们需要自己做出一些修改,提出自己的想法。
特别说明,本文依据Raffaele教授的workshop整理而成,读者朋友们不要草率复制粘贴作为自己的论文或者报告。

文章目录

  • 指纹的分割
  • 估计局部脊线的方向
  • 计算局部脊线的频率
  • 指纹增强处理
  • 细节点提取
  • 细节点方向计算
  • 基于Minutia Cylinder-Code的指纹特征表征
  • MCC匹配
  • 总结

前两步参考前文1。

指纹的分割

参考前文1。

估计局部脊线的方向

参考前文1。

计算局部脊线的频率

参考前文2。

指纹增强处理

参考前文3。

细节点提取

参考前文4。

细节点方向计算

参考前文4。

基于Minutia Cylinder-Code的指纹特征表征

Minutia Cylinder-Code (MCC) 是指纹里面,最最最有名的指纹特征表征。MCC发表在IEEE tPAMI,影响非常大。感兴趣可以查询原文,本文不再解释(后面有机会可以详细介绍一下MCC):

Minutia Cylinder-Code: a new representation and matching technique for fingerprint recognition", IEEE tPAMI 2010

总结起来:

  • MCC为最为有名的细节点匹配方法
  • MCC提出了一种基于三维数据结构的圆柱编码算法,其从细节的距离和角度出发,构造了圆柱编码
  • 为一种多级的指纹匹配方法,其不仅使用了细节点特征也使用了方向场等特征
  • 是一种局部结构,也是3D结构

以下是代码:

# Compute the cell coordinates of a generic local structure
# 计算
mcc_radius = 70
mcc_size = 16g = 2 * mcc_radius / mcc_size
x = np.arange(mcc_size)*g - (mcc_size/2)*g + g/2
y = x[..., np.newaxis]
iy, ix = np.nonzero(x**2 + y**2 <= mcc_radius**2)
ref_cell_coords = np.column_stack((x[ix], x[iy]))
mcc_sigma_s = 7.0
mcc_tau_psi = 400.0
mcc_mu_psi = 1e-2def Gs(t_sqr):"""Gaussian function with zero mean and mcc_sigma_s standard deviation, see eq. (7) in MCC paper"""return np.exp(-0.5 * t_sqr / (mcc_sigma_s**2)) / (math.tau**0.5 * mcc_sigma_s)def Psi(v):"""Sigmoid function that limits the contribution of dense minutiae clusters, see eq. (4)-(5) in MCC paper"""return 1. / (1. + np.exp(-mcc_tau_psi * (v - mcc_mu_psi)))
# n: number of minutiae
# c: number of cells in a local structurexyd = np.array([(x,y,d) for x,y,_,d in valid_minutiae]) # matrix with all minutiae coordinates and directions (n x 3)# rot: n x 2 x 2 (rotation matrix for each minutia)
d_cos, d_sin = np.cos(xyd[:,2]).reshape((-1,1,1)), np.sin(xyd[:,2]).reshape((-1,1,1))
rot = np.block([[d_cos, d_sin], [-d_sin, d_cos]])# rot@ref_cell_coords.T : n x 2 x c
# xy : n x 2
xy = xyd[:,:2]
# cell_coords: n x c x 2 (cell coordinates for each local structure)
cell_coords = np.transpose(rot@ref_cell_coords.T + xy[:,:,np.newaxis],[0,2,1])# cell_coords[:,:,np.newaxis,:]      :  n x c  x 1 x 2
# xy                                 : (1 x 1) x n x 2
# cell_coords[:,:,np.newaxis,:] - xy :  n x c  x n x 2
# dists: n x c x n (for each cell of each local structure, the distance from all minutiae)
dists = np.sum((cell_coords[:,:,np.newaxis,:] - xy)**2, -1)# cs : n x c x n (the spatial contribution of each minutia to each cell of each local structure)
cs = Gs(dists)
diag_indices = np.arange(cs.shape[0])
cs[diag_indices,:,diag_indices] = 0 # remove the contribution of each minutia to its own cells# local_structures : n x c (cell values for each local structure)
local_structures = Psi(np.sum(cs, -1))

可以可视化看以下计算出来的MCC是什么样子的,这个真的是很棒呀,可以清楚的看大细节点之间的关系。

@interact(i=(0,len(valid_minutiae)-1))
def test(i=0):show(draw_minutiae_and_cylinder(fingerprint, ref_cell_coords, valid_minutiae, local_structures, i))

MCC匹配

MCC匹配在18年本人也曾发文分析过,请看minutia cylinder code MCC lSSR 匹配算法。

在这一些列博文教程中,我们从一张指纹图片开始,得到了细节点,以及他们的MCC表征

我们可以打印输出相关的信息:

print(f"""Fingerprint image: {fingerprint.shape[1]}x{fingerprint.shape[0]} pixels
Minutiae: {len(valid_minutiae)}
Local structures: {local_structures.shape}""")

输出:

Fingerprint image: 256x364 pixels
Minutiae: 52
Local structures: (52, 208)

我们重命名一下:

f1, m1, ls1 = fingerprint, valid_minutiae, local_structures

我们取另外一个指纹(提取保存好的):

ofn = 'samples/sample_1_2' # Fingerprint of the same finger
#ofn = 'samples/sample_2' # Fingerprint of a different finger
f2, (m2, ls2) = cv.imread(f'{ofn}.png', cv.IMREAD_GRAYSCALE), np.load(f'{ofn}.npz', allow_pickle=True).values()

两个局部结构r1r_1r1​ 和 r2r_2r2​的相似度可以通过计算他们的欧氏距离来确定:

similarity(r1,r2)=1−∥r1−r2∥∥r1∥+∥r2∥similarity(r_1, r_2) = 1 - \frac {\| r_1 - r_2 \|}{\|r_1\| + \|r_2\|}similarity(r1​,r2​)=1−∥r1​∥+∥r2​∥∥r1​−r2​∥​

以下的代码计算ls1 以及 ls2之间的均一化欧氏距离:

# Compute all pairwise normalized Euclidean distances between local structures in v1 and v2
# ls1                       : n1 x  c
# ls1[:,np.newaxis,:]       : n1 x  1 x c
# ls2                       : (1 x) n2 x c
# ls1[:,np.newaxis,:] - ls2 : n1 x  n2 x c
# dists                     : n1 x  n2
dists = np.sqrt(np.sum((ls1[:,np.newaxis,:] - ls2)**2, -1))
dists /= (np.sqrt(np.sum(ls1**2, 1))[:,np.newaxis] + np.sqrt(np.sum(ls2**2, 1))) # Normalize as in eq. (17) of MCC paper

接下来,我们通过Local Similarity Sort (LSS)比较两个指纹的相似度(可以参考MCC文章查看相似) 。
总而言之,就是选择前p个最高的相似度,然后计算均值作为最终的相似度。

# Select the num_p pairs with the smallest distances (LSS technique)
num_p = 5 # For simplicity: a fixed number of pairs
pairs = np.unravel_index(np.argpartition(dists, num_p, None)[:num_p], dists.shape)
score = 1 - np.mean(dists[pairs[0], pairs[1]]) # See eq. (23) in MCC paper
print(f'Comparison score: {score:.2f}') # 结果0.78

我们也可以可视化检查下:

@interact(i = (0,len(pairs[0])-1), show_local_structures = False)
def show_pairs(i=0, show_local_structures = False):show(draw_match_pairs(f1, m1, ls1, f2, m2, ls2, ref_cell_coords, pairs, i, show_local_structures))

总结

本文使用python实现了MCC和MCC的匹配,最后计算出不同指纹的相似度。

Charles@Shenzhen, 20210304,夜

2021WSB-day2-4: Raffaele教授演示利用OpenCV和Python实现一个指纹识别系统 (含代码) part6相关推荐

  1. 2021WSB-day2-4: Raffaele教授演示利用OpenCV和Python实现一个指纹识别系统 (含代码) part5

    听百家之言,集百家智慧,站在巨人肩上攀登 本文旨在帮助大家理解指纹识别的机制和一些算法原理,有一个好的理解之后,读者朋友们需要自己做出一些修改,提出自己的想法. 特别说明,本文依据Raffaele教授 ...

  2. 利用OpenCV和Python实现一个指纹识别系统总目录

    听百家之言,集百家智慧,站在巨人肩上攀登 本文旨在帮助大家理解指纹识别的机制和一些算法原理,有一个好的理解之后,读者朋友们需要自己做出一些修改,提出自己的想法. 特别说明,本文依据Raffaele教授 ...

  3. 利用PYTHON编写人脸表情识别系统

    最近闲来无事,和一个学妹完成了一个SRT,主要是关于元宇宙什么的,不过我在其中主要的工作是用python写一个人脸识别系统,发到这里和大家分享一下 注:我利用了几个包,包括opencv,dlib,nu ...

  4. python如何实现找图_利用OpenCV和Python实现查找图片差异

    使用OpenCV和Python查找图片差异 flyfish 方法1 均方误差的算法(Mean Squared Error , MSE) 下面的一些表达与<TensorFlow - 协方差矩阵&g ...

  5. 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

    作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...

  6. python用opencv计算汽车间距_计算机视觉:利用OpenCV和Python进行车辆计数详细步调...

    本教程我将分享几个简单步调剂释如何使用OpenCV进行Python对象计数. 需要安装一些软件: Python 3OpennCV 1.了解Opencv从摄像头获得视频的Python脚本 import ...

  7. Opencv基于改进VGG19的表情识别系统(源码&Fer2013&教程)

    1.研究背景 在深度学习中,传统的卷积神经网络对面部表情特征的提取不充分以及计算参数量较大的问题,导致分类准确率偏低.因此,提出了一种基于改进的VGG19网络的人脸表情识别算法.首先,对数据进行增强如 ...

  8. NVIDIA专家实战演示,教你快速搭建基于Python的车辆信息识别系统

    主讲人 | 何琨 英伟达 量子位编辑 | 公众号 QbitAI 随着智慧城市.自动驾驶的快速落地,车辆的检测和识别应用场景非常广泛,如车牌识别.车流统计.车辆属性识别等. 近日,在英伟达x量子位发起的 ...

  9. Opencv多语言自然场景文本识别系统(源码&教程)

    1. 研究背景 人类在自然场景中可以快速定位并识别看到的文字信息,但是想要计算机做到和人类一样是比较困难的.开发人员一直想要让机器也能识别图像中的文字信息.当然,对于自然场景来说,图像中的信息复杂甚至 ...

  10. OpenCV与图像处理学习十一——分水岭算法(含代码)

    OpenCV与图像处理学习十一--分水岭算法(含代码) 一.分水岭算法概要 二.分水岭算法步骤 三.代码应用 一.分水岭算法概要 任意的灰度图像可以被看做是地质学表面,高亮度的地方是山峰,低亮度的地方 ...

最新文章

  1. 父亲节遇上端午节,你难道不回家吗?
  2. devkit_如何使用NodeMCU Devkit和Firebase数据库开始物联网
  3. patch成为了ALL You Need?挑战ViT、MLP-Mixer的简单模型来了
  4. PHP在函数体中传递与接收参数
  5. [蓝桥杯][2017年第八届真题]小计算器(模拟)
  6. neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集
  7. linux下比较文件并输出,Linux使用diff命令比较文件的方法
  8. 基于OpenCV的计算机视觉入门(2)图片几何变换入门
  9. 京香julia_百度百科
  10. 第三次面试题目 (反省中!!)
  11. linux网络打印机设置,linux下怎么使用网络打印机
  12. oeasy教您玩转vim - 43 - # 替换模式
  13. 带你撸一台免费云服务器
  14. background简写方式
  15. Codeforces Round #469(Div.1 D) (Div. 2 F)Curfew(贪心)
  16. 远程桌面 - linux
  17. shiro权限控制登陆成功页面跳转问题
  18. 蚂蚁金服区块链创新大赛
  19. 给新程序员的10条建议
  20. URL伪静态。SEO中理解伪静态

热门文章

  1. 华林SAP论坛(华林自建的SAP论坛)
  2. 曾经决心永不做游戏 但为何阿里巴巴的游戏之心一直死不了?
  3. 网站换服务器 备案,网站换服务器备案吗
  4. Win11系统桌面状态栏电池图标不显示怎么办?
  5. c语言rank函数使用实例,rank函数实例(1)
  6. SpringBoot2 学习5集成Thymeleaf
  7. 注销的计算机管理员如何恢复,十分钟后如何注销用户?Power Manager是这样做的!...
  8. [安洵杯 2019]easy_web
  9. linux 云锁 端口,问一下,云锁安装后还可以修改端口吗?
  10. 川希:精准引流的本质,被动涨粉的秘密。