数字图像处理课设--基于Matlab的指纹识别系统

详细流程设计

5.1图像预处理

图像预处理是对原始图像进行的一种前期处理,方便后续的模块识别。无论采用何种方式获取的指纹图像, 都有一部分由于质量原因, 不能被系统直接识别,因此图像的预处理就显得非常有必要。指纹图像预处理的目的就是将自己感兴趣的目标区域保留下来,去除背景区域和没有用的部分,同时根据指纹目标区域中脊线的结构特征,采取较好的滤波方法,提高指纹脊线清晰度,平滑脊线边缘的毛刺和空洞,抑制图像噪声,保证指纹特征的可靠提取,并使灰度图像转化成黑白的二值图像,最终得到脊线结构清晰的单像素宽的二值图像。我们设计了tuxiangyuchuli函数定义预处理的实现。

5.1.1指纹图像的采集

由于本次课设重点是对指纹图像进行处理得到匹配结果,因此指纹图像的获取采用上网下载图片的方式得到。指纹图像的采集可以借助市面上的指纹采集器货得,或者自行利用手机和数码相机等拍摄器材采集。

5.1.2灰度处理

将彩色图转化成为灰度图的过程称为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255个中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其中一个像素点的变化范围为255种,所以在数字图像处理中一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫做灰度值。因此,灰度图像每个像素只需一个字节存放灰度值,灰度范围为0-255。

这个功能的实现调用了MATLAB中的库函数rgb2gray,对载入指纹图像进行灰度图像转化的处理,调用格式为:I=rgb2gray(image),其中image为彩色图像,I为处理后的灰度图像。

5.1.3二值化处理

二值化就是将图像上的像素点的灰度值设置为0或1,也就是将整个图像呈现出明显的黑白视觉效果。由于采集到的指纹图像一般都有比较清晰的方向场,方向场估计的准确与否直接决定了图像二值化算法的效果。为估计方向场,我们把指纹脊线的走向分为如下图所示的8个方向。

图3 一个像素处的8个指纹脊线方向

对分割后的图像进行均值滤波,然后对图像的每一个像素,为确定在该像素处的脊线方向,在以该像素为中心的9*9窗口内,分别计算8个方向上的经过处理后的灰度值,即将上图中数字1到8的位置的像素灰度值去除其中最大summax和最小值summin,若满足最大的summax和最小的summin与 4*I(x,y))之和大于 (3*summ/8),则该像素点的脊线方向为summin,否则为summax。确定完脊线方向后再由该方向场对图像进行二值化。

5.1.4细化处理

二值化处理后,脊线仍然有一定的宽度,指纹识别的匹配是只利用图像的点或线的特征,这些点或者特征只与脊线的走向或者纹理有关系,有一定宽度的二值化图像显得有些多余,所以需要对二值化图像进行细化处理。指纹二值化图像经过细化处理即可得到一个单一像素宽度的脊线,经过上述的细化处理,在后续的指纹特征提取和特征匹配的算法中大大的减少了计算的冗余量和出错率,使得指纹识别的速度和准确度有了很大的提高。细化目的是在不破坏指纹图像连通性的情况下去除掉多余的像素点,将二值化的指纹图像的脊线采用逐层剥离的方法,将图像中的指纹脊线细化成单像素宽。这个功能的实现调用了matlab库函数bwmorph,调用格式为:BW2 = bwmorph(BW,operation,n)应用形态学操作n次,n可以是Inf,这种情况下该操作被重复执行直到图像不再发生变化为止。当n = Inf时,减薄目标成线。没有孔洞的目标缩成最低限度的连通边,有孔洞的目标缩成连通环。

5.2 特征点提取

5.2.1提取指纹的端点和交叉点

端点和交叉点均是指纹图像的两个细节特征,同时在指纹识别的的过程中起着重要的作用,因为识别的首要前提就是找到图像的所有端点和交叉点。通过point.m函数来找出细化后指纹图像的所有端点及交叉点。

将八邻域中的每个点依次两两相减并取其绝对值,后将所有结果加起来,因为端点处是两个点,即和为2时细化图像有端点,和为6时图像特征为交叉点。

运行完上面的point.m函数的程序后,能把细化图像的的端点和交叉点全部找出。在定义函数的程序中有数组txy,其中t为横坐标,x为纵坐标,y为2时为端点,y为6时为交叉点。

5.2.2找特征点

设置三个函数来找出图像的特征点:

(1)single_point函数

 经过去除边缘端点的操作后进一步减少了指纹细化图像中的端点和交叉点的个数。下面就需要找出一些在细化图像中比较独特的端点来作为识别的特征点。在一幅细化的指纹图像中,如果在一个像素(该像素为端点)的周围半径为r(r为像素的个数)的圆内没有任何的端点或者交叉点,那么随着r的逐渐增大,这样的点就会越来越少,因此该点也就越来越独特。于是我们设计了一single_point函数来找出这样独特的点。

(2)walk函数

为了进一步找出特征点,我们还需定义一walk函数,它的主要作用就是判断某一端点在num的距离内是否还有其他的端点。

(3)last1函数

single_point函数和walk函数都是找细化图像特征点的函数,因此可以设计另一个新的last1函数,通过执行[pxy3,error2]=last1(thin,r,txy,num)可以找出一端点以r为半径的像素内的任何端点和交叉点且沿着脊线走向的num内没有任何的其他端点和交叉点。

图4 指纹特征点细节图

5.3去伪

对脊线进行光滑处理,找到每个端点,使其沿着纹线的方向移动5个像素,如果在5个像素之内遇到交叉点,则认为此端点为毛刺,去除此点。同时可以看出,指纹图像细化的边缘,由于采集仪器不同的关系,因此不可避免的会多出很多的端点,这些端点不仅增加了后续的工作量,还可能导致识别过程中产生错误,所以要把这些边缘的端点都去除,在matlab中这些操作都可以采用一函数来实现,本实验中设计了guanghua.m和cut.m函数来进行处理。

图5 去除图像边缘的端点细节图

5.4特征点匹配

由上文的函数可知,已经找出了指纹细化图像中的特征点,并画出了一段独特的脊线,在图像中用红色来标示。下面就是指纹匹配的问题了,在此我们设置了三层匹配。

(1)脊线长度匹配

对于上面的函数即可找出细化图像中的特征点和一段脊线,沿着该段脊线走向,每隔五个像素测量一下,看到到原始端点的距离,此段距离由juli函数得到。

函数结果会得到一数组(内有脊线的长度信息)。如果两幅指纹细化图像中的纹路是相同的,则它们就包含相同的端点和交叉点及用juli函数找出的相同的一段脊,则这两个指纹图像中的长度数组对应的位置比例会基本相等(我们选择的指纹图像大小基本相等,因此该比例选1),因此函数最终定义了一个数f=(sum(abs((d1./d2)-1))),其中若f的值越接近于0,这两幅图像的匹配度就越高,在一定范围的阈值内我们可以认定为匹配。

(2)三角形边长匹配

找到一个指纹细化图像的特征点后,可以找出距离这个端点距离最近的两个端点或者交叉点,与这个指纹图像细化的特征点构成一个三角形,若两幅图像中的边长比例基本相等(原理同上,也选1),则说明这两幅图像匹配,越接近于1说明这两幅指纹图像越匹配。其中设置一find_point函数来找出距离最近的端点或交叉点。

函数最后定义了一个数ff=(sum(abs((dd1./dd2)-1))),因此ff值越接近于0,这两幅指纹图像的匹配度越高,在一定范围的阈值内我们可以认定为匹配。

(3)点类型匹配

找到一个指纹细化图像的特征点后,在该端点周围找到四十个端点或者交叉点,统计在这四十个特征点中端点的个数和交叉点的个数。若有两幅指纹细化图像中的端点所占的比例近似相同,则两幅图像相匹配,越近似,则越相同。函数最终定义了一个数fff=abs(f11-f21)/(f11+f12),所以fff值越接近于0,这两幅指纹图像的匹配度就会越高。我们也设定一阈值,在此阈值内都可以认定为匹配。

本文中取r=8,num=60,经过试验,得到f的阈值为0.5,ff的阈值为1.5,fff的阈值为0.2。即两幅图像的f,ff,fff若均小于阈值,则两幅图匹配;若三个值中有至少一个值大于阈值,则不匹配。

选择两个指纹验证,结果如下:

图6 阈值输出结果

通过以上的f,ff,fff和阈值的比较说明选择的两个指纹图像匹配,为同一手指的指纹。

完整代码链接

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值