Python图像处理【17】指纹增强和细节提取

指纹增强和细节提取

    • 0. 前言
    • 1. 形态学操作基础
    • 2. 利用形态学操作进行指纹增强
    • 3. 从增强指纹中提取特征(细节)
      • 3.1 指纹细节概念
      • 3.2 提取指纹细节
    • 小结
    • 系列链接

0. 前言

指纹识别和验证是最古老,最流行和广泛使用的生物特征技术。众所周知,每个人都有独特且不变的指纹,指纹是指尖表面上的凸起 (ridges,也称脊线)和凹陷 (valleys,也称谷线)的模式图案。由于大多数自动指纹识别系统都是基于被称为细节 (minutiae) 的局部凸起特征,准确地标记细节并拒绝虚假的标记非常重要。但是,由于皮肤和印模条件的变化,指纹图像质量下降和损坏。因此,需要在细节提取之前采用图像增强技术。自动指纹匹配的关键步骤是从输入指纹图像中可靠地提取细节。
在本节中,我们将首先使用带有噪声的二值指纹图像利用数学形态操作来实现指纹增强技术。然后,我们将介绍如何从预处理的指纹图像中提取细节。

1. 形态学操作基础

形态图像处理是指与图像特征形状(即形态学)相关的一组非线性操作的应用。这些操作特别适合处理二值图像,在二值图像中像素表示为 0 (背景,黑色) 或 1 (前景,白色)。
在形态学操作中,使用一个小模板图像的结构元素 (structuring element, SE) 来检测输入图像中的所有可能位置,然后,算法使用集合算子将其与对应像素的邻域进行比较。形态操作测试 SE 是否与相应的邻域相匹配,或者是否与之相交。我们使用 scikit-Image.MorphologyScipy.BDimage 模块的形态学函数来增强指纹图像,所采用的形态学操作如下:
基本形态学操作:

  • 侵蚀 A ⊖ B = { z ∣ ( B ) z ⊆ A } A\ominus B=\{z|(B)_z\subseteq A\} AB={z(B)zA}
  • 膨胀 A ⊕ B = { z ∣ ( B ^ ) z ∩ A ≠ Φ } A\oplus B=\{z|(\hat B)_z \cap A ≠ \Phi \} AB={z(B^)zA=Φ}

组合形态学操作:

  • 开运算 A ∘ B = ( A ⊖ B ) ⊕ B A\circ B=(A\ominus B)\oplus B AB=(AB)B
  • 闭运算 A ∙ B = ( A ⊕ B ) ⊖ B A\bullet B=(A\oplus B)\ominus B AB=(AB)B

其中 A A A 表示二值图像, B B B 表示结构元素,形态学的开运算和闭运算可以顺序地用于从二值图像中去除噪声(小前景对象),可以将其用于指纹图像增强的预处理步骤。

2. 利用形态学操作进行指纹增强

在本节中,我们将从带有噪声的指纹图像开始,然后使用二值形态学算子(例如开运算、闭运算和骨架化)增强图像,指纹增强函数在实际应用中更加复杂,其中涉及到图像处理中的许多步骤,在本节中,我们旨在介绍基本的指纹增强技术。

(1) 首先导入所需的库和模块:

from skimage.io import imread
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pylab as plt
from skimage.morphology import binary_opening, binary_closing, skeletonize, square
from scipy.ndimage import morphological_gradient
from skimage.filters import threshold_otsu
def plot_image(image, title=None, sz=10):plt.imshow(image)plt.title(title, size=sz)plt.axis('off')

(2) 首先,使用阈值技术将灰度输入图像转换为二值图像,使用固定阈值 0.5 来对图像进行二值化处理(我们也可以使用 OTSU 等最佳阈值算法来自动获得阈值)。在形态学闭运算之后执行开运算可以在带有噪声的二值指纹输入图像中去除小前景对象,即噪声对象。使用骨架化和形态学梯度,可以进一步增强输出图像:

im = rgb2gray(imread('fingerprint.jpg'))
im[im <= 0.5] = 0 # binarize
im[im > 0.5] = 1
im_o = binary_opening(im, square(2))
im_c = binary_closing(im, square(2))
im_oc = binary_closing(binary_opening(im, square(2)), square(3))
im_s = skeletonize(im_oc)
im_g = morphological_gradient(im_oc.astype(np.uint8), size=(2,2))
plt.imsave('fingerprint_input.jpg', im_s, cmap='gray')

(3) 绘制二值输入噪声图像以及通过对输入应用单个或一系列形态学操作获得的增强输出图像:

plt.figure(figsize=(20,12))
plt.gray()
plt.subplot(231), plot_image(im, 'original')
plt.subplot(232), plot_image(im_o, 'opening')
plt.subplot(233), plot_image(im_c, 'closing')
plt.subplot(234), plot_image(im_oc, 'opening + closing')
plt.subplot(235), plot_image(im_s, 'skeletonizing')
plt.subplot(236), plot_image(im_g, 'morphological gradient')
plt.show()

指纹增强

3. 从增强指纹中提取特征(细节)

3.1 指纹细节概念

由于其独特性、紧凑性和兼容性,基于细节的表示已成为最广泛采用的指纹表示方案。指纹的独特性仅由局部凸起特征及其关系决定。指纹交替的凸起和凹陷,沿恒定的局部方向流动。两个最突出的局部凸起特征如下:

  • 凸起终点 (Ridge ending)
  • 凸起分叉 (Ridge bifurcation)

凸起终点定义为凸起突然结束的点,而凸起分叉定义为凸起分叉或分叉成分枝凸起的点,这些特征统称为细节 (minutiae)。细节模板即使被泄漏也并不会导致严重后果,因为根据细节重建灰度图像十分困难。
大多数指纹提取和匹配技术都将特征集限制在两种类型的细节上,即凸起终点和凸起分叉。高质量的指纹通常包含约 40-100 个细节,每个细节的凸起终点和凸起分叉类型都有三个属性,即细节点类型、细节点坐标和局部凸起方向 θ θ θ。给定指纹的细节表示,将指纹与数据库进行匹配可以表示为点匹配的问题。匹配问题可以定义为计算查询和参考指纹特征集之间的匹配程度。

3.2 提取指纹细节

在本节中,我们将学习如何从增强的指纹图像中提取凸起终点和凸起分叉特征(即细节)。在本节中,我们将指纹凸起部分表示为黑色线条而非白色线条。

(1) 导入所需的库和模块,实现函数 minutiae_at(),该函数获取二值指纹图像的像素和图像内的坐标 ( i , j ) (i,j) (i,j),并检查该位置的像素的细节类型(凸起终点或凸起分叉):

from PIL import Image, ImageDraw
from skimage.io import imread
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pylab as plt
from skimage.morphology import binary_opening, binary_closing, skeletonize, square
from scipy.ndimage import morphological_gradient
from skimage.filters import threshold_otsu
def plot_image(image, title=None, sz=10):plt.imshow(image)plt.title(title, size=sz)plt.axis('off')
cells = [(-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)]def minutiae_at(pixels, i, j):values = [pixels[i + k][j + l] for k, l in cells]crossings = 0for k in range(0, 8):crossings += abs(values[k] - values[k + 1])crossings /= 2if pixels[i][j] == 1:if crossings == 1:return "ending"if crossings == 3:return "bifurcation"return "none"

(2) 接下来,定义函数 calculate_minutiaes() 以从增强的指纹输入图像中提取细节,使用函数 minutiae_at() 来确定凸起终点/分叉像素,并分别用红色和绿色对它们进行着色。该函数期望凸起是白色的,因此需要首先反转输入图像,然后进行二值化:

def calculate_minutiaes(im):pixels = 255 - np.array(im).Tpixels = 1.0*(pixels > 10)   (x, y) = im.sizeresult = im.convert("RGB")draw = ImageDraw.Draw(result)colors = {"ending" : (150, 0, 0), "bifurcation" : (0, 150, 0)}ellipse_size = 2for i in range(1, x - 1):for j in range(1, y - 1):minutiae = minutiae_at(pixels, i, j)if minutiae != "none":draw.ellipse([(i - ellipse_size, j - ellipse_size), (i + ellipse_size, j + ellipse_size)], outline = colors[minutiae])del drawreturn result 

(3) 用提取的细节绘制输入和输出图像:

im = Image.fromarray(255. - np.array(Image.open('fingerprint_input.jpg').convert("L"))) # covert to grayscale
out = calculate_minutiaes(im)
plt.figure(figsize=(15,12))
plt.gray()
plt.subplot(121), plot_image(im, 'input thinned')
plt.subplot(122), plot_image(out, 'with minutiaes extracted')
plt.show()

细节提取

小结

指纹是人类手指末端指腹上由凹凸的皮肤所形成的纹路,众所周知,指纹具有“各不相同、终生不变”的特性,因此指纹通常可以用于识别人的身份。但是,由于皮肤和印模条件的变化,指纹图像质量会下降和损坏。因此,需要在细节提取之前采用图像增强技术。本节中,我们学习了如何利用形态学操作增强指纹图像,并提取指纹细节。

系列链接

Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪
Python图像处理【13】使用PIL执行图像降噪
Python图像处理【14】基于非线性滤波器的图像去噪
Python图像处理【15】基于非锐化掩码锐化图像
Python图像处理【16】OpenCV直方图均衡化

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

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

相关文章

模型\视图一般步骤:为什么经常要用“选择模型”QItemSelectionModel?

一、“使用视图”一般的步骤&#xff1a; //1.创建 模型(这里是数据模型&#xff01;) tabModelnew QSqlTableModel(this,DB);//数据表 //2.设置 视图的模型(这里是数据模型&#xff01;) ui->tableView->setModel(tabModel); 模型种类&#xff1a; QStringListModel…

SemiDrive E3 打包说明

一、 概述 本文介绍 E3 PAC 打包&#xff0c;编译器生成 bin 文件需要通过打包生成 PAC 包&#xff0c;再通过 SDToolBox 工具将 PAC 包烧写到芯片&#xff0c;PAC 包的物理载体分为 Flash、eMMC、SD&#xff0c;一个 PAC包最多支持 3 个BootPackage&#xff1b;本文主要描述打…

iOS 应用上架指南:资料填写及提交审核

摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南&#xff0c;您将了解到如何填写正确的资料&#xff0c;并顺利通过苹果公司的审核。 引言 在开发iOS应用后&#xff0c;将其…

医院里的管家婆,如何才能把科室的设备设施管理好?

在医院的各个科室中&#xff0c;有一位不可或缺的重要角色&#xff0c;科室的“管家婆”&#xff0c;大事、小事&#xff0c;事事都归她管&#xff0c;她就是护士长。她不仅是护理工作的核心&#xff0c;更是科室设备设施的“管家婆”。管理众多设备和资产&#xff0c;确保其正…

ArcMap实现多行标注

地图标注是地图的重要组成部分&#xff0c;也是地理信息的重要表达方式​。ArcMap的符号化系统为我们添加地图标注提供了方便&#xff0c;但是有时我们却需要添加多行标注&#xff0c;今天我们一起来探索一下ArcMap中两行标注的实现方式​。 首先&#xff0c;我们右击目标图层…

Oracle-探究统计信息收集自动采样AUTO_SAMPLE_SIZE

前言&#xff1a; Oracle数据库进行统计信息收集时&#xff0c;可以通过ESTIMATE_PERCENT参数指定采样方式或者比例&#xff0c;有以下4种指定的方式 1 统计信息收集时不指定值&#xff0c;这时候ESTIMATE_PERCENT值为默认值DBMS_STATS.AUTO_SAMPLE_SIZE&#xff0c;自动采样 …

TXB2 ELISA kit—Enzo Life Sciences ELISA试剂盒

高灵敏、经过充分验证的ELISA试剂盒&#xff0c;3小时内即可得结果 血栓素A2&#xff08;TXA2&#xff09;参与血小板聚集、血管收缩和生殖功能&#xff0c;但在生理条件下的半衰期仅有37秒。血栓素B2&#xff08;TXB2&#xff09;是TXA2非酶水合的稳定产物&#xff0c;因此体内…

Kafka之集群搭建

1. 为什么要使用kafka集群 单机服务下&#xff0c;Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是&#xff0c;在实际工作中使用时&#xff0c;单机搭建的Kafka会有很大的局限性。 ​ 消息太多&#xff0c;需要分开保存。Kafka是面向海量消息设计的&#xff0c;一个T…

数字化转型助力保险业腾飞,国产化安全产品护航高质量发展

近几年&#xff0c;全球贸易和经济受到了巨大冲击&#xff0c;众多贸易企业经营环境面临困难&#xff0c;某保险公司为国内企业提供强有力的保险保障&#xff0c;大大减轻了企业在国际贸易中风险&#xff0c;为国家经济恢复起到关键的作用。2022年&#xff0c;该保险公司承保金…

麒麟Linux安装新版微信的方法

麒麟Linux系统目前有v10和v10sp1&#xff0c;注意&#xff0c;恶趣味的是v10和v10sp1竟然不通用&#xff0c;这导致了一些国产程序出现运行bug,通过系统自带的麒麟商店无法图形界面安装&#xff0c;甚至搜索不到微信等等一系列问题&#xff0c;易用度确实很差。 解决办法也很简…

【一周年创作总结】人生是远方的无尽旷野呀

那一眼瞥见的伟大的灵魂&#xff0c;却似模糊的你和我 文章目录 &#x1f4d2;各个阶段的experience&#x1f50e;大一寒假&#x1f50e;大一下学期&#x1f50e;大一暑假&#x1f50e;大二上学期&#xff08;现在&#xff09; &#x1f354;相遇CSDN&#x1f6f8;自媒体&#…

Go gin框架控制器接收文件

1. 限定文件参数名&#xff08;一般做法&#xff09; func FileController(c *gin.Context) {//取表单中namefile的文件fileHeader, err : c.FormFile("file")//_, fileHeader, err : c.Request.FormFile("file")//这种也行if err ! nil {log.Println(err…

《Spring》--使用application.yml特性提供多环境开发解决方案/开发/测试/线上--方案2

阿丹-有话说&#xff1a; 第二种多环境的配置选择解决方案&#xff0c;这个更加的灵活没在配置方面都选择了一种yml的书写方式。 原理&#xff1a; 在Spring Boot中&#xff0c;spring.profiles.active 属性用于指定当前应用程序应激活哪个环境配置。当Spring Boot应用启动时…

我没有源码有可执行程序exe 带有一个dll库,我怎么调试dll来查看exe转入的参数

如果你只有一个可执行的程序&#xff08;EXE&#xff09;和一个动态链接库&#xff08;DLL&#xff09;&#xff0c;而没有源代码&#xff0c;调试起来会比较复杂。不过&#xff0c;你仍然可以使用一些工具和方法来调试DLL并查看EXE传入的参数。以下是一些步骤和建议&#xff1…

112.Qt中的窗口类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图&#xff1a; 常用的窗口类有3个 在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的…

设计模式——解释器模式

更多内容&#xff0c;前往IT-BLOG 在软件开发中&#xff0c;会遇到有些问题多次重复出现&#xff0c;而且有一定的相似性和规律性。如果将它们归纳成一种简单的表达式&#xff08;例如&#xff1a;正则表达式等&#xff09;&#xff0c;那么这些问题实例将是该表达式的一些句子…

科技创新领航 ,安川运动控制器为工业自动化赋能助力

迈入工业4.0时代&#xff0c;工业自动化的不断发展&#xff0c;让高精度运动控制成为制造业高质量发展的重要技术手段。北京北成新控伺服技术有限公司作为一家集工业自动化产品销售、系统设计、开发、服务于一体的高新技术企业&#xff0c;其引进推出的运动控制产品一直以卓越的…

基于Selenium+Python的web自动化测试框架

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…

海量数据处理数据结构之Hash与布隆过滤器

前言 随着网络和大数据时代的到来&#xff0c;我们如何从海量的数据中找到我们需要的数据就成为计算机技术中不可获取的一门技术&#xff0c;特别是近年来抖音&#xff0c;快手等热门短视频的兴起&#xff0c;我们如何设计算法来从大量的视频中获取当前最热门的视频信息呢&…

Windows下上帝模式的实现

在windows系统上有个特殊模式&#xff0c;那就是上帝模式&#xff0c;几乎包含了windows中所有的快捷方式&#xff0c;有很多小伙伴还不知道&#xff0c;让我们一起来实现这一操作吧&#xff01; 一、首先新建一个文件夹 二、接着将文件夹重命名&#xff0c;命名为以下代码&am…