飞道的博客

基于MATLAB的指纹识别算法仿真实现

324人阅读  评论(0)

目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

       在指纹图像预处理部分,论文对预处理的各个步骤包括规格化、图像分割、中值滤波、二值化、细化等以及各个步骤的方法进行了深入的分析和研究,选择了一种图像预处理方案。在指纹特征提取部分,采用基于Matlab实现的指纹细节特征提取方法,并给出了去伪算法。指纹特征提取是从细化后的指纹图中得到细节特征点(即端点和分叉点),此特征点含有大量的伪特征,既耗时又影响匹配精度。采用了边缘去伪和距离去伪,使得特征点去伪前后减小了近1/3,然后提取可靠特征点信息,以便实现指纹匹配。

      指纹识别技术是指使用取像设备读取指纹图像,通过识别软件提取出指纹图像中的特征数据,然后根据匹配算法得到的结果鉴别指纹所有人身份的生物特征识别技术。

       指纹识别系统主要涉及三大步骤:指纹图像预处理、特征提取、特征匹配三个部分,其中预处理部分又可分为归一化、图像滤波增强、二值化和细化等几个步骤。系统流程框图如图1-1所示。下面对这三个个部分做一下简单的介绍。

        指纹图像处理中物体的形状信息是十分重要的,为了提取指纹图像特定区域的特征,对指纹图像通常需要采用细化算法处理,得到与原来指纹图像形状近似的由简单的弧或曲线组成的图形,这些细线处于物体的中轴附近,这就是所谓的指纹图像的细化。

      细化方法不同,细化结果就有差异。在指纹识别中要求在不改变原来指纹图像的拓朴连通性的同时,细化的结果应为严格的八邻域图像骨架;纹线中除去特征点以外,每个像素均只与相邻两个像素为八邻域,抹去任意一像素都将破坏纹线的连接性。概括起来说就是纹线细化处理要满足收敛性、连接性、拓朴性、保持性、细化性、中轴性、快速性的要求。目前为止,关于细化方法的研究工作已有很多成果,所采用的方法从使用的观点来看,比较多的是采用模板匹配的方法(如迭代法、OPTA单连通法等)。这种方法是根据某个像素的局部邻域(如3×3,5×5等)的图像特征对其进行处理,此外也有采用边缘搜索编码、外轮廓计算以及神经网络等细化方法。从处理的过程来看,主要可以分为串行和并行两类,前者对图像中当前像素处理依据其邻域内像素的即时化结果,且不同的细化阶段采用不同的处理方法;后者对当前的像素处理该像素及其邻域内各像素的前一轮 

迭代处理的结果,自始至终采用相同的细化准则。

       对于任意形状的区域,细化实质上是腐蚀操作的变体,细化过程中要根据每个像素点的八个相邻点的情况来判断该点是否可以剔除或保留。

        细节特征提取的方法分为两种:一种是从灰度图像中提取特征,另一种是从细化二值图像中提取特征。直接从灰度图像中提取特征的算法一般是对灰度指纹纹线进行跟踪,根据跟踪结果寻找特征的位置和判断特征的类型。这种方法省去了复杂的指纹图像预处理过程,但是特征提取的算法却十分复杂,而且由于噪声等因素影响,特征信息(位置、方向等)也不够准确。目前大多数系统采用第二种方法,从细化二值图像中提取特征,该方法比较简单,在得到可靠的细化二值图像后,只需要一个3×3的模板就可以将端点和分叉点提取出来。

        特征点提取的好坏将直接影响匹配的结果。现实中,指纹输入时,由于汗渍、干燥、按压力度不同等影响,得到的指纹图像大都含有断纹、褶皱、模糊、灰度不均匀等质量问题,虽然经过预处理,图像质量会有所改观,但预处理算法对各个指纹的适应性和有效性也会不同,并且会引入新的噪声,因此得到的细化二值图像往往含有大量的伪特征点。伪特征点不仅会影响匹配的速度,严重的会影响整个识别的正确率。所以提取特征点后要进行去伪处理,尽可能滤除伪特征点、保留真特征点。实践中发现,伪特征点的数量一般占总特征数量的一半以上,所以去伪是必不可少的过程。去伪过程可以在两个阶段进行:一是在特征提取之前对细化二值图像进行平滑、去除毛刺、连接断纹等操作,然后提取特征作为真特征;另一种是在特征提取之后,根据特征之间的相互关系,尽可能准确的识别伪特征点并滤除它们。前者直接对图像进行修补,操作比较复杂,容易引入新的伪特征;后者对特征提取后的数据进行判断,识别比较麻烦,但是速度较快本文采用第二种方法,即从已提取的特征点中滤除伪特征,保留真特征。

二、核心程序


  
  1. clc;
  2. clear all;
  3. close all;
  4. warning off;
  5. %读取图片
  6. %注意,为了和论文中的结果对应起来,我们使用论文中的图片进行代码的测试
  7. I=imread( 'images.jpg');
  8. if isrgb(I) == 1
  9. I = rgb2gray(I);
  10. else
  11. I = I;
  12. end
  13. I_tmp = I;
  14. figure;
  15. subplot( 121);
  16. imshow(I);
  17. %图像预处理,去噪滤波
  18. I = medfilt2(I,[ 3, 3]);%进行中值滤波;
  19. subplot( 122);
  20. imshow(I);
  21. %背景分割
  22. %图像二值化处理
  23. %首先进行归一化
  24. I=norms(I, 120, 600);
  25. figure;
  26. %为了显示处理效果,需要数据类型转换
  27. subplot( 121);
  28. imshow(double(I));
  29. Ker = 8;
  30. [m,n] = size(I);
  31. m1 = m/Ker;
  32. n1 = n/Ker;
  33. for i= 1 :m1
  34. for j= 1 :n1
  35. %设定门限
  36. t=mean2(I((i- 1)*Ker+ 1 :(i- 1)*Ker+Ker,(j- 1)*Ker+ 1 :(j- 1)*Ker+Ker));
  37. for k=(i- 1)*Ker+ 1 :(i- 1)*Ker+Ker
  38. for l=(j- 1)*Ker+ 1 :(j- 1)*Ker+Ker
  39. if I(k,l) < t
  40. I(k,l)= 1;
  41. else
  42. I(k,l)= 0;
  43. end
  44. end
  45. end
  46. end
  47. end
  48. %为了显示处理效果,需要数据类型转换
  49. subplot( 122);
  50. imshow(double(I));
  51. %异常点的处理
  52. for i= 1 :m
  53. for j= 1 :n
  54. if I(i,j)> 1
  55. I(i,j)= 0;
  56. end
  57. end
  58. end
  59. for i= 1 :m
  60. for j= 1 :n
  61. if I(i,j)== 1
  62. for k= 1 :j
  63. I(i,k)= 1;
  64. end
  65. break;
  66. end
  67. end
  68. end
  69. for i= 1 :m
  70. for j= n:- 1 : 1
  71. if I(i,j)== 1
  72. for k= n:- 1 :j
  73. I(i,k)= 1;
  74. end
  75. break;
  76. end
  77. end
  78. end
  79. for i= 1 :m
  80. for j= 1 :n
  81. if I(i,j)== 1
  82. I(i,j)= 0;
  83. else
  84. I(i,j)= 1;
  85. end
  86. end
  87. end
  88. figure;
  89. %为了显示处理效果,需要数据类型转换
  90. imshow(double(I));
  91. %对细化前的图像进行维纳滤波
  92. figure;
  93. subplot( 121);
  94. imshow(double(I));
  95. I=wiener2(I,[ 3 3]);
  96. subplot( 122);
  97. imshow(double(I));
  98. %以下为细化处理
  99. [r,c] = size(I);
  100. for i1= 1 :r;
  101. for j1= 1 :c
  102. if (I(i1,j1)== 1)
  103. I(i1,j1)= 255;
  104. I2 = I;
  105. end
  106. end
  107. end
  108. y = thinning( I2);
  109. figure;
  110. imshow(y);
  111. %以上的代码是你之前的第三章的代码的仿真图
  112. %以下的代码是对应第四章的仿真图
  113. %首先需要提取指纹图像的中心点——对应论文的“图 4- 1提取中心点后的细化图像”
  114. [ XC, YC] = find_central_point(y);
  115. %找寻细化图像的特征点
  116. %特征点的建立——对应论文的“图 42特征点提取后的图像”
  117. [dpx3,dpy3,dpcount3,fpx3,fpy3,fpcount3]=characterpoint(y);
  118. figure;
  119. imshow(y);
  120. hold on;
  121. plot(dpy3,dpx3, 'o');
  122. hold on;
  123. plot(fpy3,fpx3, '+');
  124. hold on;
  125. plot( XC, YC, '*r');
  126. hold off;
  127. %以下代码是对最后的识别结果和数据库中的进行匹配
  128. %计算每个特征点到中心点的距离,
  129. Dpcount=size(dpx3, 2);
  130. Fpcount=size(fpx3, 2);
  131. for i= 1 :Dpcount
  132. DP_Feature(i)=sqrt((dpx3(i)- YC)^ 2+(dpy3(i)- XC)^ 2);
  133. end
  134. for j= 1 :Fpcount
  135. FP_Feature(j)=sqrt((fpx3(j)- YC)^ 2+(fpy3(j)- XC)^ 2);
  136. end
  137. %计算指纹图像的方向角
  138. theta = func_theta(I_tmp);
  139. %建立待识别的特征库
  140. for i= 1 :Dpcount
  141. PointOfModel(i, 1)= 1;
  142. PointOfModel(i, 2)=DP_Feature(i);
  143. PointOfModel(i, 3)=theta(dpx3(i),dpy3(i))-theta( YC, XC);
  144. end
  145. for i=Dpcount+ 1 :Dpcount+Fpcount
  146. PointOfModel(i, 1)= 2;
  147. PointOfModel(i, 2)=FP_Feature(i-Dpcount);
  148. PointOfModel(i, 3)=theta(fpx3(i-Dpcount),fpy3(i-Dpcount))-theta( YC, XC);
  149. end
  150. %调用database_feature计算得到PointOfMatch
  151. I=imread( 'database/22.tif');
  152. if isrgb(I) == 1
  153. I = rgb2gray(I);
  154. else
  155. I = I;
  156. end
  157. PointOfMatch = database_feature(I);
  158. %调用 MATCH函数进行匹配
  159. %图 4- 3 匹配后的图像
  160. NUM = 90;%这个参数是新加的,设置相似度,即多少个匹配点对上才算成功
  161. Count=match(y,PointOfModel,PointOfMatch,dpx3,dpy3,fpx3,fpy3, NUM);

三、测试结果

边缘保护

 进行适应性去噪过滤处理

 细化处理得到的结果

 二值化图像细化处理,并标注特征点和中心点。特征端点用'o'标注,特征分叉点用'+'标注,中心点用红色'*'标注

 指纹匹配

 

A10-11


转载:https://blog.csdn.net/ccsss22/article/details/127582230
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场